[med-svn] [pbbam] 01/02: Imported Upstream version 0~20150813+git4e9e417

Afif Elghraoui afif-guest at moszumanska.debian.org
Sun Sep 6 22:24:12 UTC 2015


This is an automated email from the git hooks/post-receive script.

afif-guest pushed a commit to branch master
in repository pbbam.

commit 1373631b68a46ba4fa29c34fe94ead4acb2484e2
Author: Afif Elghraoui <afif at ghraoui.name>
Date:   Sun Sep 6 11:46:04 2015 -0700

    Imported Upstream version 0~20150813+git4e9e417
---
 .gitignore                                         |    24 +
 CHANGELOG.md                                       |   135 +
 CMakeLists.txt                                     |   132 +
 INSTALL.md                                         |   114 +
 cmake/FindCSharp.cmake                             |    72 +
 cmake/FindDotNetFrameworkSdk.cmake                 |    29 +
 cmake/FindMono.cmake                               |   167 +
 cmake/FindR.cmake                                  |    48 +
 cmake/UseCSharp.cmake                              |   111 +
 cmake/UseDotNetFrameworkSdk.cmake                  |    16 +
 cmake/UseMono.cmake                                |    16 +
 docs/CMakeLists.txt                                |    11 +
 docs/Doxyfile.in                                   |  1602 +++
 include/pbbam/Accuracy.h                           |    98 +
 include/pbbam/AlignmentPrinter.h                   |    83 +
 include/pbbam/BamFile.h                            |   147 +
 include/pbbam/BamHeader.h                          |   184 +
 include/pbbam/BamReader.h                          |   114 +
 include/pbbam/BamRecord.h                          |  1018 ++
 include/pbbam/BamRecordBuilder.h                   |   268 +
 include/pbbam/BamRecordImpl.h                      |   622 +
 include/pbbam/BamTagCodec.h                        |    75 +
 include/pbbam/BamWriter.h                          |   150 +
 include/pbbam/Cigar.h                              |   116 +
 include/pbbam/CigarOperation.h                     |   226 +
 include/pbbam/Config.h                             |   125 +
 include/pbbam/DataSet.h                            |   218 +
 include/pbbam/DataSetTypes.h                       |   315 +
 include/pbbam/DataSetXsd.h                         |   111 +
 include/pbbam/EntireFileQuery.h                    |    60 +
 include/pbbam/Frames.h                             |   205 +
 include/pbbam/GenomicInterval.h                    |   214 +
 include/pbbam/GenomicIntervalQuery.h               |    72 +
 include/pbbam/GroupQuery.h                         |    88 +
 include/pbbam/GroupQueryBase.h                     |   214 +
 include/pbbam/IndexedFastaReader.h                 |   112 +
 include/pbbam/Interval.h                           |   212 +
 include/pbbam/LocalContextFlags.h                  |    66 +
 include/pbbam/Orientation.h                        |    55 +
 include/pbbam/PbiBuilder.h                         |   121 +
 include/pbbam/PbiFile.h                            |    88 +
 include/pbbam/PbiIndex.h                           |   299 +
 include/pbbam/PbiRawData.h                         |   307 +
 include/pbbam/Position.h                           |    59 +
 include/pbbam/ProgramInfo.h                        |   186 +
 include/pbbam/QualityValue.h                       |   112 +
 include/pbbam/QualityValues.h                      |   233 +
 include/pbbam/QueryBase.h                          |   241 +
 include/pbbam/ReadGroupInfo.h                      |   392 +
 include/pbbam/SamTagCodec.h                        |    58 +
 include/pbbam/SequenceInfo.h                       |   182 +
 include/pbbam/Strand.h                             |    55 +
 include/pbbam/Tag.h                                |   362 +
 include/pbbam/TagCollection.h                      |    58 +
 include/pbbam/UnmappedReadsQuery.h                 |    70 +
 include/pbbam/ZmwGroupQuery.h                      |    67 +
 include/pbbam/ZmwQuery.h                           |    66 +
 include/pbbam/internal/BamRecordSort.h             |   138 +
 include/pbbam/internal/DataSet.inl                 |   197 +
 include/pbbam/internal/DataSetBaseTypes.h          |   174 +
 include/pbbam/internal/DataSetBaseTypes.inl        |   220 +
 include/pbbam/internal/DataSetElement.h            |   186 +
 include/pbbam/internal/DataSetElement.inl          |   371 +
 include/pbbam/internal/DataSetListElement.h        |   118 +
 include/pbbam/internal/DataSetListElement.inl      |   181 +
 include/pbbam/internal/DataSetTypes.inl            |   150 +
 include/pbbam/internal/FilterEngine.h              |    71 +
 include/pbbam/internal/IBamFileIterator.h          |    79 +
 include/pbbam/internal/IMergeStrategy.h            |    67 +
 include/pbbam/internal/MergeItem.h                 |    77 +
 include/pbbam/internal/MergeStrategy.h             |   239 +
 include/pbbam/internal/PbiIndex_p.h                |   931 ++
 include/pbbam/internal/PbiIndex_p.inl              |   927 ++
 include/pbbam/internal/QueryBase.h                 |   218 +
 include/pbbam/internal/SequentialMergeStrategy.h   |    79 +
 include/pbbam/internal/Tag.inl                     |   324 +
 include/pbbam/virtual/VirtualPolymeraseBamRecord.h |   136 +
 include/pbbam/virtual/VirtualPolymeraseReader.h    |   105 +
 include/pbbam/virtual/VirtualRegion.h              |   103 +
 include/pbbam/virtual/VirtualRegionType.h          |    58 +
 include/pbbam/virtual/VirtualRegionTypeMap.h       |    58 +
 src/Accuracy.cpp                                   |    43 +
 src/AlignmentPrinter.cpp                           |   148 +
 src/AssertUtils.cpp                                |    90 +
 src/AssertUtils.h                                  |    93 +
 src/BamFile.cpp                                    |   174 +
 src/BamHeader.cpp                                  |   400 +
 src/BamRecord.cpp                                  |  1785 +++
 src/BamRecordBuilder.cpp                           |   393 +
 src/BamRecordImpl.cpp                              |   426 +
 src/BamTagCodec.cpp                                |   517 +
 src/BamWriter.cpp                                  |   171 +
 src/CMakeLists.txt                                 |    83 +
 src/Cigar.cpp                                      |    70 +
 src/CigarOperation.cpp                             |    76 +
 src/Config.cpp                                     |    48 +
 src/DataSet.cpp                                    |   173 +
 src/DataSetBaseTypes.cpp                           |    94 +
 src/DataSetElement.cpp                             |    47 +
 src/DataSetIO.cpp                                  |   157 +
 src/DataSetIO.h                                    |    73 +
 src/DataSetTypes.cpp                               |   440 +
 src/DataSetUtils.h                                 |    95 +
 src/DataSetXsd.cpp                                 |   132 +
 src/EntireFileQuery.cpp                            |   102 +
 src/FileUtils.h                                    |   132 +
 src/FilterEngine.cpp                               |    76 +
 src/FofnReader.cpp                                 |    52 +
 src/FofnReader.h                                   |    60 +
 src/Frames.cpp                                     |   179 +
 src/GenomicInterval.cpp                            |   131 +
 src/GenomicIntervalQuery.cpp                       |   140 +
 src/GroupQuery.cpp                                 |    91 +
 src/IndexedFastaReader.cpp                         |   219 +
 src/MemoryUtils.cpp                                |    82 +
 src/MemoryUtils.h                                  |   159 +
 src/PbiBuilder.cpp                                 |   255 +
 src/PbiFile.cpp                                    |    87 +
 src/PbiIndex.cpp                                   |   311 +
 src/PbiIndexIO.cpp                                 |   345 +
 src/PbiIndexIO.h                                   |   165 +
 src/PbiRawData.cpp                                 |   444 +
 src/ProgramInfo.cpp                                |   161 +
 src/QualityValue.cpp                               |    43 +
 src/QueryBase.cpp                                  |    48 +
 src/ReadGroupInfo.cpp                              |   525 +
 src/SamTagCodec.cpp                                |   296 +
 src/SequenceInfo.cpp                               |   172 +
 src/SequenceUtils.h                                |   125 +
 src/StringUtils.h                                  |    74 +
 src/Tag.cpp                                        |   101 +
 src/TagCollection.cpp                              |    46 +
 src/TimeUtils.h                                    |    81 +
 src/UnmappedReadsQuery.cpp                         |   133 +
 src/VirtualPolymeraseBamRecord.cpp                 |   288 +
 src/VirtualPolymeraseReader.cpp                    |   113 +
 src/VirtualRegionTypeMap.cpp                       |    49 +
 src/XmlReader.cpp                                  |   154 +
 src/XmlReader.h                                    |    59 +
 src/XmlWriter.cpp                                  |   152 +
 src/XmlWriter.h                                    |    62 +
 src/ZmwGroupQuery.cpp                              |   143 +
 src/ZmwQuery.cpp                                   |   138 +
 src/files.cmake                                    |   152 +
 src/pugixml/pugiconfig.hpp                         |    71 +
 src/pugixml/pugixml.cpp                            | 11525 +++++++++++++++++++
 src/pugixml/pugixml.hpp                            |  1366 +++
 src/swig/Accuracy.i                                |    17 +
 src/swig/AlignmentPrinter.i                        |    11 +
 src/swig/BamFile.i                                 |    21 +
 src/swig/BamHeader.i                               |    28 +
 src/swig/BamRecord.i                               |    33 +
 src/swig/BamRecordBuilder.i                        |    12 +
 src/swig/BamRecordImpl.i                           |    16 +
 src/swig/BamTagCodec.i                             |    11 +
 src/swig/BamWriter.i                               |    18 +
 src/swig/CMakeLists.txt                            |    68 +
 src/swig/Cigar.i                                   |    16 +
 src/swig/CigarOperation.i                          |    49 +
 src/swig/DataSet.i                                 |    17 +
 src/swig/DataSetTypes.i                            |    62 +
 src/swig/EntireFileQuery.i                         |    17 +
 src/swig/Frames.i                                  |    19 +
 src/swig/GenomicInterval.i                         |    11 +
 src/swig/GenomicIntervalQuery.i                    |    15 +
 src/swig/GroupQuery.i                              |    11 +
 src/swig/GroupQueryBase.i                          |    32 +
 src/swig/IndexedFastaReader.i                      |    13 +
 src/swig/Interval.i                                |    12 +
 src/swig/LocalContextFlags.i                       |    11 +
 src/swig/Orientation.i                             |    11 +
 src/swig/PacBio.BAM.csproj.in                      |    37 +
 src/swig/PacBioBam.i                               |   166 +
 src/swig/PbiFile.i                                 |    11 +
 src/swig/PbiIndex.i                                |    18 +
 src/swig/PbiRawData.i                              |    29 +
 src/swig/Position.i                                |    11 +
 src/swig/ProgramInfo.i                             |    15 +
 src/swig/QualityValue.i                            |    20 +
 src/swig/QualityValues.i                           |    17 +
 src/swig/QueryBase.i                               |   127 +
 src/swig/ReadGroupInfo.i                           |    15 +
 src/swig/SamTagCodec.i                             |    11 +
 src/swig/SequenceInfo.i                            |    15 +
 src/swig/Strand.i                                  |    11 +
 src/swig/Tag.i                                     |   130 +
 src/swig/TagCollection.i                           |    13 +
 src/swig/WrapCSharp.cmake                          |    46 +
 src/swig/WrapPython.cmake                          |    54 +
 src/swig/WrapR.cmake                               |    71 +
 src/swig/ZmwGroupQuery.i                           |    14 +
 src/swig/ZmwQuery.i                                |    11 +
 tests/CMakeLists.txt                               |    66 +
 tests/data/aligned.bam                             |   Bin 0 -> 593 bytes
 tests/data/dataset/ali1.xml                        |    35 +
 tests/data/dataset/ali2.xml                        |    35 +
 tests/data/dataset/ali3.xml                        |    35 +
 tests/data/dataset/ali4.xml                        |    35 +
 tests/data/dataset/bam_mapping.bam                 |   Bin 0 -> 169668 bytes
 tests/data/dataset/bam_mapping.bam.bai             |   Bin 0 -> 184 bytes
 tests/data/dataset/bam_mapping.bam.pbi             |   Bin 0 -> 2452 bytes
 tests/data/dataset/bam_mapping_1.bam               |   Bin 0 -> 167530 bytes
 tests/data/dataset/bam_mapping_1.bam.bai           |   Bin 0 -> 184 bytes
 tests/data/dataset/bam_mapping_1.bam.pbi           |   Bin 0 -> 2437 bytes
 tests/data/dataset/bam_mapping_2.bam               |   Bin 0 -> 165778 bytes
 tests/data/dataset/bam_mapping_2.bam.bai           |   Bin 0 -> 184 bytes
 tests/data/dataset/bam_mapping_2.bam.pbi           |   Bin 0 -> 2422 bytes
 tests/data/dataset/bam_mapping_staggered.xml       |    35 +
 tests/data/dataset/barcode.dataset.xml             |    11 +
 tests/data/dataset/ccsread.dataset.xml             |    15 +
 tests/data/dataset/contig.dataset.xml              |    18 +
 tests/data/dataset/fofn.fofn                       |     3 +
 tests/data/dataset/hdfsubread_dataset.xml          |    72 +
 tests/data/dataset/lambda_contigs.fasta            |   156 +
 tests/data/dataset/lambda_contigs.xml              |     2 +
 .../data/dataset/m150430_142051_Mon_p1_b25.sts.xml |     1 +
 .../pbalchemy10kbp.pbalign.sorted.pbver1.bam       |   Bin 0 -> 35251 bytes
 .../pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai   |   Bin 0 -> 632 bytes
 tests/data/dataset/pbalchemy10kbp.xml              |    17 +
 tests/data/dataset/reference.dataset.xml           |    20 +
 tests/data/dataset/subread_dataset1.xml            |    76 +
 tests/data/dataset/subread_dataset2.xml            |    76 +
 tests/data/dataset/subread_dataset3.xml            |    76 +
 .../dataset/transformed_rs_subread_dataset.xml     |    68 +
 tests/data/ex2.bam                                 |   Bin 0 -> 125999 bytes
 tests/data/ex2.bam.bai                             |   Bin 0 -> 176 bytes
 tests/data/ex2.sam                                 |  3310 ++++++
 tests/data/lambdaNEB.fa                            |   608 +
 tests/data/lambdaNEB.fa.fai                        |     1 +
 tests/data/polymerase/internal.polymerase.bam      |   Bin 0 -> 134303 bytes
 tests/data/polymerase/internal.scraps.bam          |   Bin 0 -> 68735 bytes
 tests/data/polymerase/internal.subreads.bam        |   Bin 0 -> 73590 bytes
 tests/data/polymerase/internal_hq.hqregion.bam     |   Bin 0 -> 82035 bytes
 tests/data/polymerase/internal_hq.scraps.bam       |   Bin 0 -> 51450 bytes
 tests/data/polymerase/internal_polymerase.fasta    |     2 +
 tests/data/polymerase/production.polymerase.bam    |   Bin 0 -> 25072 bytes
 tests/data/polymerase/production.scraps.bam        |   Bin 0 -> 13530 bytes
 tests/data/polymerase/production.subreads.bam      |   Bin 0 -> 14655 bytes
 tests/data/polymerase/production_hq.hqregion.bam   |   Bin 0 -> 15796 bytes
 tests/data/polymerase/production_hq.scraps.bam     |   Bin 0 -> 10061 bytes
 tests/data/segfault.bam                            |   Bin 0 -> 262 bytes
 tests/data/temp.bam                                |   Bin 0 -> 125999 bytes
 tests/data/temp.sam                                |  3310 ++++++
 tests/data/test_group_query/group.fofn.in          |     3 +
 tests/data/test_group_query/test1.bam              |   Bin 0 -> 2165 bytes
 tests/data/test_group_query/test2.bam              |   Bin 0 -> 13004 bytes
 tests/data/test_group_query/test2.bam.pbi          |   Bin 0 -> 194 bytes
 tests/data/test_group_query/test3.bam              |   Bin 0 -> 19277 bytes
 tests/data/unmap1.bam                              |   Bin 0 -> 896 bytes
 tests/data/unmap1.bam.bai                          |   Bin 0 -> 72 bytes
 tests/data/unmap2.bam                              |   Bin 0 -> 1344 bytes
 tests/data/unmap2.bam.bai                          |   Bin 0 -> 144 bytes
 tests/files.cmake                                  |    43 +
 tests/src/CSharp/CheckSWIG.cs                      |    15 +
 tests/src/CSharp/TestPbbam.cs.in                   |   119 +
 tests/src/CSharp/buildAssembly.sh.in               |    91 +
 tests/src/CSharp/check_swig.sh.in                  |    18 +
 tests/src/R/check_swig.R.in                        |    58 +
 tests/src/R/test_pbbam.R                           |    23 +
 tests/src/R/test_pbbam.sh.in                       |    45 +
 tests/src/R/tests/test_Accuracy.R                  |    53 +
 tests/src/R/tests/test_BamFile.R                   |    77 +
 tests/src/R/tests/test_BamHeader.R                 |   193 +
 tests/src/R/tests/test_Cigar.R                     |   219 +
 tests/src/R/tests/test_EndToEnd.R                  |   102 +
 tests/src/R/tests/test_Frames.R                    |    95 +
 tests/src/R/tests/test_Intervals.R                 |   340 +
 tests/src/R/tests/test_QualityValues.R             |   113 +
 tests/src/R/tests/utils.R                          |   307 +
 tests/src/TestData.h.in                            |    56 +
 tests/src/python/check_swig.py                     |    44 +
 tests/src/python/test/__init__.py                  |    39 +
 tests/src/python/test/config.py.in                 |    43 +
 tests/src/python/test/test_Accuracy.py             |    65 +
 tests/src/python/test/test_BamFile.py              |    63 +
 tests/src/python/test/test_BamHeader.py            |   157 +
 tests/src/python/test/test_Cigar.py                |   214 +
 tests/src/python/test/test_EndToEnd.py             |    89 +
 tests/src/python/test/test_Frames.py               |    95 +
 tests/src/python/test/test_Intervals.py            |   348 +
 tests/src/python/test/test_QualityValues.py        |   131 +
 tests/src/python/test_pbbam.py                     |    48 +
 tests/src/test_Accuracy.cpp                        |    63 +
 tests/src/test_AlignmentPrinter.cpp                |   102 +
 tests/src/test_BamFile.cpp                         |    69 +
 tests/src/test_BamHeader.cpp                       |   281 +
 tests/src/test_BamRecord.cpp                       |  1993 ++++
 tests/src/test_BamRecordBuilder.cpp                |   274 +
 tests/src/test_BamRecordClipping.cpp               |  1187 ++
 tests/src/test_BamRecordImplCore.cpp               |   613 +
 tests/src/test_BamRecordImplTags.cpp               |   214 +
 tests/src/test_BamRecordImplVariableData.cpp       |  4542 ++++++++
 tests/src/test_BamRecordMapping.cpp                |   541 +
 tests/src/test_BamWriter.cpp                       |   198 +
 tests/src/test_Cigar.cpp                           |   198 +
 tests/src/test_DataSetCore.cpp                     |   482 +
 tests/src/test_DataSetIO.cpp                       |  1281 +++
 tests/src/test_DataSetMetadata.cpp                 |    63 +
 tests/src/test_DataSetQuery.cpp                    |   434 +
 tests/src/test_DataSetXsd.cpp                      |   124 +
 tests/src/test_EndToEnd.cpp                        |   252 +
 tests/src/test_EntireFileQuery.cpp                 |   151 +
 tests/src/test_Frames.cpp                          |    97 +
 tests/src/test_GenomicIntervalQuery.cpp            |   182 +
 tests/src/test_GroupQuery.cpp                      |   149 +
 tests/src/test_IndexedFastaReader.cpp              |   212 +
 tests/src/test_Intervals.cpp                       |   330 +
 tests/src/test_PacBioIndex.cpp                     |   768 ++
 tests/src/test_PolymeraseStitching.cpp             |   352 +
 tests/src/test_QualityValues.cpp                   |   120 +
 tests/src/test_ReadGroupInfo.cpp                   |    61 +
 tests/src/test_SequenceUtils.cpp                   |   141 +
 tests/src/test_Tags.cpp                            |   992 ++
 tests/src/test_TimeUtils.cpp                       |    59 +
 tests/src/test_UnmappedReadsQuery.cpp              |   117 +
 tests/src/test_ZmwQuery.cpp                        |    67 +
 tools/CMakeLists.txt                               |     3 +
 tools/pbindex/CMakeLists.txt                       |    27 +
 tools/pbindex/src/OptionParser.cpp                 |   562 +
 tools/pbindex/src/OptionParser.h                   |   305 +
 tools/pbindex/src/PbIndex.cpp                      |    78 +
 tools/pbindex/src/PbIndex.h                        |    70 +
 tools/pbindex/src/PbIndexVersion.h.in              |    49 +
 tools/pbindex/src/main.cpp                         |   102 +
 324 files changed, 71310 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7f6bd79
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+*.o
+*.pico
+*.so
+*.a
+*.dylib
+*.pyc
+*~
+build/
+lib/
+third-party/htslib/bgzip
+third-party/htslib/htsfile
+third-party/htslib/tabix
+third-party/htslib/test/fieldarith
+third-party/htslib/test/hfile
+third-party/htslib/test/sam
+third-party/htslib/test/test-regidx
+third-party/htslib/test/test-vcf-api
+third-party/htslib/test/test-vcf-sweep
+third-party/htslib/test/test_view
+tests/bin/test_pbbam
+
+# Generated source files
+tests/src/TestData.h
+third-party/htslib/version.h
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..68703c1
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,135 @@
+# PacBio::BAM - change log
+
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/). 
+
+**NOTE:** The current series (0.y.z) is under initial development. Anything may change at any time. 
+The public API should not be considered stable yet. Once we lock down a version 1.0.0, this will 
+define a reference point & compatibility guarantees will be maintained within each major version 
+series.
+
+
+## Active
+
+### Added 
+- BamFile::PacBioIndexExists() & BamFile::StandardIndexExists() - query the existence of index files 
+without auto-building them if they are missing, as in BamFile::Ensure*IndexExists().
+- GenomicInterval now accepts an htslib/samtools-style REGION string in the constructor: 
+GenomicInterval("chr1:1000-2000"). Please note though, that pbbam uses 0-based coordinates throughout, 
+whereas samtools expects 1-based. The above string is equivalent to "chr1:1001-2000" in samtools.
+
+## [0.1.0] - 2015-07-17
+
+### Changed
+- BAM spec v3.0b7 compliance
+ - Removal of 'M' as allowed CIGAR operation. Attempt to use such a CIGAR op will throw an exception.
+ - Addition of IPD/PulseWidth codec version info in header
+  
+### Added
+- Auto-generation of UTC timestamp for DataSet objects
+- PbiBuilder - allows generation of PBI index data alongside generation/modification of BAM record
+data. This obviates the need to wait for a completed BAM, then go through the zlib decompression, etc.
+- Added DataSet::FromXml(string xml) to create DataSets from "raw" XML string, rather than building up 
+using DataSet API or loading from existing file.
+- "pbindex" command line tool to generate ".pbi" files from BAM data. The executable is built by default, 
+but can be disabled using the cmake option "-DPacBioBAM_build_pbindex=OFF".
+  
+### Fixed
+- PBI construction failing on CCS reads
+
+## [0.0.8] - 2015-07-02
+
+### Changed
+- Build system refactoring.
+
+## [0.0.7] - 2015-07-02
+
+### Added
+- PBI index lookup API. Not so much intended for client use directly, but will enable construction of
+  higher-level semantic queries: grouping by, filtering, etc.
+- DataSet & PBI-aware queries (e.g. ZmwGroupQuery). More PBI-enabled queries to follow.
+- More flexibility in tag access. Samtools has a habit of performing a "shrink-to-fit" when it handles
+  integer-valued tag data. Thus we cannot **guarantee** the binary type that our API will have to process.
+  Safe conversions are allowed on integer-like data only. Under- or overflows in casting will trigger an 
+  exception. All other tag data types must be asked for explicitly, or else an exception will be raised, 
+  as before.
+- BamHeader::DeepCopy - allows creation of editable header data, without overwriting all shared instances
+
+### Fixed
+- XSD compliance for DataSet APIs.
+
+### Changed
+- The functionality provided by ZmwQuery (group by hole number), is now available using the ZmwGroupQuery
+  object. The new ZmwQuery returns a single-record iterator (a la EntireFileQuery), but limited to a whitelist 
+  of requested hole numbers.
+
+### Removed
+- XSD non-compliant classes (e.g. ExternalDataReference)
+
+## [0.0.6] - 2015-06-07
+
+### Added
+
+- Accessor methods for pulse bam support:
+ - LabelQV()
+ - AltLabelQV()
+ - LabelTag()
+ - AltLabelTag()
+ - Pkmean()
+ - Pkmid()
+ - PrePulseFrames() only RC, no clipping
+ - PulseCallWidth() only RC, no clipping
+ - PulseCall() case-sensitive RC, no clipping
+ - IPDRaw() to avoid up and downscaling for stitching
+- BamRecord::ParseTagName and BamRecord::ParseTagString to convert a two 
+  character tag string to a TagName enum and back. Allows a switch over tags.
+- VirtualPolymeraseReader to create VirtualPolymeraseBamRecord from a 
+  subreads|hqregion+scraps.bam
+- VirtualRegion represents annotations of the polymerase reads, for adapters, 
+  barcodes, lqregions, and hqregions.
+- ReadGroupInfo operator== 
+
+### Fixed
+
+- Reimplemented QueryStart(int), QueryEnd(int), UpdateName(void), 
+  ReadGroup(ReadGroupInfo&), ReadGroupId(std::string&);
+
+## [0.0.5] - 2015-05-29
+
+### Added
+
+- DataSet support. This includes XML I/O, basic dataset query/manipulation, and multi-BAM-file 
+  queries. New classes are located in <pbbam/dataset/>. DataSet-capable queries currently reside in the 
+  PacBio::BAM::staging namespace. These will be ported over to the main namespace once the support is 
+  stabilized and works seamlessly with either a single BamFile or DataSet object as input. (bug 25941)
+- PBI support. This includes read/write raw data & building from a BamFile. The lookup API for 
+  random-access queries is under development, but the raw data is available - for creating PBI files & 
+  generating summary statistics. (bug 26025)
+- C# SWIG bindings, alongside existing Python and R wrappers.
+- LocalContextFlags support in BamRecord (bug 26623)
+
+### Fixed
+
+- BamRecord[Impl] map quality now  initialized with 255 (missing) value, instead of 0. (bug 26228)
+- ReadGroupId calculation. (bug 25940)
+  
+## [0.0.4] - 2015-04-22
+
+### Added
+
+- This changelog. Hope it helps.
+- Hook to set verbosity of underlying htslib warnings.
+- Grouped queries. (bug 26361)
+
+### Changed
+
+- Now using exceptions instead of return codes, output parameters, etc.
+- Removed "messy" shared_ptrs across interface (see especially BamHeader). These are now taken care of within the API, not exposed to client code.
+
+### Removed
+
+- BamReader 
+
+### Fixed
+
+- ASCII tag output. (bug 26381)
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..f7a646d
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,132 @@
+########################################################################
+# CMake build script for PacBioBAM library.
+########################################################################
+
+cmake_policy(SET CMP0048 NEW)  # lets us set version in project()
+project(PacBioBAM VERSION 0.1.0 LANGUAGES CXX C)
+cmake_minimum_required(VERSION 3.0)
+
+# project version
+set(PacBioBAM_VERSION
+  "${PacBioBAM_VERSION_MAJOR}.${PacBioBAM_VERSION_MINOR}.${PacBioBAM_VERSION_PATCH}"
+)
+
+# list build-time options
+option(PacBioBAM_build_docs    "Build PacBioBAM's API documentation."           ON)
+option(PacBioBAM_build_tests   "Build PacBioBAM's unit tests."                  ON)
+option(PacBioBAM_build_shared  "Build PacBioBAM as shared library as well."     OFF)
+option(PacBioBAM_build_pbindex "Build pbindex tool."                            ON)
+option(PacBioBAM_wrap_csharp   "Build PacBioBAM with SWIG bindings for C#."     OFF)
+option(PacBioBAM_wrap_python   "Build PacBioBAM with SWIG bindings for Python." OFF)
+option(PacBioBAM_wrap_r        "Build PacBioBAM with SWIG bindings for R."      OFF)
+option(PacBioBAM_use_modbuild  "Build PacBioBAM using Modular Build System."    OFF)
+
+# --check build-time options --
+
+# enable testing if requested
+if(PacBioBAM_build_tests)
+    enable_testing()
+endif()
+
+# determine if we're generating SWIG bindings
+if(PacBioBAM_wrap_csharp OR PacBioBAM_wrap_r OR PacBioBAM_wrap_python)
+    set(wrapping_swig TRUE)
+else()
+    set(wrapping_swig FALSE)
+endif()
+
+# determine if we need a shared lib
+if(PacBioBAM_build_shared OR wrapping_swig)
+    set(BUILD_SHARED_LIBS ON)
+    set(htslib_build_shared ON CACHE BOOL "force htslibConfig to export proper library name")
+    set(PB_LIB_MODE SHARED)
+    set(PB_LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
+else()
+    set(BUILD_SHARED_LIBS OFF)
+    set(PB_LIB_MODE STATIC)
+    set(PB_LIB_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX})
+endif()
+    
+# main project paths
+set(PacBioBAM_RootDir       ${PacBioBAM_SOURCE_DIR})
+set(PacBioBAM_DocsDir       ${PacBioBAM_RootDir}/docs)
+set(PacBioBAM_IncludeDir    ${PacBioBAM_RootDir}/include)
+set(PacBioBAM_SourceDir     ${PacBioBAM_RootDir}/src)
+set(PacBioBAM_SwigSourceDir ${PacBioBAM_RootDir}/src/swig)
+set(PacBioBAM_TestsDir      ${PacBioBAM_RootDir}/tests)
+
+if(NOT PacBioBAM_OutputDir)
+    set(PacBioBAM_OutputDir ${PacBioBAM_RootDir})
+else()
+    # if SWIG bindings requested
+    if(${wrapping_swig})
+        message(FATAL_ERROR "SWIG bindings not currently supported in modular build.")
+    endif()
+endif()
+
+set(PacBioBAM_BinDir        ${PacBioBAM_OutputDir}/bin)
+set(PacBioBAM_LibDir        ${PacBioBAM_OutputDir}/lib)
+set(PacBioBAM_ThirdPartyDir ${PacBioBAM_RootDir}/third-party)
+
+file(MAKE_DIRECTORY ${PacBioBAM_BinDir})
+file(MAKE_DIRECTORY ${PacBioBAM_LibDir})
+
+# use some custom Find*, Use* cmake modules
+list(APPEND CMAKE_MODULE_PATH "${PacBioBAM_RootDir}/cmake")
+
+# shared & third-party paths
+if(NOT HTSLIB_INCLUDE_DIRS OR
+   NOT HTSLIB_LIBRARIES)
+    if(HTSLIB_ROOTDIR)
+        find_package(htslib
+                     PATHS ${HTSLIB_ROOTDIR}/
+                     REQUIRED)
+    else()
+        find_package(htslib
+                     PATHS ${PacBioBAM_SOURCE_DIR}/../htslib/
+                     REQUIRED)
+    endif()
+endif()
+
+if(NOT Boost_INCLUDE_DIRS)
+    find_package(Boost REQUIRED)
+endif()
+
+if (NOT ZLIB_INCLUDE_DIRS OR
+    NOT ZLIB_LIBRARIES)
+    find_package(ZLIB REQUIRED)
+endif()
+
+# shared CXX flags for src & tests
+if (MSVC)
+    set(PacBioBAM_CXX_FLAGS "/Wall")
+else()
+    set(PacBioBAM_CXX_FLAGS "-std=c++11 -Wall -Wno-sign-compare")
+endif()
+
+# NOTE: -Wno-unused-local-typedefs used to quash clang warnings w/ Boost
+include(CheckCXXCompilerFlag)
+check_cxx_compiler_flag("-Wno-unused-local-typedefs" HAS_NO_UNUSED_LOCAL_TYPEDEFS)
+if(HAS_NO_UNUSED_LOCAL_TYPEDEFS)
+    set(PacBioBAM_CXX_FLAGS "${PacBioBAM_CXX_FLAGS} -Wno-unused-local-typedefs")
+endif()
+
+# For now, keep @rpath out of install names on OS X, as it causes SWIG
+# tests to fail.
+if(APPLE)
+    set(CMAKE_MACOSX_RPATH OFF)
+endif()
+
+# keep this order (src first, at least)
+add_subdirectory(src)
+add_subdirectory(tools)
+if(PacBioBAM_build_docs)
+    add_subdirectory(docs)
+endif()
+if(PacBioBAM_build_tests)
+    if (NOT GTEST_SRC_DIR)
+        set(GTEST_SRC_DIR ../gtest)
+    endif()
+    add_subdirectory(${GTEST_SRC_DIR} external/gtest/build)
+    add_subdirectory(tests)
+endif()
diff --git a/INSTALL.md b/INSTALL.md
new file mode 100644
index 0000000..1d72d77
--- /dev/null
+++ b/INSTALL.md
@@ -0,0 +1,114 @@
+# PacBio::BAM - building & integration
+
+- [Dependencies](#dependencies)
+- [Build](#build)
+- [Test](#test)
+- [Integration](#integration)
+    - [CMake](#cmake)
+	- [Other](#other)
+- [SWIG](#swig)
+    - [Python](#python)
+	- [R](#r)
+	- [CSharp](#csharp)
+
+## Dependencies
+  - CMake v2.8+
+  - Boost 1.54+
+  - zlib
+  - samtools exe (*)
+
+(*) NOTE: ppbam uses samtools for some of its tests, for now at least. The current
+build system points uses a relative path to one of the "prebuilt" samtools binaries.
+If you have checked out pbbam to any path that is NOT:
+
+    ///depot/software/smrtanalysis/bioinformatics/staging/PostPrimary/pbbam
+
+then please edit the Samtools_Dir variable in pbbam/tests/CMakeLists.txt to a place
+that works for your setup. That could just be as simple as "" if you already have
+samtools somewhere in your PATH.
+
+## Build
+
+To perform a simple build of the library (and its tests):
+
+    $ cd <pbbam_root>
+    $ mkdir build
+    $ cd build
+    $ cmake ..
+    $ make
+
+## Test
+    
+There are 2 options for testing the library. 
+
+1) Run the test executable directly:
+
+    $ <pbbam_root>/tests/bin/test_pbbam 
+
+which displays the GoogleTest-formatted results for the 250+ individual tests. This
+provides fine-grained info on any failed test.
+
+2) The other option is to use CMake/CTest-generated 'make' command:
+
+    $ cd <pbbam_root>/build
+    $ make test
+
+which collapses all of the test output into a single, CTest-formatted pass/fail display.
+
+## Integration
+
+### CMake
+
+If you are using CMake for your library or application, you can use the following steps
+to automate both the building of pbbam and its dependencies (if necessary) and importing
+the proper include paths, library paths, etc. If the pbbam library already exists, then
+the header/lib variables are simply imported.
+
+    # just for convenience
+    set(PacBioBAM_RootDir </anywhere/on/disk/path/to/pbbam>)  
+
+    # add_subdirectory() sounds a bit misleading, the path can be *anywhere* on disk. 
+    # the 2nd arg tells CMake where it should build pbbam if necessary
+    add_subdirectory(${PacBioBAM_RootDir} ${PacBioBAM_RootDir}/build) 
+  
+    # setup your client 
+    add_executable(foo ....)
+
+    # PacBioBAM_INCLUDE_DIRS provides all pbbam headers, as well as dependencies
+    include_directories( .... ${PacBioBAM_INCLUDE_DIRS} )
+
+    # PacBioBAM_LIBRARIES provides libpbbam.a, as well as dependencies
+    target_link_libraries( foo ..... ${PacBioBAM_LIBRARIES} )
+
+### Other
+
+The following instructions apply to all non-CMake-based builds. In addition to Boost headers & zlib, the relevant include paths for pbbam are:
+
+    <pbbam_root>/include
+    <pbbam_root>/third-party/htslib
+
+which allows these statements:
+
+    #include <pbbam/BamRecord.h>
+    #include <htslib/sam.h>       
+
+and so on in your code. And the relevant libraries to link to are:
+
+    <pbbam_root>/lib/libpbbam.a
+    <pbbam_root>/third-party/htslib/libhts.a
+
+## SWIG
+
+TODO: fill this in
+
+### Python
+
+TODO: fill this in
+
+### R
+
+TODO: fill this in
+
+### CSharp
+
+TODO: fill this in
diff --git a/cmake/FindCSharp.cmake b/cmake/FindCSharp.cmake
new file mode 100644
index 0000000..08d09a7
--- /dev/null
+++ b/cmake/FindCSharp.cmake
@@ -0,0 +1,72 @@
+#
+# A CMake Module for finding and using C# (.NET and Mono).
+#
+# The following variables are set:
+#   CSHARP_FOUND - set to ON if C# is found
+#   CSHARP_USE_FILE - the path to the C# use file
+#   CSHARP_TYPE - the type of the C# compiler (eg. ".NET" or "Mono")
+#   CSHARP_VERSION - the version of the C# compiler (eg. "v4.0" or "2.10.2")
+#   CSHARP_COMPILER - the path to the C# compiler executable (eg. "C:/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe" or "/usr/bin/gmcs")
+#   CSHARP_INTERPRETER - the path to interpreter needed to run CSharp executables
+#   CSHARP_PLATFORM - the C# target platform
+#   CSHARP_SDK - the SDK commandline switch (empty for .NET, for Mono eg. "/sdk:2" or "/sdk:4")
+#
+# This file is based on the work of GDCM:
+#   http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/FindCSharp.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+# TODO: ADD ABILITY TO SELECT WHICH C# COMPILER eg. .NET or Mono (if both exist). For the moment, .NET is selected above Mono.
+
+# Make sure find package macros are included
+include( FindPackageHandleStandardArgs )
+
+unset( CSHARP_COMPILER CACHE )
+unset( CSHARP_INTERPRETER CACHE )
+unset( CSHARP_TYPE CACHE )
+unset( CSHARP_VERSION CACHE )
+unset( CSHARP_FOUND CACHE )
+
+# By default use anycpu platform, allow the user to override
+set( CSHARP_PLATFORM "anycpu" CACHE STRING "C# target platform: x86, x64, anycpu, or itanium" )
+if( NOT ${CSHARP_PLATFORM} MATCHES "x86|x64|anycpu|itanium" )
+  message( FATAL_ERROR "The C# target platform '${CSHARP_PLATFORM}' is not valid. Please enter one of the following: x86, x64, anycpu, or itanium" )
+endif( )
+
+if( WIN32 )
+  find_package( DotNetFrameworkSdk )
+  if( NOT CSHARP_DOTNET_FOUND )
+    find_package( Mono )
+  endif( )
+else( UNIX )
+  find_package( Mono )
+endif( )
+
+if( CSHARP_DOTNET_FOUND )
+  set( CSHARP_TYPE ".NET" CACHE STRING "Using the .NET compiler" )
+  set( CSHARP_VERSION ${CSHARP_DOTNET_VERSION} CACHE STRING "C# .NET compiler version" FORCE )
+  set( CSHARP_COMPILER ${CSHARP_DOTNET_COMPILER_${CSHARP_DOTNET_VERSION}} CACHE STRING "Full path to .NET compiler" FORCE )
+  set( CSHARP_INTERPRETER "" CACHE INTERNAL "Interpretor not required for .NET" FORCE )
+elseif( CSHARP_MONO_FOUND )
+  set( CSHARP_TYPE "Mono" CACHE STRING "Using the Mono compiler" )
+  set( CSHARP_VERSION ${CSHARP_MONO_VERSION} CACHE STRING "C# Mono compiler version" FORCE )
+  set( CSHARP_COMPILER ${CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION}} CACHE STRING "Full path to Mono compiler" FORCE )
+  set( CSHARP_INTERPRETER ${CSHARP_MONO_INTERPRETER_${CSHARP_MONO_VERSION}} CACHE STRING "Full path to Mono interpretor" FORCE )
+  set( CSHARP_SDK "/sdk:4.5" CACHE STRING "C# Mono SDK commandline switch (e.g. /sdk:2, /sdk:4, /sdk:5)" )
+endif( )
+
+# Handle WIN32 specific issues
+if ( WIN32 )
+  if ( CSHARP_COMPILER MATCHES "bat" )
+    set( CSHARP_COMPILER "call ${CSHARP_COMPILER}" )
+  endif ( )
+endif( )
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(CSharp DEFAULT_MSG CSHARP_TYPE CSHARP_VERSION CSHARP_COMPILER)
+
+mark_as_advanced( CSHARP_TYPE CSHARP_VERSION CSHARP_COMPILER CSHARP_INTERPRETER CSHARP_PLATFORM CSHARP_SDK )
+
+# Set the USE_FILE path
+# http://public.kitware.com/Bug/view.php?id=7757
+get_filename_component( current_list_path ${CMAKE_CURRENT_LIST_FILE} PATH )
+set( CSHARP_USE_FILE ${current_list_path}/UseCSharp.cmake )
diff --git a/cmake/FindDotNetFrameworkSdk.cmake b/cmake/FindDotNetFrameworkSdk.cmake
new file mode 100644
index 0000000..8e12c70
--- /dev/null
+++ b/cmake/FindDotNetFrameworkSdk.cmake
@@ -0,0 +1,29 @@
+# Set paths and vars for .NET compilers 
+# This is hand-rolled because I had problems with the one from SimpleITK
+
+#
+# The following variables are set:
+#   CSHARP_DOTNET_FOUND
+#   CSHARP_DOTNET_COMPILER_${version} eg. "CSHARP_DOTNET_COMPILER_v4.0.30319"
+#   CSHARP_DOTNET_VERSION eg. "v4.0.30319"
+#   CSHARP_DOTNET_VERSIONS eg. "v2.0.50727, v3.5, v4.0.30319"
+#   DotNetFrameworkSdk_USE_FILE
+#
+#   CSHARP_PROJECT_BUILDER (xbuild/msbuild)
+
+set(framework_dir "C:/Windows/Microsoft.NET/Framework")
+
+set(CSHARP_DOTNET_VERSION "v4.0.30319")
+set(CSHARP_DOTNET_VERSIONS "")
+set(CSHARP_DOTNET_COMPILER_${CSHARP_DOTNET_VERSION} "${framework_dir}/${CSHARP_DOTNET_VERSION}/csc.exe")
+set(CSHARP_PROJECT_BUILDER "${framework_dir}/${CSHARP_DOTNET_VERSION}/MSBuild.exe")
+
+if(EXISTS ${CSHARP_DOTNET_COMPILER_${CSHARP_DOTNET_VERSION}})
+	set(CSHARP_DOTNET_FOUND 1)
+else()
+	set(CSHARP_DOTNET_FOUND 0)
+endif()
+
+# Set USE_FILE
+get_filename_component( current_list_path ${CMAKE_CURRENT_LIST_FILE} PATH )
+set( DotNetFrameworkSdk_USE_FILE ${current_list_path}/UseDotNetFrameworkSdk.cmake )
\ No newline at end of file
diff --git a/cmake/FindMono.cmake b/cmake/FindMono.cmake
new file mode 100644
index 0000000..0fab116
--- /dev/null
+++ b/cmake/FindMono.cmake
@@ -0,0 +1,167 @@
+#
+# A CMake Module for finding Mono.
+#
+# The following variables are set:
+#   CSHARP_MONO_FOUND
+#   CSHARP_MONO_COMPILER_${version} eg. "CSHARP_MONO_COMPILER_2.10.2"
+#   CSHARP_MONO_INTERPRETOR_${version} eg. "CSHARP_MONO_INTERPRETOR_2.10.2"
+#   CSHARP_MONO_VERSION eg. "2.10.2"
+#   CSHARP_MONO_VERSIONS eg. "2.10.2, 2.6.7"
+#
+# Additional references can be found here:
+#   http://www.mono-project.com/Main_Page
+#   http://www.mono-project.com/CSharp_Compiler
+#   http://mono-project.com/FAQ:_Technical (How can I tell where the Mono runtime is installed)
+#
+# This file is based on the work of GDCM:
+#   http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/FindMono.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+set( csharp_mono_valid 1 )
+if( DEFINED CSHARP_MONO_FOUND )
+  # The Mono compiler has already been found
+  # It may have been reset by the user, verify it is correct
+  if( NOT DEFINED CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} )
+    set( csharp_mono_version_user ${CSHARP_MONO_VERSION} )
+    set( csharp_mono_valid 0 )
+    set( CSHARP_MONO_FOUND 0 )
+    set( CSHARP_MONO_VERSION "CSHARP_MONO_VERSION-NOTVALID" CACHE STRING "C# Mono compiler version, choices: ${CSHARP_MONO_VERSIONS}" FORCE )
+    message( FATAL_ERROR "The C# Mono version '${csharp_mono_version_user}' is not valid. Please enter one of the following: ${CSHARP_MONO_VERSIONS}" )
+  endif( NOT DEFINED CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} )
+endif( DEFINED CSHARP_MONO_FOUND )
+
+unset( CSHARP_MONO_VERSIONS CACHE ) # Clear versions
+if( WIN32 )
+  # Search for Mono on Win32 systems
+  # See http://mono-project.com/OldReleases and http://www.go-mono.com/mono-downloads/download.html
+  set( csharp_mono_bin_dirs )
+  set( csharp_mono_search_hints
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.11.2;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.9;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.8;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.7;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.6;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.5;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.4;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.3;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.2;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10.1;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.10;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.8;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.7;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.4;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.3;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6.1;SdkInstallRoot]/bin"
+    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono\\2.6;SdkInstallRoot]/bin"
+  )
+  foreach( csharp_mono_search_hint ${csharp_mono_search_hints} )
+    get_filename_component( csharp_mono_bin_dir "${csharp_mono_search_hint}" ABSOLUTE )
+    if ( EXISTS "${csharp_mono_bin_dir}" )
+      set( csharp_mono_bin_dirs ${csharp_mono_bin_dirs} ${csharp_mono_bin_dir} )
+    endif ( EXISTS "${csharp_mono_bin_dir}" )
+  endforeach( csharp_mono_search_hint )
+  # TODO: Use HKLM_LOCAL_MACHINE\Software\Novell\Mono\DefaultCLR to specify default version
+  # get_filename_component( test "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\Mono;DefaultCLR]" NAME )
+
+  foreach ( csharp_mono_bin_dir ${csharp_mono_bin_dirs} )
+    string( REPLACE "\\" "/" csharp_mono_bin_dir ${csharp_mono_bin_dir} )
+    if (EXISTS "${csharp_mono_bin_dir}/dmcs.bat")
+      set( csharp_mono_executable "${csharp_mono_bin_dir}/dmcs.bat")
+    elseif (EXISTS "${csharp_mono_bin_dir}/gmcs.bat")
+      set( csharp_mono_executable "${csharp_mono_bin_dir}/gmcs.bat")
+    elseif (EXISTS "${csharp_mono_bin_dir}/mcs.bat")
+      set( csharp_mono_executable "${csharp_mono_bin_dir}/mcs.bat")
+    endif (EXISTS "${csharp_mono_bin_dir}/dmcs.bat")
+
+    if( csharp_mono_valid )
+      # Extract version number (eg. 2.10.2)
+      string(REGEX MATCH "([0-9]*)([.])([0-9]*)([.]*)([0-9]*)" csharp_mono_version_temp ${csharp_mono_bin_dir})
+      set( CSHARP_MONO_VERSION ${csharp_mono_version_temp} CACHE STRING "C# Mono compiler version" )
+      mark_as_advanced( CSHARP_MONO_VERSION )
+
+      # Add variable holding executable
+      set( CSHARP_MONO_COMPILER_${csharp_mono_version_temp} ${csharp_mono_executable} CACHE STRING "C# Mono compiler ${csharp_mono_version_temp}" FORCE )
+      mark_as_advanced( CSHARP_MONO_COMPILER_${csharp_mono_version_temp} )
+
+      # Set interpreter
+      if (EXISTS "${csharp_mono_bin_dir}/mono.exe")
+        set( CSHARP_MONO_INTERPRETER_${csharp_mono_version_temp} "${csharp_mono_bin_dir}/mono.exe" CACHE STRING "C# Mono interpreter ${csharp_mono_version_temp}" FORCE )
+        mark_as_advanced( CSHARP_MONO_INTERPRETER_${csharp_mono_version_temp} )
+      endif (EXISTS "${csharp_mono_bin_dir}/mono.exe")
+    endif( csharp_mono_valid )
+
+    # Create a list of supported compiler versions
+    if( NOT DEFINED CSHARP_MONO_VERSIONS )
+      set( CSHARP_MONO_VERSIONS "${csharp_mono_version_temp}" CACHE STRING "Available C# Mono compiler versions" FORCE )
+    else( NOT DEFINED CSHARP_MONO_VERSIONS )
+      set( CSHARP_MONO_VERSIONS "${CSHARP_MONO_VERSIONS}, ${csharp_mono_version_temp}"  CACHE STRING "Available C# Mono versions" FORCE )
+    endif( NOT DEFINED CSHARP_MONO_VERSIONS )
+    mark_as_advanced( CSHARP_MONO_VERSIONS )
+
+    # We found at least one Mono compiler version
+    set( CSHARP_MONO_FOUND 1 CACHE INTERNAL "Boolean indicating if C# Mono was found" )
+  endforeach( csharp_mono_bin_dir )
+
+else( UNIX )
+  # Search for Mono on non-Win32 systems
+  set( chsarp_mono_names "mcs" "mcs.exe" "dmcs" "dmcs.exe" "smcs" "smcs.exe" "gmcs" "gmcs.exe" )
+  set(
+    csharp_mono_paths
+    "/usr/bin/"
+    "/usr/local/bin/"
+    "/usr/lib/mono/2.0"
+    "/opt/novell/mono/bin"
+  )
+  find_program(
+    csharp_mono_compiler # variable is added to the cache, we removed it below
+    NAMES ${chsarp_mono_names}
+    PATHS ${csharp_mono_paths}
+  )
+
+  if( EXISTS ${csharp_mono_compiler} )
+    # Determine version
+    find_program(
+      csharp_mono_interpreter # variable is added to the cache, we removed it below
+      NAMES mono
+      PATHS ${csharp_mono_paths}
+    )
+    if ( EXISTS ${csharp_mono_interpreter} )
+      execute_process(
+        COMMAND ${csharp_mono_interpreter} -V
+        OUTPUT_VARIABLE csharp_mono_version_string
+      )
+      string( REGEX MATCH "([0-9]*)([.])([0-9]*)([.]*)([0-9]*)" csharp_mono_version_temp ${csharp_mono_version_string} )
+      set( CSHARP_MONO_INTERPRETER_${CSHARP_MONO_VERSION} ${csharp_mono_interpreter} CACHE STRING "C# Mono interpreter ${csharp_mono_version_temp}" FORCE )
+      mark_as_advanced( CSHARP_MONO_INTERPRETER_${CSHARP_MONO_VERSION} )
+    endif ( EXISTS ${csharp_mono_interpreter} )
+    unset( csharp_mono_interpreter CACHE )
+
+    # We found Mono compiler
+    set( CSHARP_MONO_VERSION ${csharp_mono_version_temp} CACHE STRING "C# Mono compiler version" )
+    mark_as_advanced( CSHARP_MONO_VERSION )
+    set( CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} ${csharp_mono_compiler} CACHE STRING "C# Mono compiler ${CSHARP_MONO_VERSION}" FORCE )
+    mark_as_advanced( CSHARP_MONO_COMPILER_${CSHARP_MONO_VERSION} )
+    set( CSHARP_MONO_VERSIONS ${CSHARP_MONO_VERSION} CACHE STRING "Available C# Mono compiler versions" FORCE )
+    mark_as_advanced( CSHARP_MONO_VERSIONS )
+    set( CSHARP_MONO_FOUND 1 CACHE INTERNAL "Boolean indicating if C# Mono was found" )
+
+    # Assume xbuild is just xbuild.
+    set(CSHARP_PROJECT_BUILDER "xbuild")
+
+
+  endif( EXISTS ${csharp_mono_compiler} )
+
+  # Remove temp variable from cache
+  unset( csharp_mono_compiler CACHE )
+
+endif( WIN32 )
+
+if( CSHARP_MONO_FOUND )
+  # Report the found versions
+  message( STATUS "Found the following C# Mono versions: ${CSHARP_MONO_VERSIONS}" )
+endif( CSHARP_MONO_FOUND )
+
+# Set USE_FILE
+get_filename_component( current_list_path ${CMAKE_CURRENT_LIST_FILE} PATH )
+set( Mono_USE_FILE ${current_list_path}/UseMono.cmake )
diff --git a/cmake/FindR.cmake b/cmake/FindR.cmake
new file mode 100644
index 0000000..6ae4354
--- /dev/null
+++ b/cmake/FindR.cmake
@@ -0,0 +1,48 @@
+
+#
+# - This module locates an installed R distribution.
+#
+# Defines the following:
+#
+# R_INCLUDE_DIR      - Path to R include directory
+# R_LIBRARIES        - Path to R library
+# R_LIBRARY_BASE     -
+# R_COMMAND          - Path to R command
+# RSCRIPT_EXECUTABLE - Path to Rscript command
+#
+
+
+# Make sure find package macros are included
+include( FindPackageHandleStandardArgs )
+
+set(TEMP_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE})
+set(CMAKE_FIND_APPBUNDLE "NEVER")
+find_program(R_COMMAND R DOC "R executable.")
+if(R_COMMAND)
+  execute_process(WORKING_DIRECTORY . COMMAND ${R_COMMAND} RHOME OUTPUT_VARIABLE R_BASE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
+  set(R_HOME ${R_BASE_DIR} CACHE PATH "R home directory obtained from R RHOME")
+  mark_as_advanced(R_HOME)
+endif(R_COMMAND)
+
+find_program(RSCRIPT_EXECUTABLE Rscript DOC "Rscript executable.")
+
+set(CMAKE_FIND_APPBUNDLE ${TEMP_CMAKE_FIND_APPBUNDLE})
+
+# R.h gets installed in all sorts of places -
+# ubuntu: /usr/share/R/include, RHEL/Fedora: /usr/include/R/R.h
+find_path(R_INCLUDE_DIR R.h PATHS ${R_INCLUDE_DIR_HINT} /usr/local/lib /usr/local/lib64 /usr/share /usr/include ${R_BASE_DIR} PATH_SUFFIXES include R R/include DOC "Path to file R.h")
+find_library(R_LIBRARY_BASE R PATHS ${R_BASE_DIR} PATH_SUFFIXES /lib DOC "R library (example libR.a, libR.dylib, etc.).")
+
+set(R_LIBRARIES ${R_LIBRARY_BASE})
+mark_as_advanced(RSCRIPT_EXECUTABLE R_LIBRARIES R_INCLUDE_DIR R_COMMAND R_LIBRARY_BASE)
+
+
+set( _REQUIRED_R_VARIABLES R_INCLUDE_DIR R_COMMAND )
+
+if( APPLE )
+  # On linux platform some times the libR.so is not available, however
+  # on apple a link error results if the library is linked.
+  list(  APPEND _REQUIRED_R_VARIABLES R_LIBRARIES R_LIBRARY_BASE )
+endif()
+
+find_package_handle_standard_args(R DEFAULT_MSG ${_REQUIRED_R_VARIABLES} )
diff --git a/cmake/UseCSharp.cmake b/cmake/UseCSharp.cmake
new file mode 100644
index 0000000..dac4537
--- /dev/null
+++ b/cmake/UseCSharp.cmake
@@ -0,0 +1,111 @@
+# CMake Module for finding and using C# (.NET and Mono).
+#
+# The following global variables are assumed to exist:
+#   CSHARP_SOURCE_DIRECTORY - path to C# sources
+#   CSHARP_BINARY_DIRECTORY - path to place resultant C# binary files
+#
+# The following variables are set:
+#   CSHARP_TYPE - the type of the C# compiler (eg. ".NET" or "Mono")
+#   CSHARP_COMPILER - the path to the C# compiler executable (eg. "C:/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe")
+#   CSHARP_VERSION - the version number of the C# compiler (eg. "v4.0.30319")
+#
+# The following macros are defined:
+#   CSHARP_ADD_EXECUTABLE( name references [files] [output_dir] ) - Define C# executable with the given name
+#   CSHARP_ADD_LIBRARY( name references [files] [output_dir] ) - Define C# library with the given name
+#
+# Examples:
+#   CSHARP_ADD_EXECUTABLE( MyExecutable "" "Program.cs" )
+#   CSHARP_ADD_EXECUTABLE( MyExecutable "ref1.dll ref2.dll" "Program.cs File1.cs" )
+#   CSHARP_ADD_EXECUTABLE( MyExecutable "ref1.dll;ref2.dll" "Program.cs;File1.cs" )
+#
+# This file is based on the work of GDCM:
+#   http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/UseCSharp.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+# TODO: ADD SUPPORT FOR LINK LIBRARIES
+
+# Check something was found
+if( NOT CSHARP_COMPILER )
+  message( WARNING "A C# compiler executable was not found on your system" )
+endif( NOT CSHARP_COMPILER )
+
+# Include type-based USE_FILE
+if( CSHARP_TYPE MATCHES ".NET" )
+  include( ${DotNetFrameworkSdk_USE_FILE} )
+elseif ( CSHARP_TYPE MATCHES "Mono" )
+  include( ${Mono_USE_FILE} )
+endif ( CSHARP_TYPE MATCHES ".NET" )
+
+macro( CSHARP_ADD_LIBRARY name )
+  CSHARP_ADD_PROJECT( "library" ${name} ${ARGN} )
+endmacro( CSHARP_ADD_LIBRARY )
+
+macro( CSHARP_ADD_EXECUTABLE name )
+  CSHARP_ADD_PROJECT( "exe" ${name} ${ARGN} )
+endmacro( CSHARP_ADD_EXECUTABLE )
+
+# Private macro
+macro( CSHARP_ADD_PROJECT type name )
+  set( refs "/reference:System.dll" )
+  set( sources )
+  set( sources_dep )
+
+  if( ${type} MATCHES "library" )
+    set( output "dll" )
+  elseif( ${type} MATCHES "exe" )
+    set( output "exe" )
+  endif( ${type} MATCHES "library" )
+
+  # Step through each argument
+  foreach( it ${ARGN} )
+    if( ${it} MATCHES "(.*)(dll)" )
+       # Argument is a dll, add reference
+       list( APPEND refs /reference:${it} )
+    else( )
+      # Argument is a source file
+      if( EXISTS ${it} )
+        list( APPEND sources ${it} )
+        list( APPEND sources_dep ${it} )
+      elseif( EXISTS ${CSHARP_SOURCE_DIRECTORY}/${it} )
+        list( APPEND sources ${CSHARP_SOURCE_DIRECTORY}/${it} )
+        list( APPEND sources_dep ${CSHARP_SOURCE_DIRECTORY}/${it} )
+      elseif( ${it} MATCHES "[*]" )
+        # For dependencies, we need to expand wildcards
+        FILE( GLOB it_glob ${it} )
+        list( APPEND sources ${it} )
+        list( APPEND sources_dep ${it_glob} )
+      endif( )
+    endif ( )
+  endforeach( )
+
+  # Check we have at least one source
+  list( LENGTH sources_dep sources_length )
+  if ( ${sources_length} LESS 1 )
+    MESSAGE( SEND_ERROR "No C# sources were specified for ${type} ${name}" )
+  endif ()
+  list( SORT sources_dep )
+
+  # Perform platform specific actions
+  if (WIN32)
+    string( REPLACE "/" "\\" sources ${sources} )
+  else (UNIX)
+    string( REPLACE "\\" "/" sources ${sources} )
+  endif (WIN32)
+
+  # Add custom target and command
+  MESSAGE( STATUS "Adding C# ${type} ${name}: '${CSHARP_COMPILER} /t:${type} /out:${name}.${output} /platform:${CSHARP_PLATFORM} ${CSHARP_SDK} ${refs} ${sources}'" )
+  add_custom_command(
+    COMMENT "Compiling C# ${type} ${name}: '${CSHARP_COMPILER} /t:${type} /out:${name}.${output} /platform:${CSHARP_PLATFORM} ${CSHARP_SDK} ${refs} ${sources}'"
+    OUTPUT ${CSHARP_BINARY_DIRECTORY}/${name}.${output}
+    COMMAND ${CSHARP_COMPILER}
+    ARGS /t:${type} /out:${name}.${output} /platform:${CSHARP_PLATFORM} ${CSHARP_SDK} ${refs} ${sources}
+    WORKING_DIRECTORY ${CSHARP_BINARY_DIRECTORY}
+    DEPENDS ${sources_dep}
+  )
+  add_custom_target(
+    ${name} ALL
+    DEPENDS ${CSHARP_BINARY_DIRECTORY}/${name}.${output}
+    SOURCES ${sources_dep}
+  )
+endmacro( CSHARP_ADD_PROJECT )
diff --git a/cmake/UseDotNetFrameworkSdk.cmake b/cmake/UseDotNetFrameworkSdk.cmake
new file mode 100644
index 0000000..6be4027
--- /dev/null
+++ b/cmake/UseDotNetFrameworkSdk.cmake
@@ -0,0 +1,16 @@
+#
+# A CMake Module for using Mono.
+#
+# The following variables are set:
+#   (none)
+#
+# Additional references can be found here:
+#   http://www.mono-project.com/Main_Page
+#   http://www.mono-project.com/CSharp_Compiler
+#
+# This file is based on the work of GDCM:
+#   http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/FindMono.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+message( STATUS "Using .NET compiler version ${CSHARP_DOTNET_VERSION}" )
\ No newline at end of file
diff --git a/cmake/UseMono.cmake b/cmake/UseMono.cmake
new file mode 100644
index 0000000..16a80ae
--- /dev/null
+++ b/cmake/UseMono.cmake
@@ -0,0 +1,16 @@
+#
+# A CMake Module for using Mono.
+#
+# The following variables are set:
+#   (none)
+#
+# Additional references can be found here:
+#   http://www.mono-project.com/Main_Page
+#   http://www.mono-project.com/CSharp_Compiler
+#
+# This file is based on the work of GDCM:
+#   http://gdcm.svn.sf.net/viewvc/gdcm/trunk/CMake/FindMono.cmake
+# Copyright (c) 2006-2010 Mathieu Malaterre <mathieu.malaterre at gmail.com>
+#
+
+message( STATUS "Using Mono compiler version ${CSHARP_MONO_VERSION}" )
diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
new file mode 100644
index 0000000..ff044b9
--- /dev/null
+++ b/docs/CMakeLists.txt
@@ -0,0 +1,11 @@
+find_package(Doxygen)
+
+if(DOXYGEN_FOUND)
+    configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${PacBioBAM_DocsDir}/Doxyfile @ONLY )
+    add_custom_target(doc
+        ${DOXYGEN_EXECUTABLE} ${PacBioBAM_DocsDir}/Doxyfile
+        WORKING_DIRECTORY ${PacBioBAM_DocsDir}
+        COMMENT "Generating API documentation with Doxygen"
+        VERBATIM
+    )
+endif()
diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in
new file mode 100644
index 0000000..66c4de1
--- /dev/null
+++ b/docs/Doxyfile.in
@@ -0,0 +1,1602 @@
+# Doxyfile 1.6.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = @CMAKE_PROJECT_NAME@
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = @PacBioBAM_VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = @PacBioBAM_DocsDir@
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, 
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 1
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+#samSpecURL=http://samtools.sourceforge.net/SAM1.pdf
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it parses. 
+# With this tag you can assign which parser to use for a given extension. 
+# Doxygen has a built-in mapping, but you can override or extend it using this tag. 
+# The format is ext=language, where ext is a file extension, and language is one of 
+# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, 
+# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat 
+# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), 
+# use: inc=Fortran f=C. Note that for custom extensions you also need to set
+# FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk. 
+# When the cache is full, less often used symbols will be written to disk. 
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penality. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will rougly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
+# will list include files with double quotes in the documentation 
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by 
+# doxygen. The layout file controls the global structure of the generated output files 
+# in an output format independent way. The create the layout file that represents 
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a 
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name 
+# of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = @PacBioBAM_IncludeDir@/pbbam @PacBioBAM_SourceDir@
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.f90 \
+                         *.f \
+                         *.vhd \
+                         *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code.  Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
+# page will contain the date and time when the page was generated. Setting 
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = YES
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER 
+# are set, an additional index file will be generated that can be used as input for 
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated 
+# HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. 
+# For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's 
+# filter section matches. 
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file.
+
+QHG_LOCATION           = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
+# will be generated, which together with the HTML files, form an Eclipse help  
+# plugin. To install this plugin and make it available under the help contents 
+# menu in Eclipse, the contents of the directory containing the HTML and XML 
+# files needs to be copied into the plugins directory of eclipse. The name of 
+# the directory within the plugins directory should be the same as 
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin 
+# the directory name containing the HTML and XML files should also have 
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to YES, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript 
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should 
+# typically be disabled. For large projects the javascript based search engine 
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index 
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvances is that it is more difficult to setup 
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name. 
+# Note that when enabling USE_PDFLATEX this option is only used for 
+# generating bitmaps for formulas in the HTML output, but not in the 
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = NO
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = NO
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/include/pbbam/Accuracy.h b/include/pbbam/Accuracy.h
new file mode 100644
index 0000000..03c233e
--- /dev/null
+++ b/include/pbbam/Accuracy.h
@@ -0,0 +1,98 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef ACCURACY_H
+#define ACCURACY_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief The Accuracy class represents the expected accuracy of a BamRecord.
+/// Values are clamped to [0,1000].
+///
+class PBBAM_EXPORT Accuracy
+{
+public:
+    static const int MIN;
+    static const int MAX;
+
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    /// \note This is not an 'explicit' ctor, to make it as easy to use in
+    ///       numeric operations as possible. We really just want to make
+    ///       sure that the acceptable range is respected.
+    Accuracy(int accuracy);
+    Accuracy(const Accuracy& other);
+    ~Accuracy(void);
+
+    /// \}
+
+public:
+
+    /// \returns Accuracy as integer
+    operator int(void) const;
+
+private:
+    int accuracy_;
+};
+
+inline Accuracy::Accuracy(int accuracy)
+{
+    if (accuracy < Accuracy::MIN)
+        accuracy = Accuracy::MIN;
+    else if (accuracy > Accuracy::MAX)
+        accuracy = Accuracy::MAX;
+    accuracy_ = accuracy;
+}
+
+inline Accuracy::Accuracy(const Accuracy &other)
+    : accuracy_(other.accuracy_)
+{ }
+
+inline Accuracy::~Accuracy(void) { }
+
+inline Accuracy::operator int(void) const
+{ return accuracy_; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ACCURACY_H
diff --git a/include/pbbam/AlignmentPrinter.h b/include/pbbam/AlignmentPrinter.h
new file mode 100644
index 0000000..6424c5f
--- /dev/null
+++ b/include/pbbam/AlignmentPrinter.h
@@ -0,0 +1,83 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Armin Töpfer
+
+#ifndef ALIGNMENTPRINTER_H
+#define ALIGNMENTPRINTER_H
+
+#include <memory>
+#include <string>
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/IndexedFastaReader.h"
+#include "pbbam/Orientation.h"
+
+namespace PacBio {
+namespace BAM {
+
+class BamRecord;
+
+class AlignmentPrinter
+{
+public:
+    AlignmentPrinter(const IndexedFastaReader& ifr)
+        : ifr_(std::unique_ptr<IndexedFastaReader>(new IndexedFastaReader(ifr)))
+    { }
+
+    AlignmentPrinter() = delete;
+    // Move constructor
+    AlignmentPrinter(AlignmentPrinter&&) = default;
+    // Copy constructor
+    AlignmentPrinter(const AlignmentPrinter&) = delete;
+    // Move assignment operator
+    AlignmentPrinter& operator=(AlignmentPrinter&&) = default;
+    // Copy assignment operator
+    AlignmentPrinter& operator=(const AlignmentPrinter&) = delete;
+    // Destructor
+    ~AlignmentPrinter() = default;
+
+public:
+    std::string Print(const BamRecord& record,
+                      const Orientation orientation = Orientation::GENOMIC);
+
+private:
+	const std::unique_ptr<IndexedFastaReader> ifr_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ALIGNMENTPRINTER_H
diff --git a/include/pbbam/BamFile.h b/include/pbbam/BamFile.h
new file mode 100644
index 0000000..62da044
--- /dev/null
+++ b/include/pbbam/BamFile.h
@@ -0,0 +1,147 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef BAMFILE_H
+#define BAMFILE_H
+
+#include "pbbam/Config.h"
+#include "pbbam/BamHeader.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class BamFilePrivate; }
+
+class PBBAM_EXPORT BamFile
+{
+public:
+
+    /// \name Constructors & Related Methods
+    /// \{
+
+    /// \brief Creates a BamFile object on the provided \p filename & loads header information.
+    ///
+    /// \param[in] filename BAM filename
+    /// \throws std::exception on failure
+    BamFile(const std::string& filename);
+
+    BamFile(const BamFile& other);
+    BamFile(BamFile&& other);
+    BamFile& operator=(const BamFile& other);
+    BamFile& operator=(BamFile&& other);
+    ~BamFile(void);
+
+    /// \}
+
+public:
+
+    /// \name Index & Filename Methods
+    /// \{
+
+    /// Check that ".pbi" exists and is newer than this BAM file.
+    /// If not, one will be created.
+    ///
+    /// \throws if PBI file could not be properly created and/or
+    /// written to disk
+    ///
+    void EnsurePacBioIndexExists(void) const;
+
+    /// Check that ".bai" exists and is newer than this BAM file.
+    /// If not, one will be created.
+    ///
+    /// \throws if BAI file could not be properly created (e.g. this
+    /// BAM is not coordinate-sorted) or could not be written to disk
+    ///
+    void EnsureStandardIndexExists(void) const;
+
+    /// \returns BAM filename
+    std::string Filename(void) const;
+
+    /// \returns true if ".pbi" exists and is newer than this BAM file.
+    bool PacBioIndexExists(void) const;
+
+    /// \returns filename of PacBio index file (".pbi")
+    /// \note No guarantee is made on the existence of this file.
+    ///       This method simply returns the expected filename.
+    std::string PacBioIndexFilename(void) const;
+
+    /// \returns true if ".bai" exists and is newer than this BAM file.
+    bool StandardIndexExists(void) const;
+
+    /// \returns filename of standard index file (".bai")
+    /// \note No guarantee is made on the existence of this file.
+    ///       This method simply returns the expected filename.
+    std::string StandardIndexFilename(void) const;
+
+
+    /// \}
+
+    /// \name Header Metadata Methods
+    /// \{
+
+    /// \returns true if header metadata has this reference name
+    bool HasReference(const std::string& name) const;
+
+    /// \returns const reference to BamHeader containing the file's metadata
+    const BamHeader& Header(void) const;
+
+    /// \returns true if BAM file is a PacBio BAM file (i.e. has non-empty version associated with header "pb" tag)
+    bool IsPacBioBAM(void) const;
+
+    /// \returns ID for reference \p name (can be used for e.g. GenomicIntervalQuery), -1 if not found
+    int ReferenceId(const std::string& name) const;
+
+    /// \return name of reference matching \p id, empty string if not found
+    std::string ReferenceName(const int id) const;
+
+    /// \returns length of requested reference \p name. 0 if not found
+    uint32_t ReferenceLength(const std::string& name) const;
+
+    /// \returns length of requested reference \p id. 0 if not found
+    uint32_t ReferenceLength(const int id) const;
+
+    /// \}
+
+private:
+    PBBAM_SHARED_PTR<internal::BamFilePrivate> d_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMFILE_H
diff --git a/include/pbbam/BamHeader.h b/include/pbbam/BamHeader.h
new file mode 100644
index 0000000..9dea3cc
--- /dev/null
+++ b/include/pbbam/BamHeader.h
@@ -0,0 +1,184 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef BAMHEADER_H
+#define BAMHEADER_H
+
+#include "pbbam/Config.h"
+#include "pbbam/ProgramInfo.h"
+#include "pbbam/ReadGroupInfo.h"
+#include "pbbam/SequenceInfo.h"
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class BamHeaderPrivate; }
+
+class PBBAM_EXPORT BamHeader
+{
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    BamHeader(void);
+    BamHeader(const std::string& samHeaderText);
+    BamHeader(const BamHeader& other);
+    BamHeader(BamHeader&& other);
+    BamHeader& operator=(const BamHeader& other);
+    BamHeader& operator=(BamHeader&& other);
+    ~BamHeader(void);
+
+    BamHeader DeepCopy(void) const;
+
+    /// \}
+
+public:
+    /// \name General
+    /// \{
+
+    std::string PacBioBamVersion(void) const;
+    std::string SortOrder(void) const;
+    std::string Version(void) const;
+
+    /// \}
+
+    /// \name Read Groups
+    /// \{
+
+    bool HasReadGroup(const std::string& id) const;
+    ReadGroupInfo ReadGroup(const std::string& id) const;
+    std::vector<std::string> ReadGroupIds(void) const;
+    std::vector<ReadGroupInfo> ReadGroups(void) const;
+
+    /// \}
+
+    /// \name Sequences
+    /// \{
+
+    bool HasSequence(const std::string& name) const;
+    int32_t SequenceId(const std::string& name) const;
+    std::string SequenceLength(const int32_t id) const;
+    std::string SequenceName(const int32_t id) const;
+    std::vector<std::string> SequenceNames(void) const;
+    SequenceInfo Sequence(const int32_t id) const;
+    SequenceInfo Sequence(const std::string& name) const;
+    std::vector<SequenceInfo> Sequences(void) const;
+
+    /// \}
+
+    /// \name Programs
+    /// \{
+
+    bool HasProgram(const std::string& id) const;
+    ProgramInfo Program(const std::string& id) const;
+    std::vector<std::string> ProgramIds(void) const;
+    std::vector<ProgramInfo> Programs(void) const;
+
+    /// \}
+
+    /// \name Comments
+    /// \{
+
+    std::vector<std::string> Comments(void) const;
+
+    /// \}
+
+    /// \name Conversion Methods
+    /// \{
+
+    std::string ToSam(void) const;
+
+    /// \}
+
+public:
+
+    /// \name General
+    /// \{
+
+    BamHeader& PacBioBamVersion(const std::string& version);
+    BamHeader& SortOrder(const std::string& order);
+    BamHeader& Version(const std::string& version);
+
+    /// \}
+
+    /// \name Read Groups
+    /// \{
+
+    BamHeader& AddReadGroup(const ReadGroupInfo& readGroup);
+    BamHeader& ClearReadGroups(void);
+    BamHeader& ReadGroups(const std::vector<ReadGroupInfo>& readGroups);
+
+    /// \}
+
+    /// \name Sequences
+    /// \{
+
+    BamHeader& AddSequence(const SequenceInfo& sequence);
+    BamHeader& ClearSequences(void);
+    BamHeader& Sequences(const std::vector<SequenceInfo>& sequences);
+
+    /// \}
+
+    /// \name Programs
+    /// \{
+
+    BamHeader& AddProgram(const ProgramInfo& pg);
+    BamHeader& ClearPrograms(void);
+    BamHeader& Programs(const std::vector<ProgramInfo>& programs);
+
+    /// \}
+
+    /// \name Comments
+    /// \{
+
+    BamHeader& AddComment(const std::string& comment);
+    BamHeader& ClearComments(void);
+    BamHeader& Comments(const std::vector<std::string>& comments);
+
+    /// \}
+
+private:
+    PBBAM_SHARED_PTR<internal::BamHeaderPrivate> d_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMHEADER_H
diff --git a/include/pbbam/BamReader.h b/include/pbbam/BamReader.h
new file mode 100644
index 0000000..bd0ced6
--- /dev/null
+++ b/include/pbbam/BamReader.h
@@ -0,0 +1,114 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef BAMREADER_H
+#define BAMREADER_H
+
+#include "pbbam/BamHeader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/Config.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT BamReader
+{
+
+public:
+    enum ReadError
+    {
+        NoError = 0
+      , OpenFileError
+      , ReadHeaderError
+      , ReadRecordError
+    };
+
+public:
+    BamReader(void);
+    virtual ~BamReader(void);
+
+public:
+
+    /// Closes the BAM file reader.
+    void Close(void);
+
+    /// Opens a BAM file for reading.
+    ///
+    /// Prefix \p filename with "http://" or "ftp://" for remote files,
+    /// or set to "-" for stdin.
+    ///
+    /// \param[in] filename path to input BAM file
+    ///
+    /// \returns success/failure
+    bool Open(const std::string& filename);
+
+    /// \returns header as BamHeader object
+    BamHeader::SharedPtr Header(void) const;
+
+    /// \returns error status code
+    BamReader::ReadError Error(void) const;
+
+    /// \returns true if error encountered
+    bool HasError(void) const;
+
+    /// Fetches the next record in a BAM file.
+    ///
+    /// \param[out] record pointer to BamRecord object
+    ///
+    /// \returns succcess/failure
+    bool GetNext(PBBAM_SHARED_PTR<BamRecord> record);
+
+public:
+    std::string PacBioBamVersion(void) const;
+
+protected:
+    bool GetNext(PBBAM_SHARED_PTR<bam1_t> rawRecord);
+    void InitialOpen(void);
+    PBBAM_SHARED_PTR<bam_hdr_t> RawHeader(void) const;
+
+protected:
+    PBBAM_SHARED_PTR<samFile>   file_;
+    PBBAM_SHARED_PTR<bam_hdr_t> header_;
+    std::string filename_;
+    BamReader::ReadError error_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMREADER_H
diff --git a/include/pbbam/BamRecord.h b/include/pbbam/BamRecord.h
new file mode 100644
index 0000000..8630e4b
--- /dev/null
+++ b/include/pbbam/BamRecord.h
@@ -0,0 +1,1018 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef BAMRECORD_H
+#define BAMRECORD_H
+
+#include "pbbam/Accuracy.h"
+#include "pbbam/Frames.h"
+#include "pbbam/BamRecordImpl.h"
+#include "pbbam/BamHeader.h"
+#include "pbbam/LocalContextFlags.h"
+#include "pbbam/Orientation.h"
+#include "pbbam/ReadGroupInfo.h"
+#include "pbbam/Strand.h"
+#include "pbbam/QualityValues.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class BamRecordMemory; }
+
+enum class ClipType
+{
+    CLIP_NONE
+  , CLIP_TO_QUERY
+  , CLIP_TO_REFERENCE
+};
+
+enum class RecordType
+{
+    POLYMERASE
+  , HQREGION
+  , SUBREAD
+  , CCS
+  , SCRAP
+  , UNKNOWN
+};
+
+enum class FrameEncodingType
+{
+    LOSSY
+  , LOSSLESS
+};
+
+class PBBAM_EXPORT BamRecord
+{
+public: // static data
+    static const float photonFactor;
+
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    BamRecord(void);
+    BamRecord(const BamHeader& header);
+    BamRecord(const BamRecordImpl& impl);
+    BamRecord(BamRecordImpl&& impl);
+    BamRecord(const BamRecord& other);
+    BamRecord(BamRecord&& other);
+    BamRecord& operator=(const BamRecord& other);
+    BamRecord& operator=(BamRecord&& other);
+    virtual ~BamRecord(void);
+
+    /// \}
+
+public:
+    /// \name Per-Record Data
+    /// \{
+
+    /// \note AlignedStart is in polymerase read coordinates, NOT genomic coordinates.
+    ///
+    /// \returns the record's aligned start position
+    Position AlignedStart(void) const;
+
+    /// \note AlignedEnd is in polymerase read coordinates, NOT genomic coordinates.
+    ///
+    /// \returns the record's aligned end position
+    Position AlignedEnd(void) const;
+
+    /// \returns the record's strand as a Strand enum value
+    Strand AlignedStrand(void) const;
+
+    /// \returns the record's CIGAR data as a Cigar object
+    Cigar CigarData(void) const;
+
+    /// \returns this record's full name
+    /// \sa BamRecordImpl::Name
+    std::string FullName(void) const;
+
+    /// \returns true if this record has AltLabelQV data
+    bool HasAltLabelQV(void) const;
+
+    /// \returns true if this record has LabelQV data
+    bool HasLabelQV(void) const;
+
+    /// \returns true if this record has DeletionQV data
+    bool HasDeletionQV(void) const;
+
+    /// \returns true if this record has DeletionTag data
+    bool HasDeletionTag(void) const;
+
+    /// \returns true if this record has LocalContextFlags (absent in CCS)
+    bool HasLocalContextFlags(void) const;
+
+    /// \returns true if this record has InsertionQV data
+    bool HasInsertionQV(void) const;
+
+    /// \returns true if this record has Pkmean data
+    bool HasPkmean(void) const;
+
+    /// \returns true if this record has Pkmid data
+    bool HasPkmid(void) const;
+
+    /// \returns true if this record has IPD data
+    bool HasIPD(void) const;
+
+    /// \returns true if this record has PreBaseFrames aka IPD data
+    bool HasPreBaseFrames(void) const;
+
+    /// \returns true if this record has PrePulseFrames data
+    bool HasPrePulseFrames(void) const;
+
+    /// \returns true if this record has PulseCallWidth data
+    bool HasPulseCallWidth(void) const;
+
+    /// \returns true if this record has MergeQV data
+    bool HasMergeQV(void) const;
+
+    /// \returns true if this record has PulseMergeQV data
+    bool HasPulseMergeQV(void) const;
+
+    /// \returns true if this record has PulseWidth data
+    bool HasPulseWidth(void) const;
+
+    /// \returns true if this record has signal-to-noise data (absent in POLYMERASE)
+    bool HasSignalToNoise(void) const;
+
+    /// \returns true if this record has ScrapType data (only in SCRAP)
+    bool HasScrapType(void) const;
+
+    /// \returns true if this record has SubstitutionQV data
+    bool HasSubstitutionQV(void) const;
+
+    /// \returns true if this record has SubstitutionTag data
+    bool HasSubstitutionTag(void) const;
+
+    /// \returns true if this record has AltLabelTag data
+    bool HasAltLabelTag(void) const;
+
+    /// \returns true if this record has PulseCall data
+    bool HasPulseCall(void) const;
+
+    /// \returns true if this record has ReadAccuracyTag data
+    bool HasReadAccuracy(void) const;
+
+    /// \returns true if this record has a HoleNumber
+    bool HasHoleNumber(void) const;
+
+    /// \returns true if this record has QueryStart data
+    bool HasQueryStart(void) const;
+
+    /// \returns true if this record has QueryEnd data
+    bool HasQueryEnd(void) const;
+
+    /// \returns true if this record has Barcode data
+    bool HasBarcodes(void) const;
+
+    /// \returns shared pointer to this record's associated BamHeader
+    BamHeader Header(void) const;
+
+    /// \returns ZMW hole number
+    /// \throws if missing zm tag & record name does not contain hole number
+    int32_t HoleNumber(void) const;
+
+    /// \returns true if this record was mapped by aligner
+    /// \sa BamRecordImpl::IsMapped
+    bool IsMapped(void) const;
+
+    /// \returns this record's LocalContextFlags
+    PacBio::BAM::LocalContextFlags LocalContextFlags(void) const;
+
+    /// \returns this record's mapping quality. A value of 255 indicates "unknown"
+    uint8_t MapQuality(void) const;
+
+    /// \returns this record's movie name
+    std::string MovieName(void) const;
+
+    /// \returns "number of complete passes of the insert"
+    int32_t NumPasses(void) const;
+
+    /// \note QueryStart is in polymerase read coordinates, NOT genomic coordinates.
+    ///
+    /// \returns the record's query start position, or 0 if not stored
+    Position QueryStart(void) const;
+
+    /// \note QueryEnd is in polymerase read coordinates, NOT genomic coordinates.
+    ///
+    /// \returns the record's query end position, or Sequence().length() if not stored
+    Position QueryEnd(void) const;
+
+    /// \returns the left and right barcode ids
+    std::pair<int,int> Barcodes(void) const;
+
+    /// \returns this record's expected read accuracy [0, 1000]
+    Accuracy ReadAccuracy(void) const;
+
+    /// \returns ReadGroupInfo object for this record
+    ReadGroupInfo ReadGroup(void) const;
+
+    /// \returns ID of this record's read group
+    /// \sa ReadGroupInfo::Id
+    std::string ReadGroupId(void) const;
+
+    /// \returns this record's reference ID, or -1 if unmapped.
+    /// \note This is only a valid identifier within this BAM file
+    int32_t ReferenceId(void) const;
+
+    /// \returns this record's reference name.
+    /// \throws an exception if unmapped record.
+    std::string ReferenceName(void) const;
+
+    /// \note ReferenceStart is in reference coordinates, NOT polymerase read coordinates.
+    ///
+    /// \returns the record's reference start position, or UnmappedPosition if unmapped
+    Position ReferenceStart(void) const;
+
+    /// \note ReferenceEnd is in reference coordinates, NOT polymerase read coordinates.
+    ///
+    /// \returns the record's reference end position, or UnmappedPosition if unmapped
+    Position ReferenceEnd(void) const;
+
+    /// \returns this scrap record's ScrapType
+    VirtualRegionType ScrapType(void) const;
+
+    /// \returns this record's average signal-to-noise for each of A, C, G, and T
+    std::vector<float> SignalToNoise(void) const;
+
+    /// \returns this record's type
+    /// \sa RecordType
+    RecordType Type(void) const;
+
+    /// \}
+
+public:
+    /// \name Per-Base Data
+    /// \{
+
+    /// \brief Fetch this record's AltLabelQV values ("pv" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       QVs will have a value of 0.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns AltLabelQV as QualityValues object
+    ///
+    QualityValues AltLabelQV(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's AltLabelTag values ("pt" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       gap chars will be '-' and padding chars will be '*'.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns AltLabelTags string
+    ///
+    std::string AltLabelTag(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's DeletionQV values ("dq" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       QVs will have a value of 0.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns DeletionQV as QualityValues object
+    ///
+    QualityValues DeletionQV(Orientation orientation = Orientation::NATIVE,
+                             bool aligned = false,
+                             bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's DeletionTag values ("dt" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       gap chars will be '-' and padding chars will be '*'.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns DeletionTag string
+    ///
+    std::string DeletionTag(Orientation orientation = Orientation::NATIVE,
+                            bool aligned = false,
+                            bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's InsertionQV values ("iq" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       QVs will have a value of 0.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns InsertionQVs as QualityValues object
+    ///
+    QualityValues InsertionQV(Orientation orientation = Orientation::NATIVE,
+                              bool aligned = false,
+                              bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's IPD values ("ip" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       frames will have a value of 0;
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns IPD as Frames object
+    ///
+    Frames IPD(Orientation orientation = Orientation::NATIVE,
+               bool aligned = false,
+               bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's PreBaseFrames aka IPD values ("ip" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       frames will have a value of 0;
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns IPD as Frames object
+    ///
+    Frames PreBaseFrames(Orientation orientation = Orientation::NATIVE,
+               bool aligned = false,
+               bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's IPD values ("ip" tag), but does not upscale.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns IPD as Frames object
+    ///
+    Frames IPDRaw(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's LabelQV values ("pq" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       QVs will have a value of 0.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns LabelQV as QualityValues object
+    ///
+    QualityValues LabelQV(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's MergeQV values ("mq" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       QVs will have a value of 0.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns MergeQV as QualityValues object
+    ///
+    QualityValues MergeQV(Orientation orientation = Orientation::NATIVE,
+                          bool aligned = false,
+                          bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's PulseMergeQV values ("pg" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       QVs will have a value of 0.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns PulseMergeQV as QualityValues object
+    ///
+    QualityValues PulseMergeQV(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's Pkmean values ("pa" tag).
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns Pkmean as vector<float> object
+    ///
+    std::vector<float> Pkmean(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's Pkmid values ("pm" tag).
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns Pkmid as vector<float> object
+    ///
+    std::vector<float> Pkmid(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's PrePulseFrames values ("pd" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       frames will have a value of 0;
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns PrePulseFrames as Frames object
+    ///
+    Frames PrePulseFrames(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's PulseCall values ("pc" tag).
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns PulseCalls string
+    ///
+    std::string PulseCall(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's PulseCallWidth values ("px" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       frames will have a value of 0;
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns PulseCallWidth as Frames object
+    ///
+    Frames PulseCallWidth(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's PulseWidth values ("pw" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       frames will have a value of 0.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns PulseWidths as Frames object
+    ///
+    Frames PulseWidth(Orientation orientation = Orientation::NATIVE,
+                      bool aligned = false,
+                      bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's PulseWidth values ("pw" tag), but does not upscale.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    ///
+    /// \returns PulseWidth as Frames object
+    ///
+    Frames PulseWidthRaw(Orientation orientation = Orientation::NATIVE) const;
+
+    /// \brief Fetch this record's BAM quality values (QUAL field).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       QVs will have a value of 0.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns BAM qualities as QualityValues object
+    ///
+    QualityValues Qualities(Orientation orientation = Orientation::NATIVE,
+                            bool aligned = false,
+                            bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's DNA sequence (SEQ field).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       gap chars will be '-' and padding chars will be '*'.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns sequence string
+    ///
+    std::string Sequence(const Orientation orientation = Orientation::NATIVE,
+                         bool aligned = false,
+                         bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's SubstitutionQV values ("sq" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       QVs will have a value of 0.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns SubstitutionQV as QualityValues object
+    ///
+    QualityValues SubstitutionQV(Orientation orientation = Orientation::NATIVE,
+                                 bool aligned = false,
+                                 bool exciseSoftClips = false) const;
+
+    /// \brief Fetch this record's SubstitutionTag values ("st" tag).
+    ///
+    /// \note If \p aligned is true, and gaps/padding need to be inserted, the new
+    ///       gap chars will be '-' and padding chars will be '*'.
+    ///
+    /// \param[in] orientation     Orientation of output.
+    /// \param[in] aligned         if true, gaps/padding will be inserted, per Cigar info.
+    /// \param[in] exciseSoftClips if true, any soft-clipped positions will be removed from query ends
+    ///
+    /// \returns SubstitutionTags string
+    ///
+    std::string SubstitutionTag(Orientation orientation = Orientation::NATIVE,
+                                bool aligned = false,
+                                bool exciseSoftClips = false) const;
+
+    /// \}
+
+public:
+    /// \name Low-Level
+    /// \{
+
+    /// \warning This method should be considered temporary and avoided as much as possible.
+    ///          Direct access to the internal object is likely to disappear as BamRecord interface matures.
+    ///
+    /// \returns const reference to underlying BamRecordImpl object
+    const BamRecordImpl& Impl(void) const;
+
+    /// \warning This method should be considered temporary and avoided as much as possible.
+    ///          Direct access to the internal object is likely to disappear as BamRecord interface matures.
+    ///
+    /// \returns reference to underlying BamRecordImpl object
+    BamRecordImpl& Impl(void);
+
+    /// \}
+
+public:
+    /// \name Per-Record Data
+    /// \{
+    ///
+
+    /// Sets this record's ZMW hole number.
+    ///
+    /// \param[in] numPasses
+    /// \returns reference to this record
+    BamRecord& HoleNumber(const int32_t holeNumber);
+
+    /// Sets this record's local context flags
+    ///
+    /// \param[in] flags
+    /// \returns reference to this record
+    BamRecord& LocalContextFlags(const PacBio::BAM::LocalContextFlags flags);
+
+    /// Sets this record's "number of complete passes of the insert".
+    ///
+    /// \param[in] numPasses
+    /// \returns reference to this record
+    BamRecord& NumPasses(const int32_t numPasses);
+
+    /// Sets this record's expected read accuracy [0, 1000]
+    ///
+    /// \param[in] accuracy
+    /// \returns reference to this record
+    BamRecord& ReadAccuracy(const Accuracy& accuracy);
+
+    /// Sets this record's average signal-to-noise in each of A, C, G, and T
+    ///
+    /// \param[in] average signal-to-noise of A, C, G, and T (in this order)
+    /// \returns reference to this record
+    BamRecord& SignalToNoise(const std::vector<float>& snr);
+
+    /// Sets this scrap record's ScrapType
+    ///
+    /// \param[in] ScrapType of type VirtualRegionType
+    /// \returns reference to this record
+    BamRecord& ScrapType(const VirtualRegionType type);
+
+    /// Sets this scrap record's ScrapType
+    ///
+    /// \param[in] ScrapType as char
+    /// \returns reference to this record
+    BamRecord& ScrapType(const char type);
+
+    /// \}
+
+public:
+    /// \name Per-Base Data
+    /// \{
+
+    /// Sets this record's AltLabelQV values ("pv" tag).
+    ///
+    /// \param[in] altLabelQVs
+    /// \returns reference to this record
+    BamRecord& AltLabelQV(const QualityValues& altLabelQVs);
+
+    /// Sets this record's LabelQV values ("pq" tag).
+    ///
+    /// \param[in] labelQVs
+    /// \returns reference to this record
+    BamRecord& LabelQV(const QualityValues& labelQVs);
+
+    /// Sets this record's DeletionQV values ("dq" tag).
+    ///
+    /// \param[in] deletionQVs
+    /// \returns reference to this record
+    BamRecord& DeletionQV(const QualityValues& deletionQVs);
+
+    /// Sets this record's DeletionTag values ("dt" tag).
+    ///
+    /// \param[in] tags
+    /// \returns reference to this record
+    BamRecord& DeletionTag(const std::string& tags);
+
+    /// Sets this record's InsertionQV values ("iq" tag).
+    ///
+    /// \param[in] insertionQVs
+    /// \returns reference to this record
+    BamRecord& InsertionQV(const QualityValues& insertionQVs);
+
+    /// Sets this record's Pkmid values ("pa" tag).
+    ///
+    /// \param[in] photons
+    /// \returns reference to this record
+    BamRecord& Pkmid(const std::vector<float>& photons);
+
+    /// Sets this record's Pkmid values ("pa" tag).
+    ///
+    /// \param[in] encoded photons
+    /// \returns reference to this record
+    BamRecord& Pkmid(const std::vector<uint16_t>& encodedPhotons);
+
+    /// Sets this record's Pkmean values ("pm" tag).
+    ///
+    /// \param[in] photons
+    /// \returns reference to this record
+    BamRecord& Pkmean(const std::vector<float>& photons);
+
+    /// Sets this record's Pkmean values ("pm" tag).
+    ///
+    /// \param[in] encoded photons
+    /// \returns reference to this record
+    BamRecord& Pkmean(const std::vector<uint16_t>& encodedPhotons);
+
+    /// Sets this record's IPD values ("ip" tag).
+    ///
+    /// \param[in] frames
+    /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+    /// \returns reference to this record
+    BamRecord& IPD(const Frames& frames,
+                   const FrameEncodingType encoding);
+
+    /// Sets this record's PreBaseFrames aka IPD values ("ip" tag).
+    ///
+    /// \param[in] frames
+    /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+    /// \returns reference to this record
+    BamRecord& PreBaseFrames(const Frames& frames,
+                             const FrameEncodingType encoding);
+
+    /// Sets this record's PrePulseFrames values ("pd" tag).
+    ///
+    /// \param[in] frames
+    /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+    /// \returns reference to this record
+    BamRecord& PrePulseFrames(const Frames& frames,
+                              const FrameEncodingType encoding);
+
+    /// Sets this record's PulseCallWidth values ("px" tag).
+    ///
+    /// \param[in] frames
+    /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+    /// \returns reference to this record
+    BamRecord& PulseCallWidth(const Frames& frames,
+                              const FrameEncodingType encoding);
+
+    /// Sets this record's MergeQV values ("mq" tag).
+    ///
+    /// \param[in] mergeQVs
+    /// \returns reference to this record
+    BamRecord& MergeQV(const QualityValues& mergeQVs);
+
+    /// Sets this record's PulseMergeQV values ("pg" tag).
+    ///
+    /// \param[in] pulseMergeQVs
+    /// \returns reference to this record
+    BamRecord& PulseMergeQV(const QualityValues& pulseMergeQVs);
+
+    /// Sets this record's PulseWidth values ("pw" tag).
+    ///
+    /// \param[in] frames
+    /// \param[in] encoding specify how to encode the data (8-bit lossy, or 16-bit lossless)
+    /// \returns reference to this record
+    BamRecord& PulseWidth(const Frames& frames,
+                          const FrameEncodingType encoding);
+
+    /// Sets this record's SubstitutionQV values ("sq" tag).
+    ///
+    /// \param[in] substitutionQVs
+    /// \returns reference to this record
+    BamRecord& SubstitutionQV(const QualityValues& substitutionQVs);
+
+    /// Sets this record's SubstitutionTag values ("st" tag).
+    ///
+    /// \param[in] tags
+    /// \returns reference to this record
+    BamRecord& SubstitutionTag(const std::string& tags);
+
+    /// Sets this record's AltLabelTag values ("at" tag).
+    ///
+    /// \param[in] tags
+    /// \returns reference to this record
+    BamRecord& AltLabelTag(const std::string& tags);
+
+    /// Sets this record's PulseCall values ("pc" tag).
+    ///
+    /// \param[in] tags
+    /// \returns reference to this record
+    BamRecord& PulseCall(const std::string& tags);
+
+    /// \}
+
+public:
+   BamRecord& QueryEnd(const PacBio::BAM::Position pos);
+   BamRecord& QueryStart(const PacBio::BAM::Position pos);
+
+   /// Resets cached aligned start/end.
+   ///
+   /// \note This method should not be needed in most client code. It exists
+   /// primarily as a hook for internal reading loops (queries, index build, etc.)
+   /// It's essentially a workaround and will likely be removed from the API as
+   /// soon as possible.
+   ///
+   void ResetCachedPositions(void) const;
+
+   /// Resets cached aligned start/end.
+   ///
+   /// \note This method should not be needed in most client code. It exists
+   /// primarily as a hook for internal reading loops (queries, index build, etc.)
+   /// It's essentially a workaround and will likely be removed from the API as
+   /// soon as possible.
+   ///
+   void ResetCachedPositions(void);
+
+   void UpdateName(void);
+
+   static std::vector<uint16_t> EncodePhotons(const std::vector<float>& data);
+
+   BamRecord& ReadGroup(const ReadGroupInfo& rg);
+   BamRecord& ReadGroupId(const std::string& id);
+
+//    BamRecord& ReferenceStart(const PacBio::BAM::Position pos);
+
+public:
+    /// \name Clipping & Mapping
+    /// \{
+
+    /// Creates a copied record from input, with clipping applied
+    static BamRecord Clipped(const BamRecord& input,
+                             const ClipType clipType,
+                             const PacBio::BAM::Position start,
+                             const PacBio::BAM::Position end);
+
+    /// Creates a copied record from input, with mapping applied
+    static BamRecord Mapped(const BamRecord& input,
+                            const int32_t referenceId,
+                            const Position refStart,
+                            const Strand strand,
+                            const Cigar& cigar,
+                            const uint8_t mappingQuality);
+
+    /// Applies clipping to this record
+    BamRecord& Clip(const ClipType clipType,
+                    const PacBio::BAM::Position start,
+                    const PacBio::BAM::Position end);
+
+    /// Creates a copied record from this one, with clipping applied
+    BamRecord Clipped(const ClipType clipType,
+                      const PacBio::BAM::Position start,
+                      const PacBio::BAM::Position end) const;
+
+    /// Applies mapping to this record
+    BamRecord& Map(const int32_t referenceId,
+                   const Position refStart,
+                   const Strand strand,
+                   const Cigar& cigar,
+                   const uint8_t mappingQuality);
+
+    /// Creates a copied record from this one, with mapping applied
+    BamRecord Mapped(const int32_t referenceId,
+                     const Position refStart,
+                     const Strand strand,
+                     const Cigar& cigar,
+                     const uint8_t mappingQuality) const;
+
+    /// \}
+private:
+    BamRecordImpl impl_;
+
+public:
+    // public & mutable so that queries can directly set the header info,
+    // even on a record that is const from client code's perspective
+    mutable BamHeader header_;
+    
+private:
+    // cached positions (mutable to allow lazy-calc in const methods)
+    mutable Position alignedStart_;
+    mutable Position alignedEnd_;
+
+private:
+    std::vector<float> FetchPhotons(const std::string& tagName,
+                                    const Orientation orientation) const;
+    std::string FetchBasesRaw(const std::string& tagName) const;
+
+    std::string FetchBases(const std::string& tagName,
+                           const Orientation orientation) const;
+
+    std::string FetchBases(const std::string& tagName,
+                           const Orientation orientation,
+                           const bool aligned,
+                           const bool exciseSoftClips) const;
+
+    Frames FetchFramesRaw(const std::string& tagName) const;
+
+    Frames FetchFrames(const std::string& tagName,
+                       const Orientation orientation) const;
+
+    Frames FetchFrames(const std::string& tagName,
+                       const Orientation orientation,
+                       const bool aligned,
+                       const bool exciseSoftClips) const;
+
+    QualityValues FetchQualitiesRaw(const std::string& tagName) const;
+
+    QualityValues FetchQualities(const std::string& tagName,
+                                 const Orientation orientation) const;
+
+    QualityValues FetchQualities(const std::string& tagName,
+                                 const Orientation orientation,
+                                 const bool aligned,
+                                 const bool exciseSoftClips) const;
+
+private:
+    // marked const to allow calling from const methods
+    // but updates our mutable cached values
+    void CalculateAlignedPositions(void) const;
+
+    friend class internal::BamRecordMemory;
+};
+
+inline
+BamRecord BamRecord::Clipped(const BamRecord& input,
+                             const ClipType clipType,
+                             const PacBio::BAM::Position start,
+                             const PacBio::BAM::Position end)
+{
+    return input.Clipped(clipType, start, end);
+}
+
+inline
+BamRecord BamRecord::Clipped(const ClipType clipType,
+                             const PacBio::BAM::Position start,
+                             const PacBio::BAM::Position end) const
+{
+    BamRecord result(*this);
+    result.Clip(clipType, start, end);
+    return result;
+}
+
+inline
+BamRecord BamRecord::Mapped(const BamRecord& input,
+                            const int32_t referenceId,
+                            const Position refStart,
+                            const Strand strand,
+                            const Cigar& cigar,
+                            const uint8_t mappingQuality)
+{
+    return input.Mapped(referenceId, refStart, strand, cigar, mappingQuality);
+}
+
+inline
+BamRecord BamRecord::Mapped(const int32_t referenceId,
+                            const Position refStart,
+                            const Strand strand,
+                            const Cigar& cigar,
+                            const uint8_t mappingQuality) const
+{
+    BamRecord result(*this);
+    result.Map(referenceId, refStart, strand, cigar, mappingQuality);
+    return result;
+}
+
+class PBBAM_EXPORT BamRecordView
+{
+public:
+    BamRecordView(const BamRecord& record,
+                  const Orientation orientation,
+                  const bool aligned,
+                  const bool exciseSoftClips)
+        : record_(record)
+        , orientation_(orientation)
+        , aligned_(aligned)
+        , exciseSoftClips_(exciseSoftClips)
+    { }
+
+public:
+    QualityValues AltLabelQVs(void) const
+    { return record_.AltLabelQV(orientation_); }
+
+    std::string AltLabelTags(void) const
+    { return record_.AltLabelTag(orientation_); }
+
+    QualityValues DeletionQVs(void) const
+    { return record_.DeletionQV(orientation_, aligned_, exciseSoftClips_); }
+
+    std::string DeletionTags(void) const
+    { return record_.DeletionTag(orientation_, aligned_, exciseSoftClips_); }
+
+    QualityValues InsertionQVs(void) const
+    { return record_.InsertionQV(orientation_, aligned_, exciseSoftClips_); }
+
+    Frames IPD(void) const
+    { return record_.IPD(orientation_, aligned_, exciseSoftClips_); }
+
+    Frames PrebaseFrames(void) const
+    { return record_.IPD(orientation_, aligned_, exciseSoftClips_); }
+
+    QualityValues LabelQVs(void) const
+    { return record_.LabelQV(orientation_); }
+
+    QualityValues MergeQVs(void) const
+    { return record_.MergeQV(orientation_, aligned_, exciseSoftClips_); }
+
+    QualityValues PulseMergeQVs(void) const
+    { return record_.PulseMergeQV(orientation_); }
+
+    std::vector<float> Pkmean(void) const
+    { return record_.Pkmean(orientation_); }
+
+    std::vector<float> Pkmid(void) const
+    { return record_.Pkmid(orientation_); }
+
+    Frames PrePulseFrames(void) const
+    { return record_.PrePulseFrames(orientation_); }
+
+    std::string PulseCalls(void) const
+    { return record_.PulseCall(orientation_); }
+
+    Frames PulseCallWidth(void) const
+    { return record_.PulseCallWidth(orientation_); }
+
+    Frames PulseWidths(void) const
+    { return record_.PulseWidth(orientation_, aligned_, exciseSoftClips_); }
+
+    QualityValues Qualities(void) const
+    { return record_.Qualities(orientation_, aligned_, exciseSoftClips_); }
+
+    std::string Sequence(void) const
+    { return record_.Sequence(orientation_, aligned_, exciseSoftClips_); }
+
+    QualityValues SubstitutionQVs(void) const
+    { return record_.SubstitutionQV(orientation_, aligned_, exciseSoftClips_); }
+
+    std::string SubstitutionTags(void) const
+    { return record_.SubstitutionTag(orientation_, aligned_, exciseSoftClips_); }
+
+private:
+    const BamRecord& record_;
+    Orientation orientation_;
+    bool aligned_;
+    bool exciseSoftClips_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMRECORD_H
diff --git a/include/pbbam/BamRecordBuilder.h b/include/pbbam/BamRecordBuilder.h
new file mode 100644
index 0000000..81002da
--- /dev/null
+++ b/include/pbbam/BamRecordBuilder.h
@@ -0,0 +1,268 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef BAMRECORDBUILDER_H
+#define BAMRECORDBUILDER_H
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/BamHeader.h"
+#include "pbbam/Config.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT BamImplBuilder
+{
+
+};
+
+
+class PBBAM_EXPORT BamRecordBuilder
+{
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    BamRecordBuilder(void);
+    explicit BamRecordBuilder(const BamHeader& header);
+    BamRecordBuilder(const BamRecord& prototype);
+    BamRecordBuilder(const BamRecordBuilder& other);
+    BamRecordBuilder(BamRecordBuilder&& other);
+    BamRecordBuilder& operator=(const BamRecordBuilder& other);
+    BamRecordBuilder& operator=(BamRecordBuilder&& other);
+    ~BamRecordBuilder(void);
+
+    /// \}
+
+public:
+    /// \name Record-Building
+    /// \{
+
+    /// Builds a BamRecord from current builder attributes
+    ///
+    /// \returns BamRecord object
+    BamRecord Build(void) const;
+
+    /// Replaces an existing BamRecord's data with current builder attributes
+    ///
+    /// \param[out] record resulting record
+    /// \returns true if successful
+    bool BuildInPlace(BamRecord& record) const;
+
+    /// Resets builder attributes to default values
+    void Reset(void);
+
+    /// Resets builder attributes with existing BamRecord data
+    ///
+    /// \param[in] prototype
+    void Reset(const BamRecord& prototype);
+
+    /// Resets builder attributes with existing BamRecord data
+    ///
+    /// \param[in] prototype
+    void Reset(BamRecord&& prototype);
+
+    /// \}
+
+public:
+
+    /// \name Core Attribute Setup
+    /// \{
+
+    /// Sets the record's (BAI) index bin ID.
+    ///
+    /// \param[in] bin BAI index bin ID.
+    /// \returns reference to this builder
+    BamRecordBuilder& Bin(const uint32_t bin);
+
+    /// Sets this record's alignment flag, using a raw integer.
+    ///
+    /// \param[in] flag raw alignment flag
+    /// \returns reference to this record
+    BamRecordBuilder& Flag(const uint32_t flag);
+
+    /// Sets this record's insert size.
+    ///
+    /// \param[in] iSize insert size
+    /// \returns reference to this record
+    BamRecordBuilder& InsertSize(const int32_t iSize);
+
+    /// Sets this record's map quality.
+    ///
+    /// \param[in] mapQual mapping quality - value of 255 indicates "unknown"
+    /// \returns reference to this record
+    BamRecordBuilder& MapQuality(const uint8_t mapQual);
+
+    /// Sets this record's mate's mapped position.
+    ///
+    /// \param[in] pos mapped position. A value of -1 indicates unmapped.
+    /// \returns reference to this record
+    BamRecordBuilder& MatePosition(const int32_t pos);
+
+    /// Sets this record's mate's mapped reference ID
+    ///
+    /// \param[in] id reference ID. A value of -1 indicates unmapped.
+    /// \returns reference to this record
+    BamRecordBuilder& MateReferenceId(const int32_t id);
+
+    /// Sets this record's mapped position.
+    ///
+    /// \param[in] pos mapped position. A value of -1 indicates unmapped.
+    /// \returns reference to this record
+    BamRecordBuilder& Position(const int32_t pos);
+
+    /// Sets this record's mapped reference ID
+    ///
+    /// \param[in] id reference ID. A value of -1 indicates unmapped.
+    /// \returns reference to this record
+    BamRecordBuilder& ReferenceId(const int32_t id);
+
+    /// \}
+
+public:
+    /// \name Alignment Flag Setup
+    /// \{
+
+    /// Sets whether this record is a PCR/optical duplicate
+    BamRecordBuilder& SetDuplicate(bool ok);
+
+    /// Sets whether this record failed quality controls
+    BamRecordBuilder& SetFailedQC(bool ok);
+
+    /// Sets whether this record is the first mate of a pair.
+    BamRecordBuilder& SetFirstMate(bool ok);
+
+    /// Sets whether this record was aligned.
+    BamRecordBuilder& SetMapped(bool ok);
+
+    /// Sets whether this record's mate was aligned.
+    BamRecordBuilder& SetMateMapped(bool ok);
+
+    /// Sets whether this record's mate mapped to reverse strand.
+    BamRecordBuilder& SetMateReverseStrand(bool ok);
+
+    /// Sets whether this record came from paired-end sequencing.
+    BamRecordBuilder& SetPaired(bool ok);
+
+    /// Sets whether this record is a read's primary alignment.
+    BamRecordBuilder& SetPrimaryAlignment(bool ok);
+
+    /// Sets whether this record & its mate were properly mapped, per the aligner.
+    BamRecordBuilder& SetProperPair(bool ok);
+
+    /// Sets whether this record mapped to reverse strand.
+    BamRecordBuilder& SetReverseStrand(bool ok);
+
+    /// Sets whether this record is the second mate of a pair.
+    BamRecordBuilder& SetSecondMate(bool ok);
+
+    /// Sets whether this record is a supplementary alignment.
+    BamRecordBuilder& SetSupplementaryAlignment(bool ok);
+
+    /// \}
+
+public:
+    /// \name Variable-Length Data Setup
+    /// \{
+
+    BamRecordBuilder& Name(const std::string& name);
+    BamRecordBuilder& Name(std::string&& name);
+
+    BamRecordBuilder& Sequence(const std::string& sequence);
+    BamRecordBuilder& Sequence(std::string&& sequence);
+
+    BamRecordBuilder& Qualities(const std::string& qualities);
+    BamRecordBuilder& Qualities(std::string&& qualities);
+
+    BamRecordBuilder& Cigar(const PacBio::BAM::Cigar& cigar);
+    BamRecordBuilder& Cigar(PacBio::BAM::Cigar&& cigar);
+
+    BamRecordBuilder& Tags(const TagCollection& tags);
+    BamRecordBuilder& Tags(TagCollection&& tags);
+
+private:
+    BamHeader header_;
+
+    bam1_core_t core_;
+    std::string name_;
+    std::string sequence_;
+    std::string qualities_;
+    PacBio::BAM::Cigar cigar_;
+    TagCollection tags_;
+};
+
+inline BamRecordBuilder& BamRecordBuilder::Bin(const uint32_t bin)
+{ core_.bin = bin; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Flag(const uint32_t flag)
+{ core_.flag = flag; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::InsertSize(const int32_t iSize)
+{ core_.isize = iSize; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::MapQuality(const uint8_t mapQual)
+{ core_.qual = mapQual; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::MatePosition(const int32_t pos)
+{ core_.mpos = pos; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::MateReferenceId(const int32_t id)
+{ core_.mtid = id; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Position(const int32_t pos)
+{ core_.pos = pos; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Qualities(const std::string& qualities)
+{ qualities_ = qualities; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Qualities(std::string&& qualities)
+{ qualities_ = std::move(qualities); return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::ReferenceId(const int32_t id)
+{ core_.tid = id; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Tags(const TagCollection& tags)
+{ tags_ = tags; return *this; }
+
+inline BamRecordBuilder& BamRecordBuilder::Tags(TagCollection&& tags)
+{ tags_ = std::move(tags); return *this; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMRECORDBUILDER_H
diff --git a/include/pbbam/BamRecordImpl.h b/include/pbbam/BamRecordImpl.h
new file mode 100644
index 0000000..c42ef0a
--- /dev/null
+++ b/include/pbbam/BamRecordImpl.h
@@ -0,0 +1,622 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef BAMRECORDIMPL_H
+#define BAMRECORDIMPL_H
+
+#include "htslib/sam.h"
+#include "pbbam/Cigar.h"
+#include "pbbam/Config.h"
+#include "pbbam/Position.h"
+#include "pbbam/QualityValues.h"
+#include "pbbam/TagCollection.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class BamRecordMemory; }
+
+/// \brief The BamRecordImpl class holds all data necessary for creating,
+/// querying or editing a valid, generic BAM record.
+///
+/// For PacBio-specific extensions and convenience methods, see BamRecord.
+///
+class PBBAM_EXPORT BamRecordImpl
+{
+public:
+
+    /// These flags describe the alignment status of the record.
+    enum AlignmentFlag
+    {
+        PAIRED              = 0x0001    ///< Record comes from paired-end sequencing
+      , PROPER_PAIR         = 0x0002    ///< Each mate of a pair was properly aligned ("proper" as determined by aligner)
+      , UNMAPPED            = 0x0004    ///< Record was not mapped by aligner
+      , MATE_UNMAPPED       = 0x0008    ///< Record's mate was not mapped by aligner
+      , REVERSE_STRAND      = 0x0010    ///< Record was aligned to reverse strand (Sequence() is reverse-complemented)
+      , MATE_REVERSE_STRAND = 0x0020    ///< Record's mate was aligned to reverse strand (mate's Sequence() is reverse-complemented)
+      , MATE_1              = 0x0040    ///< Record is first mate of pair
+      , MATE_2              = 0x0080    ///< Record is second mate of pair
+      , SECONDARY           = 0x0100    ///< Record is a secondary alignment
+      , FAILED_QC           = 0x0200    ///< Record failed quality controls
+      , DUPLICATE           = 0x0400    ///< Record is a PCR/optical duplicate
+      , SUPPLEMENTARY       = 0x0800    ///< Record is a supplementary alignment
+    };
+
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    BamRecordImpl(void);
+    BamRecordImpl(const BamRecordImpl& other);
+    BamRecordImpl(BamRecordImpl&& other);
+    BamRecordImpl& operator=(const BamRecordImpl& other);
+    BamRecordImpl& operator=(BamRecordImpl&& other);
+    virtual ~BamRecordImpl(void);
+
+    /// \}
+
+public:
+
+    /** @name Core Data
+     */
+    ///@{
+
+    /// \returns this record's assigned (BAI) index bin ID.
+    inline uint32_t Bin(void) const;
+
+    /// \returns this record's alignment flag, in raw integer form.
+    inline uint32_t Flag(void) const;
+
+    /// \returns this record's insert size
+    inline int32_t InsertSize(void) const;
+
+    /// \returns this record's mapping quality. A value of 255 indicates "unknown"
+    inline uint8_t MapQuality(void) const;
+
+    /// \returns this record's mate's mapped position, or -1 if unmapped
+    inline PacBio::BAM::Position MatePosition(void) const;
+
+    /// \returns this record's mate's mapped reference ID, or -1 if unmapped
+    inline int32_t MateReferenceId(void) const;
+
+    /// \returns this record's mapped position, or -1 if unmapped
+    inline PacBio::BAM::Position Position(void) const;
+
+    /// \returns this record's mate's mapped reference ID, or -1 if unmapped
+    inline int32_t ReferenceId(void) const;
+
+    /// Sets the record's (BAI) index bin ID.
+    ///
+    /// \param[in] bin BAI index bin ID.
+    /// \returns reference to this record
+    inline BamRecordImpl& Bin(uint32_t bin);
+
+    /// Sets this record's alignment flag, using a raw integer.
+    ///
+    /// \param[in] flag raw alignment flag
+    /// \returns reference to this record
+    inline BamRecordImpl& Flag(uint32_t flag);
+
+    /// Sets this record's insert size.
+    ///
+    /// \param[in] iSize insert size
+    /// \returns reference to this record
+    inline BamRecordImpl& InsertSize(int32_t iSize);
+
+    /// Sets this record's map quality.
+    ///
+    /// \param[in] mapQual mapping quality - value of 255 indicates "unknown"
+    /// \returns reference to this record
+    inline BamRecordImpl& MapQuality(uint8_t mapQual);
+
+    /// Sets this record's mate's mapped position.
+    ///
+    /// \param[in] pos mapped position. A value of -1 indicates unmapped.
+    /// \returns reference to this record
+    inline BamRecordImpl& MatePosition(PacBio::BAM::Position pos);
+
+    /// Sets this record's mate's mapped reference ID
+    ///
+    /// \param[in] id reference ID. A value of -1 indicates unmapped.
+    /// \returns reference to this record
+    inline BamRecordImpl& MateReferenceId(int32_t id);
+
+    /// Sets this record's mapped position.
+    ///
+    /// \param[in] pos mapped position. A value of -1 indicates unmapped.
+    /// \returns reference to this record
+    inline BamRecordImpl& Position(PacBio::BAM::Position pos);
+
+    /// Sets this record's mapped reference ID
+    ///
+    /// \param[in] id reference ID. A value of -1 indicates unmapped.
+    /// \returns reference to this record
+    inline BamRecordImpl& ReferenceId(int32_t id);
+
+    ///@}
+
+public:
+    /** @name Alignment Flags
+     */
+    ///@{
+
+    /// \returns true if this record is a PCR/optical duplicate
+    inline bool IsDuplicate(void) const;
+
+    /// \returns true if this record failed quality controls
+    inline bool IsFailedQC(void) const;
+
+    /// \returns true if this record is the first mate of a pair
+    inline bool IsFirstMate(void) const;
+
+    /// \returns true if this record was mapped by aligner
+    inline bool IsMapped(void) const;
+
+    /// \returns true if this record's mate was mapped by aligner
+    inline bool IsMateMapped(void) const;
+
+    /// \returns true if this record's mate was mapped to the reverse strand
+    inline bool IsMateReverseStrand(void) const;
+
+    /// \returns true if this record comes from paired-end sequencing
+    inline bool IsPaired(void) const;
+
+    /// \returns true if this record is a read's primary alignment
+    inline bool IsPrimaryAlignment(void) const;
+
+    /// \returns true if this record & its mate were properly aligned
+    inline bool IsProperPair(void) const;
+
+    /// \returns true if this record was mapped to the reverse strand
+    inline bool IsReverseStrand(void) const;
+
+    /// \returns true if this record is the second mate of a pair
+    inline bool IsSecondMate(void) const;
+
+    /// \returns true if this record is a supplementary alignment
+    inline bool IsSupplementaryAlignment(void) const;
+
+    /// Sets whether this record is a PCR/optical duplicate
+    inline BamRecordImpl& SetDuplicate(bool ok);
+
+    /// Sets whether this record failed quality controls
+    inline BamRecordImpl& SetFailedQC(bool ok);
+
+    /// Sets whether this record is the first mate of a pair.
+    inline BamRecordImpl& SetFirstMate(bool ok);
+
+    /// Sets whether this record was aligned.
+    inline BamRecordImpl& SetMapped(bool ok);
+
+    /// Sets whether this record's mate was aligned.
+    inline BamRecordImpl& SetMateMapped(bool ok);
+
+    /// Sets whether this record's mate mapped to reverse strand.
+    inline BamRecordImpl& SetMateReverseStrand(bool ok);
+
+    /// Sets whether this record came from paired-end sequencing.
+    inline BamRecordImpl& SetPaired(bool ok);
+
+    /// Sets whether this record is a read's primary alignment.
+    inline BamRecordImpl& SetPrimaryAlignment(bool ok);
+
+    /// Sets whether this record & its mate were properly mapped, per the aligner.
+    inline BamRecordImpl& SetProperPair(bool ok);
+
+    /// Sets whether this record mapped to reverse strand.
+    inline BamRecordImpl& SetReverseStrand(bool ok);
+
+    /// Sets whether this record is the second mate of a pair.
+    inline BamRecordImpl& SetSecondMate(bool ok);
+
+    /// Sets whether this record is a supplementary alignment.
+    inline BamRecordImpl& SetSupplementaryAlignment(bool ok);
+
+    ///@}
+
+public:
+    /** @name Variable-length Data (sequence, qualities, etc.)
+     */
+    ///@{
+
+    /// \returns the record's CIGAR data as a Cigar object
+    Cigar CigarData(void) const;
+
+    /// Sets the record's CIGAR data using a Cigar object
+    ///
+    /// \param[in] cigar PacBio::BAM::Cigar object
+    ///
+    /// \returns reference to this record
+    BamRecordImpl& CigarData(const Cigar& cigar);
+
+    /// Sets the record's CIGAR data using a CIGAR-formatted string.
+    ///
+    /// \param[in] cigarString CIGAR-formatted string
+    ///
+    /// \returns reference to this record
+    BamRecordImpl& CigarData(const std::string& cigarString);
+
+    // TODO: CIGAR iterator - Cigar only or here as well ??
+
+    /// \returns the record's query name
+    std::string Name(void) const;
+
+    /// Sets the record's "query name".
+    ///
+    /// \param name new name
+    ///
+    /// \returns reference to this record
+    BamRecordImpl& Name(const std::string& name);
+
+    /// \returns the record's quality values (phred-style ASCII)
+    ///
+    /// \note Usually Qualities().size() == Sequence.size(). However, in
+    ///       some data sets, the quality values are not provided. In that
+    ///       case, this method will return an empty container.
+    QualityValues Qualities(void) const;
+
+    /// \returns the record's DNA sequence.
+    std::string Sequence(void) const;
+
+    /// \brief Sets the record's DNA sequence and quality values
+    ///
+    /// This is an overloaded function. Sets the DNA sequence and quality values,
+    /// using the length of \p sequence.
+    ///
+    /// \note When using this overload (and \p qualities is non-empty), the lengths
+    ///       of \p sequence and \p qualities \b must be equal.
+    ///
+    /// \todo How to handle mismatched lenths?
+    ///
+    /// \param[in] sequence  std::string containing DNA sequence
+    /// \param[in] qualities std::string containing ASCII quality values
+    ///
+    /// \returns reference to this record.
+    ///
+    /// \sa SetSequenceAndQualities(const char* sequence, const size_t sequenceLength, const char* qualities)
+    ///
+    BamRecordImpl& SetSequenceAndQualities(const std::string& sequence,
+                                           const std::string& qualities = std::string());
+
+    /// \brief Sets the record's DNA sequence and quality values.
+    ///
+    /// The \p sequence must consist of IUPAC nucleotide codes {=ACMGRSVTWYHKDBN}.
+    /// The \p qualities, if not empty, must consist of 'phred'-style ASCII quality
+    /// values. \p qualities may be an empty string or NULL pointer in cases where
+    /// there are no such data available.
+    ///
+    /// \param[in] sequence       C-string containing DNA sequence
+    /// \param[in] sequenceLength length of DNA sequence
+    /// \param[in] qualities      C-string containing 'phred-style' ASCII quality values
+    ///
+    /// \note \p sequence does \b NOT have to be NULL-terminated. Length is explicitly
+    ///        determined by the value of \p sequenceLength provided.
+    ///
+    /// \returns reference to this record.
+    ///
+    BamRecordImpl& SetSequenceAndQualities(const char* sequence,
+                                           const size_t sequenceLength,
+                                           const char* qualities = 0);
+
+    /// \brief Sets the record's DNA sequence and quality values.
+    ///
+    /// The \p encodedSequence should be preencoded/packed into the BAM binary format.
+    /// The \p qualities, if not empty, must consist of 'phred'-style ASCII quality values.
+    /// \p qualities may be an empty string or NULL pointer in cases where there are no
+    /// such data available.
+    ///
+    /// \param[in] encodedSequence   C-string containing BAM-format-encoded DNA sequence
+    /// \param[in] rawSequenceLength length of DNA sequence (not the encoded length)
+    /// \param[in] qualities         C-string containing 'phred-style' ASCII quality values
+    ///
+    /// \note \p encodedSequence does \b NOT have to be NULL-terminated. Length is explicitly
+    ///        determined by the value of \p sequenceLength provided.
+    ///
+    /// \returns reference to this record.
+    ///
+    /// \sa SetSequenceAndQualities(const char* sequence, const size_t sequenceLength, const char* qualities)
+    ///
+    BamRecordImpl& SetPreencodedSequenceAndQualities(const char* encodedSequence,
+                                                     const size_t rawSequenceLength,
+                                                     const char* qualities = 0);
+
+public:
+    /** @name Tag Data
+     */
+    ///@{
+
+    /// \returns record's full tag data as a TagCollection object
+    TagCollection Tags(void) const;
+
+    /// Sets the record's full tag data via a TagCollection object
+    BamRecordImpl& Tags(const TagCollection& tags);
+
+    /// Adds a new tag to this record.
+    ///
+    /// \param[in] tagName 2-character tag name.
+    /// \param[in] value Tag object that describes the type & value of data to be added
+    ///
+    /// \note Any value that can be used to implicitly construct a Tag is valid.
+    /// \code
+    ///     string s;
+    ///     vector<uint32_t> v;
+    ///     record.AddTag("XX", s); // will add a string-type tag
+    ///     record.AddTag("YY", v); // will add a uint32-array-type tag
+    /// \endcode
+    ///
+    /// \returns true if tag was successfully added.
+    bool AddTag(const std::string& tagName, const Tag& value);
+
+    /// Edits an existing tag on this record.
+    ///
+    /// \param[in] tagName 2-character tag name. Name must be present (see HasTag)
+    /// \param[in] newValue Tag object that describes the type & value of new data to be added
+    ///
+    /// \note Any value that can be used to implicitly construct a Tag is valid.
+    /// \code
+    ///     string s;
+    ///     vector<uint32_t> v;
+    ///     record.EditTag("XX", s); // will overwrite tag XX with a string-type Tag
+    ///     record.EditTag("YY", v); // will overwrite tag YY with a uint32-array-type Tag
+    /// \endcode
+    ///
+    /// \returns true if tag was successfully edited.
+    bool EditTag(const std::string& tagName, const Tag& newValue);
+
+    /// \returns true if a tag with this name is present in this record.
+    bool HasTag(const std::string& tagName) const;
+
+    /// Removes an existing tag from this record.
+    ///
+    /// \param[in] tagName 2-character tag name.
+    ///
+    /// \returns true if tag was actaully removed (i.e. false if tagName previously unknown)
+    /// \sa HasTag
+    bool RemoveTag(const std::string& tagName);
+
+    /// Fetches a tag from this record.
+    ///
+    /// \param[in] tagName 2-character tag name.
+    ///
+    /// \returns Tag object for the requested name. If name is unknown, a default constructed
+    ///          Tag is returned (Tag::IsNull() is true).
+    Tag TagValue(const std::string& tagName) const;
+
+    // change above to Tag();
+
+//    template<typename T>
+//    T TagValue(const std::string& tagName) const;
+
+
+    ///@}
+
+private:
+    // returns a BamRecordImpl object, with a deep copy of @rawData contents
+    static BamRecordImpl FromRawData(const PBBAM_SHARED_PTR<bam1_t>& rawData);
+
+    // internal memory setup/expand methods
+    void InitializeData(void);
+    void MaybeReallocData(void);
+
+    // core seq/qual logic shared by the public API
+    BamRecordImpl& SetSequenceAndQualitiesInternal(const char* sequence,
+                                                      const size_t sequenceLength,
+                                                      const char* qualities,
+                                                      bool isPreencoded);
+
+private:
+
+    // data members
+    PBBAM_SHARED_PTR<bam1_t> d_;
+
+    // friends
+    friend class internal::BamRecordMemory;
+};
+
+inline uint32_t BamRecordImpl::Bin(void) const
+{ return d_->core.bin; }
+
+inline BamRecordImpl& BamRecordImpl::Bin(uint32_t bin)
+{ d_->core.bin = bin; return *this; }
+
+inline uint32_t BamRecordImpl::Flag(void) const
+{ return d_->core.flag; }
+
+inline BamRecordImpl& BamRecordImpl::Flag(uint32_t flag)
+{ d_->core.flag = flag; return *this; }
+
+inline int32_t BamRecordImpl::InsertSize(void) const
+{ return d_->core.isize; }
+
+inline BamRecordImpl& BamRecordImpl::InsertSize(int32_t iSize)
+{ d_->core.isize = iSize; return *this; }
+
+inline uint8_t BamRecordImpl::MapQuality(void) const
+{ return d_->core.qual; }
+
+inline BamRecordImpl& BamRecordImpl::MapQuality(uint8_t mapQual)
+{ d_->core.qual = mapQual; return *this; }
+
+inline PacBio::BAM::Position BamRecordImpl::MatePosition(void) const
+{ return d_->core.mpos; }
+
+inline BamRecordImpl& BamRecordImpl::MatePosition(PacBio::BAM::Position pos)
+{ d_->core.mpos = pos; return *this; }
+
+inline int32_t BamRecordImpl::MateReferenceId(void) const
+{ return d_->core.mtid; }
+
+inline BamRecordImpl& BamRecordImpl::MateReferenceId(int32_t id)
+{ d_->core.mtid = id; return *this; }
+
+inline PacBio::BAM::Position BamRecordImpl::Position(void) const
+{ return d_->core.pos; }
+
+inline BamRecordImpl& BamRecordImpl::Position(PacBio::BAM::Position pos)
+{ d_->core.pos = pos; return *this; }
+
+inline int32_t BamRecordImpl::ReferenceId(void) const
+{ return d_->core.tid; }
+
+inline BamRecordImpl& BamRecordImpl::ReferenceId(int32_t id)
+{ d_->core.tid = id; return *this; }
+
+inline bool BamRecordImpl::IsDuplicate(void) const
+{ return (d_->core.flag & BamRecordImpl::DUPLICATE) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetDuplicate(bool ok)
+{
+    if (ok) d_->core.flag |=  BamRecordImpl::DUPLICATE;
+    else    d_->core.flag &= ~BamRecordImpl::DUPLICATE;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsFailedQC(void) const
+{ return (d_->core.flag & BamRecordImpl::FAILED_QC) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetFailedQC(bool ok)
+{
+    if (ok) d_->core.flag |=  BamRecordImpl::FAILED_QC;
+    else    d_->core.flag &= ~BamRecordImpl::FAILED_QC;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsFirstMate(void) const
+{ return (d_->core.flag & BamRecordImpl::MATE_1) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetFirstMate(bool ok)
+{
+    if (ok) d_->core.flag |=  BamRecordImpl::MATE_1;
+    else    d_->core.flag &= ~BamRecordImpl::MATE_1;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsMapped(void) const
+{ return (d_->core.flag & BamRecordImpl::UNMAPPED) == 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetMapped(bool ok)
+{
+    if (ok) d_->core.flag &= ~BamRecordImpl::UNMAPPED;
+    else    d_->core.flag |=  BamRecordImpl::UNMAPPED;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsMateMapped(void) const
+{ return (d_->core.flag & BamRecordImpl::MATE_UNMAPPED) == 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetMateMapped(bool ok)
+{
+    if (ok) d_->core.flag &= ~BamRecordImpl::MATE_UNMAPPED;
+    else    d_->core.flag |=  BamRecordImpl::MATE_UNMAPPED;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsMateReverseStrand(void) const
+{ return (d_->core.flag & BamRecordImpl::MATE_REVERSE_STRAND) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetMateReverseStrand(bool ok)
+{
+    if (ok) d_->core.flag |=  BamRecordImpl::MATE_REVERSE_STRAND;
+    else    d_->core.flag &= ~BamRecordImpl::MATE_REVERSE_STRAND;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsPaired(void) const
+{ return (d_->core.flag & BamRecordImpl::PAIRED) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetPaired(bool ok)
+{
+    if (ok) d_->core.flag |=  BamRecordImpl::PAIRED;
+    else    d_->core.flag &= ~BamRecordImpl::PAIRED;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsPrimaryAlignment(void) const
+{ return (d_->core.flag & BamRecordImpl::SECONDARY) == 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetPrimaryAlignment(bool ok)
+{
+    if (ok) d_->core.flag &= ~BamRecordImpl::SECONDARY;
+    else    d_->core.flag |=  BamRecordImpl::SECONDARY;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsProperPair(void) const
+{ return (d_->core.flag & BamRecordImpl::PROPER_PAIR) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetProperPair(bool ok)
+{
+    if (ok) d_->core.flag |=  BamRecordImpl::PROPER_PAIR;
+    else    d_->core.flag &= ~BamRecordImpl::PROPER_PAIR;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsReverseStrand(void) const
+{ return (d_->core.flag & BamRecordImpl::REVERSE_STRAND) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetReverseStrand(bool ok)
+{
+    if (ok) d_->core.flag |=  BamRecordImpl::REVERSE_STRAND;
+    else    d_->core.flag &= ~BamRecordImpl::REVERSE_STRAND;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsSecondMate(void) const
+{ return (d_->core.flag & BamRecordImpl::MATE_2) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetSecondMate(bool ok)
+{
+    if (ok) d_->core.flag |=  BamRecordImpl::MATE_2;
+    else    d_->core.flag &= ~BamRecordImpl::MATE_2;
+    return *this;
+}
+
+inline bool BamRecordImpl::IsSupplementaryAlignment(void) const
+{ return (d_->core.flag & BamRecordImpl::SUPPLEMENTARY) != 0; }
+
+inline BamRecordImpl& BamRecordImpl::SetSupplementaryAlignment(bool ok)
+{
+    if (ok) d_->core.flag |=  BamRecordImpl::SUPPLEMENTARY;
+    else    d_->core.flag &= ~BamRecordImpl::SUPPLEMENTARY;
+    return *this;
+}
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMRECORDIMPL_H
diff --git a/include/pbbam/BamTagCodec.h b/include/pbbam/BamTagCodec.h
new file mode 100644
index 0000000..5aad239
--- /dev/null
+++ b/include/pbbam/BamTagCodec.h
@@ -0,0 +1,75 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef BAMTAGCODEC_H
+#define BAMTAGCODEC_H
+
+#include "pbbam/Config.h"
+#include "pbbam/TagCollection.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT BamTagCodec
+{
+
+// high-level, operate on a full collection
+public:
+    static TagCollection Decode(const std::vector<uint8_t>& data);
+    static std::vector<uint8_t> Encode(const PacBio::BAM::TagCollection& tags);
+
+// per-tag methods
+public:
+
+    // returns the SAM/BAM single char code for tag type
+    static uint8_t TagTypeCode(const PacBio::BAM::Tag& tag);
+
+    // returns the tag value's raw data in bytes
+    // NOTE: does *NOT* encode name & tag type. It does however,
+    // include the element type of an array tag
+    static std::vector<uint8_t> ToRawData(const PacBio::BAM::Tag& tag);
+
+    // TODO: make this hidden a bit more, maybe this whole class in fact
+    // rawData should be the result of sam.h:bam_aux_get(...)
+    static PacBio::BAM::Tag FromRawData(uint8_t* rawData);
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMTAGCODEC_H
diff --git a/include/pbbam/BamWriter.h b/include/pbbam/BamWriter.h
new file mode 100644
index 0000000..e66df0a
--- /dev/null
+++ b/include/pbbam/BamWriter.h
@@ -0,0 +1,150 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef BAMWRITER_H
+#define BAMWRITER_H
+
+#include "pbbam/BamHeader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/Config.h"
+#include <htslib/sam.h>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class BamFile;
+
+namespace internal { class BamWriterPrivate; }
+
+class PBBAM_EXPORT BamWriter
+{
+public:
+    /// This enum allows you to control the compression level of the output BAM file.
+    ///
+    /// Values are equivalent to zlib compression levels. See its documentation for more details:
+    /// http://www.zlib.net/manual.html
+    enum CompressionLevel
+    {
+        CompressionLevel_0 = 0
+      , CompressionLevel_1 = 1
+      , CompressionLevel_2 = 2
+      , CompressionLevel_3 = 3
+      , CompressionLevel_4 = 4
+      , CompressionLevel_5 = 5
+      , CompressionLevel_6 = 6
+      , CompressionLevel_7 = 7
+      , CompressionLevel_8 = 8
+      , CompressionLevel_9 = 9
+
+      , DefaultCompression = -1
+      , NoCompression      = CompressionLevel_0
+      , FastCompression    = CompressionLevel_1
+      , BestCompression    = CompressionLevel_9
+    };
+
+public:
+
+    /// \name Constructors & Related Methods
+    /// \{
+
+    /// Opens a BAM file for writing & writes the header information.
+    ///
+    /// The error status will be set if either operation fails.
+    ///
+    /// \note Set \p filename to "-" for stdout.
+    ///
+    /// \param[in] filename         path to output BAM file
+    /// \param[in] header           BamHeader object
+    /// \param[in] compressionLevel zlib compression level
+    /// \param[in] numThreads       number of threads for compression.
+    ///            If set to 0, BamWriter will attempt to determine a reasonable estimate.
+    ///            If set to 1, this will force single-threaded execution.
+    ///            No checks are made against an upper limit.
+    BamWriter(const std::string& filename,
+              const BamHeader& header,
+              const BamWriter::CompressionLevel compressionLevel = BamWriter::DefaultCompression,
+              const size_t numThreads = 4);
+
+    /// Fully flushes all buffered data & closes file.
+    ~BamWriter(void);
+
+    /// \}
+
+public:
+
+    /// \name Data Writing & Resource Management
+
+    /// Try to flush any buffered data to file.
+    ///
+    /// \note The underlying implementation doesn't necessarily flush buffered data
+    ///       immediately, especially in a multithreaded writer situation.
+    ///       Let the BamWriter go out of scope to fully ensure flushing.
+    ///
+    /// \throws
+    void TryFlush(void);
+
+    /// Write a record to the output BAM file.
+    ///
+    /// \param[in] record BamRecord object
+    /// \throws std::runtime_error on failure to write
+    void Write(const BamRecord& record);
+
+    /// Write a record to the output BAM file.
+    ///
+    /// \param[in] record BamRecord object
+    /// \param[out] vOffset BGZF virtual offset to start of \p record
+    /// \throws std::runtime_error on failure to write
+    void Write(const BamRecord& record, int64_t* vOffset);
+
+    /// Write a record to the output BAM file.
+    ///
+    /// \param[in] recordImpl BamRecordImpl object
+    /// \throws std::runtime_error on failure to write
+    void Write(const BamRecordImpl& recordImpl);
+
+    /// \}
+
+private:
+    std::unique_ptr<internal::BamWriterPrivate> d_;
+    DISABLE_MOVE_AND_COPY(BamWriter);
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMWRITER_H
diff --git a/include/pbbam/Cigar.h b/include/pbbam/Cigar.h
new file mode 100644
index 0000000..1e0bc46
--- /dev/null
+++ b/include/pbbam/Cigar.h
@@ -0,0 +1,116 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef CIGAR_H
+#define CIGAR_H
+
+#include "pbbam/CigarOperation.h"
+#include "pbbam/Config.h"
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT Cigar : public std::vector<CigarOperation>
+{
+
+public:
+    /// \name Static Constructor
+    /// \{
+
+    /// Creates a Cigar object from SAM/BAM string input
+    ///
+    /// \param [in] stdString SAM/BAM formatted CIGAR data
+    /// \returns Cigar object representing the input data
+    static Cigar FromStdString(const std::string& stdString);
+
+    /// \}
+
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    Cigar(void);
+    Cigar(const std::string& cigarString);
+    Cigar(const Cigar& other);
+    Cigar(Cigar&& other);
+    Cigar& operator=(const Cigar& other);
+    Cigar& operator=(Cigar&& other);
+    ~Cigar(void);
+
+    /// \}
+
+public:
+    /// \name Conversion Methods
+    /// \{
+
+    /// Converts Cigar object data to SAM/BAM formatted string
+    ///
+    /// \returns SAM/BAM formatted std::string
+    std::string ToStdString(void) const;
+
+    /// \}
+};
+
+inline Cigar::Cigar(void)
+    : std::vector<CigarOperation>()
+{ }
+
+inline Cigar::Cigar(const Cigar& other)
+    : std::vector<CigarOperation>(other)
+{ }
+
+inline Cigar::Cigar(Cigar&& other)
+    : std::vector<CigarOperation>(std::move(other))
+{ }
+
+inline Cigar& Cigar::operator=(const Cigar& other)
+{ std::vector<CigarOperation>::operator= (other); return *this; }
+
+inline Cigar& Cigar::operator=(Cigar&& other)
+{ std::vector<CigarOperation>::operator= (std::move(other)); return *this; }
+
+inline Cigar::~Cigar(void) { }
+
+inline Cigar Cigar::FromStdString(const std::string& stdString)
+{ return Cigar(stdString); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // CIGAR_H
diff --git a/include/pbbam/CigarOperation.h b/include/pbbam/CigarOperation.h
new file mode 100644
index 0000000..951128d
--- /dev/null
+++ b/include/pbbam/CigarOperation.h
@@ -0,0 +1,226 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef CIGAROPERATION_H
+#define CIGAROPERATION_H
+
+#include "pbbam/Config.h"
+#include <stdexcept>
+
+namespace PacBio {
+namespace BAM {
+
+/// Describes a CIGAR operation. Bracketed character is the corresponding SAM/BAM character code.
+///
+/// \warning ALIGNMENT_MATCH ('M') is included in this enum to maintain consistency with htslib.
+/// However, as of PacBio BAM spec version 3.0b7, this CIGAR operation \b forbidden. Attempt to
+/// read or write a record containing this operation will trigger a std::runtime_error.
+///
+enum class CigarOperationType
+{
+    UNKNOWN_OP        = -1 ///< unknown/invalid CIGAR operator
+  , ALIGNMENT_MATCH   = 0  ///< alignment match (can be a sequence match or mismatch) [M]
+  , INSERTION              ///< insertion to the reference [I]
+  , DELETION               ///< deletion from the reference [D]
+  , REFERENCE_SKIP         ///< skipped region from the reference [N]
+  , SOFT_CLIP              ///< soft clipping (clipped sequences present in SEQ) [S]
+  , HARD_CLIP         = 5  ///< hard clipping (clipped sequences NOT present in SEQ) [H]
+  , PADDING                ///< padding (silent deletion from padded reference) [P]
+  , SEQUENCE_MATCH         ///< sequence match [=]
+  , SEQUENCE_MISMATCH      ///< sequence mismatch [X]
+
+    // TODO: looks like there is a new 'B' type in htslib source, referring to some 'back' operation...
+    //       no reference in htslib docs though yet as to what that applies to
+};
+
+class PBBAM_EXPORT CigarOperation
+{
+public:
+
+    /// \name Operation Type Conversion Methods
+    /// \{
+
+    /// Convert between CigarOperationType enum & SAM/BAM character code.
+    ///
+    /// \param[in] type CigarOperationType value
+    /// \returns SAM/BAM character code
+    static char TypeToChar(const CigarOperationType type);
+
+    /// Convert between CigarOperationType enum & SAM/BAM character code.
+    ///
+    /// \param[in] c SAM/BAM character code
+    /// \returns CigarOperationType value
+    static CigarOperationType CharToType(const char c);
+
+    /// \}
+
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    CigarOperation(void);
+    CigarOperation(char c, uint32_t length);
+    CigarOperation(CigarOperationType op, uint32_t length);
+    CigarOperation(const CigarOperation& other);
+    CigarOperation(CigarOperation&& other);
+    CigarOperation& operator=(const CigarOperation& other);
+    CigarOperation& operator=(CigarOperation&& other);
+    ~CigarOperation(void);
+
+    /// \}
+
+public:
+
+    /// \returns operation type as SAM/BAM char code
+    inline char Char(void) const;
+
+    /// \returns operation length
+    inline uint32_t Length(void) const;
+
+    /// \returns operation type as CigarOperationType enum value
+    inline CigarOperationType Type(void) const;
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    /// Sets this operation type.
+    ///
+    /// \param[in] opChar SAM/BAM character code
+    /// \returns reference to this operation
+    inline CigarOperation& Char(const char opChar);
+
+    /// Sets this operation length.
+    ///
+    /// \param[in] length
+    /// \returns reference to this operation
+    inline CigarOperation& Length(const uint32_t length);
+
+    /// Sets this operation type.
+    ///
+    /// \param[in] opType CigarOperationType value
+    /// \returns reference to this operation
+    inline CigarOperation& Type(const CigarOperationType opType);
+
+    /// \}
+
+public:
+    /// \name Comparison Operators
+    /// \{
+
+    /// \returns true if both CIGAR operation type & length match
+    inline bool operator==(const CigarOperation& other) const;
+
+    /// \returns true if either CIGAR operation type or length differ
+    inline bool operator!=(const CigarOperation& other) const;
+
+    /// \}
+
+private:
+    CigarOperationType type_;
+    uint32_t length_;
+};
+
+inline CigarOperation::CigarOperation(void)
+    : type_(CigarOperationType::UNKNOWN_OP)
+    , length_(0)
+{ }
+
+inline CigarOperation::CigarOperation(char c, uint32_t length)
+    : type_(CigarOperation::CharToType(c))
+    , length_(length)
+{
+    if (type_ == CigarOperationType::ALIGNMENT_MATCH)
+        throw std::runtime_error("CIGAR operation 'M' is not allowed in PacBio BAM files. Use 'X/=' instead.");
+}
+
+inline CigarOperation::CigarOperation(CigarOperationType op, uint32_t length)
+    : type_(op)
+    , length_(length)
+{
+    if (type_ == CigarOperationType::ALIGNMENT_MATCH)
+        throw std::runtime_error("CIGAR operation 'M' is not allowed in PacBio BAM files. Use 'X/=' instead.");
+}
+
+inline CigarOperation::CigarOperation(const CigarOperation& other)
+    : type_(other.type_)
+    , length_(other.length_)
+{ }
+
+inline CigarOperation::CigarOperation(CigarOperation&& other)
+    : type_(std::move(other.type_))
+    , length_(std::move(other.length_))
+{ }
+
+inline CigarOperation::~CigarOperation(void) { }
+
+inline uint32_t CigarOperation::Length(void) const
+{ return length_; }
+
+inline CigarOperation& CigarOperation::Length(const uint32_t length)
+{ length_ = length; return *this; }
+
+inline CigarOperationType CigarOperation::Type(void) const
+{ return type_; }
+
+inline CigarOperation &CigarOperation::Type(const CigarOperationType opType)
+{ type_ = opType; return *this; }
+
+inline char CigarOperation::Char(void) const
+{ return CigarOperation::TypeToChar(type_); }
+
+inline CigarOperation &CigarOperation::Char(const char opChar)
+{ type_ = CigarOperation::CharToType(opChar);return *this; }
+
+inline CigarOperation& CigarOperation::operator=(const CigarOperation& other)
+{ type_ = other.type_; length_ = other.length_; return *this; }
+
+inline CigarOperation& CigarOperation::operator=(CigarOperation&& other)
+{ type_ = std::move(other.type_); length_ = std::move(other.length_); return *this; }
+
+inline bool CigarOperation::operator==(const CigarOperation& other) const
+{ return type_ == other.type_ && length_ == other.length_; }
+
+inline bool CigarOperation::operator!=(const CigarOperation& other) const
+{ return !(*this == other); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // CIGAROPERATION_H
diff --git a/include/pbbam/Config.h b/include/pbbam/Config.h
new file mode 100644
index 0000000..3d2b5d7
--- /dev/null
+++ b/include/pbbam/Config.h
@@ -0,0 +1,125 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef PBBAM_CONFIG_H
+#define PBBAM_CONFIG_H
+
+// --------------------------------
+// standard types
+// --------------------------------
+
+#include <cstdint>
+
+// -------------------------------------
+// library symbol import/export macros
+// -------------------------------------
+
+#ifndef PBBAM_LIBRARY_EXPORT
+#  if defined(WIN32)
+#    define PBBAM_LIBRARY_EXPORT __declspec(dllexport)
+#  else
+#    define PBBAM_LIBRARY_EXPORT __attribute__((visibility("default")))
+#  endif
+#endif
+
+#ifndef PBBAM_LIBRARY_IMPORT
+#  if defined(WIN32)
+#    define PBBAM_LIBRARY_IMPORT __declspec(dllimport)
+#  else
+#    define PBBAM_LIBRARY_IMPORT
+#  endif
+#endif
+
+#ifndef PBBAM_EXPORT
+#  if defined(PBBAM_LIBRARY)
+#    define PBBAM_EXPORT PBBAM_LIBRARY_EXPORT
+#  else
+#    define PBBAM_EXPORT PBBAM_LIBRARY_IMPORT
+#  endif
+#endif
+
+// ----------------------------------------------------
+// setup the shared_ptr implementation we'll be using
+// ----------------------------------------------------
+
+// uncomment this define, or pass via command-line (-DPBBAM_USE_BOOST_SHARED_PTR),
+// to use boost::shared_ptr<T> instead of std::shared_ptr<T>
+//#define PBBAM_USE_BOOST_SHARED_PTR
+
+#ifdef PBBAM_USE_BOOST_SHARED_PTR
+#  include <boost/smart_ptr/shared_ptr.hpp>
+#  define PBBAM_SHARED_PTR boost::shared_ptr
+#else
+#  include <memory>
+#  define PBBAM_SHARED_PTR std::shared_ptr
+#endif
+
+// ----------------------------------------------------
+// htslib verbosity level
+// ----------------------------------------------------
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief Sets the desired verbosity level of htslib warnings.
+///
+/// Change this value to allow debug/warning statements from htslib.
+/// The valid range seems to be [0-3], where 0->OFF, and 3->most verbose.
+///
+extern int HtslibVerbosity;
+
+} // namespace BAM
+} // namespace PacBio
+
+// ----------------------------------------------------
+// additional helper macros
+// ----------------------------------------------------
+
+#ifndef DISABLE_COPY
+#define DISABLE_COPY(Class) \
+    Class(const Class&); \
+    Class& operator=(const Class&)
+#endif
+
+#ifndef DISABLE_MOVE_AND_COPY
+#define DISABLE_MOVE_AND_COPY(Class) \
+    Class(Class&&); \
+    Class& operator=(Class&&); \
+    DISABLE_COPY(Class)
+#endif
+
+#endif // PBBAM_CONFIG_H
diff --git a/include/pbbam/DataSet.h b/include/pbbam/DataSet.h
new file mode 100644
index 0000000..21a6aa2
--- /dev/null
+++ b/include/pbbam/DataSet.h
@@ -0,0 +1,218 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef DATASET_H
+#define DATASET_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/Config.h"
+#include "pbbam/DataSetTypes.h"
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT DataSet
+{
+public:
+
+    /// \name DataSet Types
+    /// \{
+
+    enum TypeEnum {
+        GENERIC = 0
+      , ALIGNMENT
+      , BARCODE
+      , CONSENSUS_ALIGNMENT
+      , CONSENSUS_READ
+      , CONTIG
+      , HDF_SUBREAD
+      , REFERENCE
+      , SUBREAD
+    };
+
+    static DataSet::TypeEnum NameToType(const std::string& typeName);
+
+    static std::string TypeToName(const DataSet::TypeEnum& type);
+    /// \}
+
+public:
+
+    /// \name Constructors & Related Methods
+    /// \{
+
+    DataSet(void);
+    DataSet(const DataSet::TypeEnum type);
+    DataSet(const BamFile& bamFile);
+    DataSet(const std::string& filename);
+    DataSet(const DataSet& other);
+    DataSet(DataSet&& other);
+    DataSet& operator=(const DataSet& other);
+    DataSet& operator=(DataSet&& other);
+    ~DataSet(void);
+
+    /// Creates a DataSet from "raw" XML data.
+    static DataSet FromXml(const std::string& xml);
+
+    /// \}
+
+public:
+    /// \name Operators
+    /// \{
+
+    DataSet& operator+=(const DataSet& other);
+
+    /// \}
+
+public:
+    void Save(const std::string& outputFilename);
+    void SaveToStream(std::ostream& out);
+
+public:
+
+    /// \name Attributes
+    /// \{
+    ///
+
+    const std::string& Attribute(const std::string& name) const;
+    std::string& Attribute(const std::string& name);
+    DataSet& Attribute(const std::string& name, const std::string& value);
+
+    const std::string& CreatedAt(void) const;
+    const PacBio::BAM::Extensions& Extensions(void) const;
+    const std::string& Format(void) const;
+    const std::string& MetaType(void) const;
+    const std::string& ModifiedAt(void) const;
+    const std::string& Name(void) const;
+    const std::string& ResourceId(void) const;
+    const std::string& Tags(void) const;
+    const std::string& TimeStampedName(void) const;
+    const std::string& UniqueId(void) const;
+    const std::string& Version(void) const;
+
+    PacBio::BAM::DataSet::TypeEnum Type(void) const;
+    std::string TypeName(void) const;
+
+    /// \}
+
+public:
+    /// \name Child Elements
+    /// \{
+
+    const PacBio::BAM::ExternalResources& ExternalResources(void) const;
+    const PacBio::BAM::Filters& Filters(void) const;
+    const PacBio::BAM::DataSetMetadata& Metadata(void) const;
+    const PacBio::BAM::SubDataSets& SubDataSets(void) const;
+
+    /// \}
+
+public:
+    /// \name XML Namespace Handling
+    /// \{
+
+    const NamespaceRegistry& Namespaces(void) const;
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    std::string& CreatedAt(void);
+    PacBio::BAM::Extensions& Extensions(void);
+    std::string& Format(void);
+    std::string& MetaType(void);
+    std::string& ModifiedAt(void);
+    std::string& Name(void);
+    std::string& ResourceId(void);
+    std::string& Tags(void);
+    std::string& TimeStampedName(void);
+    std::string& UniqueId(void);
+    std::string& Version(void);
+    
+    DataSet& CreatedAt(const std::string& createdAt);
+    DataSet& Extensions(const PacBio::BAM::Extensions& extensions);
+    DataSet& Format(const std::string& format);
+    DataSet& MetaType(const std::string& metatype);
+    DataSet& ModifiedAt(const std::string& modifiedAt);
+    DataSet& Name(const std::string& name);
+    DataSet& ResourceId(const std::string& resourceId);
+    DataSet& Tags(const std::string& tags);
+    DataSet& TimeStampedName(const std::string& timeStampedName);
+    DataSet& UniqueId(const std::string& uuid);
+    DataSet& Version(const std::string& version);
+
+    DataSet& Type(const PacBio::BAM::DataSet::TypeEnum type);
+
+    /// \}
+
+public:
+    /// \name Child Elements
+    /// \{
+
+    PacBio::BAM::ExternalResources& ExternalResources(void);
+    PacBio::BAM::Filters& Filters(void);
+    PacBio::BAM::DataSetMetadata& Metadata(void);
+    PacBio::BAM::SubDataSets& SubDataSets(void);
+
+    DataSet& ExternalResources(const PacBio::BAM::ExternalResources& resources);
+    DataSet& Filters(const PacBio::BAM::Filters& filters);
+    DataSet& Metadata(const PacBio::BAM::DataSetMetadata& metadata);
+    DataSet& SubDataSets(const PacBio::BAM::SubDataSets& subdatasets);
+    
+    /// \}
+
+public:
+    /// \name XML Namespace Handling
+    /// \{
+
+    NamespaceRegistry& Namespaces(void);
+
+    /// \}
+
+private:
+    std::unique_ptr<DataSetBase> d_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#include "pbbam/internal/DataSet.inl"
+
+#endif // DATASET_H
diff --git a/include/pbbam/DataSetTypes.h b/include/pbbam/DataSetTypes.h
new file mode 100644
index 0000000..dd4c496
--- /dev/null
+++ b/include/pbbam/DataSetTypes.h
@@ -0,0 +1,315 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef DATASETTYPES_H
+#define DATASETTYPES_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/Config.h"
+#include "pbbam/DataSetXsd.h"
+#include "pbbam/internal/DataSetBaseTypes.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT DataSetMetadata : public internal::DataSetElement
+{
+public:
+    DataSetMetadata(const std::string& numRecords,
+                    const std::string& totalLength);
+
+public:
+    DataSetMetadata& operator+=(const DataSetMetadata& other);
+
+public:
+    const std::string& NumRecords(void) const;
+    const std::string& TotalLength(void) const;
+    const PacBio::BAM::Provenance& Provenance(void) const;
+
+    std::string& NumRecords(void);
+    std::string& TotalLength(void);
+    PacBio::BAM::Provenance& Provenance(void);
+
+    DataSetMetadata& NumRecords(const std::string& numRecords);
+    DataSetMetadata& TotalLength(const std::string& totalLength);
+    DataSetMetadata& Provenance(const PacBio::BAM::Provenance& provenance);
+};
+
+class PBBAM_EXPORT ExtensionElement : public internal::DataSetElement  {
+public:
+    ExtensionElement(void);
+};
+
+class PBBAM_EXPORT Extensions : public internal::DataSetListElement<ExtensionElement>
+{
+public:
+    Extensions(void);
+};
+
+class PBBAM_EXPORT ExternalResource : public internal::IndexedDataType
+{
+public:
+    ExternalResource(void);
+    ExternalResource(const BamFile& bamFile);
+    ExternalResource(const std::string& metatype,
+                     const std::string& filename);
+
+public:
+    BamFile ToBamFile(void) const;
+};
+
+class PBBAM_EXPORT ExternalResources : public internal::DataSetListElement<ExternalResource>
+{
+public:
+    ExternalResources(void);
+
+    ExternalResources& operator+=(const ExternalResources& other);
+
+public:
+    void Add(const ExternalResource& ext);
+    void Remove(const ExternalResource& ext);
+
+public:
+    std::vector<BamFile> BamFiles(void) const;
+};
+
+class PBBAM_EXPORT FileIndex : public internal::InputOutputDataType
+{
+public:
+    FileIndex(void);
+};
+
+class PBBAM_EXPORT FileIndices : public internal::DataSetListElement<FileIndex>
+{
+public:
+    FileIndices(void);
+
+    void Add(const FileIndex& index);
+    void Remove(const FileIndex& index);
+};
+
+class PBBAM_EXPORT Filter : public internal::DataSetElement
+{
+public:
+    Filter(void);
+
+public:
+    const PacBio::BAM::Properties& Properties(void) const;
+    PacBio::BAM::Properties& Properties(void);
+    Filter& Properties(const PacBio::BAM::Properties& properties);
+};
+
+class PBBAM_EXPORT Filters : public internal::DataSetListElement<Filter>
+{
+public:
+    Filters(void);
+
+    Filters& operator+=(const Filters& other);
+
+    void Add(const Filter& filter);
+    void Remove(const Filter& filter);
+};
+
+class PBBAM_EXPORT ParentTool : public internal::BaseEntityType {
+public:
+    ParentTool(void);
+};
+
+class PBBAM_EXPORT Property : public internal::DataSetElement
+{
+public:
+    Property(const std::string& name,
+             const std::string& value,
+             const std::string& op);
+
+public:
+    const std::string& Name(void) const;
+    const std::string& Operator(void) const;
+    const std::string& Value(void) const;
+
+    std::string& Name(void);
+    std::string& Operator(void);
+    std::string& Value(void);
+
+    Property& Name(const std::string& name);
+    Property& Operator(const std::string& op);
+    Property& Value(const std::string& value);
+};
+
+class PBBAM_EXPORT Properties : public internal::DataSetListElement<Property>
+{
+public:
+    Properties(void);
+
+    void Add(const Property& property);
+    void Remove(const Property& property);
+};
+
+class PBBAM_EXPORT Provenance : public internal::DataSetElement
+{
+public:
+    Provenance(void);
+
+public:
+    const std::string& CreatedBy(void) const;
+    const std::string& CommonServicesInstanceId(void) const;
+    const std::string& CreatorUserId(void) const;
+    const std::string& ParentJobId(void) const;
+    const PacBio::BAM::ParentTool& ParentTool(void) const;
+
+    std::string& CreatedBy(void);
+    std::string& CommonServicesInstanceId(void);
+    std::string& CreatorUserId(void);
+    std::string& ParentJobId(void);
+    PacBio::BAM::ParentTool& ParentTool(void);
+
+    Provenance& CreatedBy(const std::string& createdBy);
+    Provenance& CommonServicesInstanceId(const std::string& id);
+    Provenance& CreatorUserId(const std::string& id);
+    Provenance& ParentJobId(const std::string& id);
+    Provenance& ParentTool(const PacBio::BAM::ParentTool& tool);
+};
+
+class SubDataSets;
+
+class PBBAM_EXPORT DataSetBase : public internal::StrictEntityType
+{
+public:
+    static std::shared_ptr<DataSetBase> Create(const std::string& typeName);
+
+public:
+    DataSetBase(void);
+
+protected:
+    DataSetBase(const std::string& label, const XsdType& xsd);
+    DataSetBase* DeepCopy(void) const;
+
+public:
+    DataSetBase& operator+=(const DataSetBase& other);
+
+public:
+    const PacBio::BAM::ExternalResources& ExternalResources(void) const;
+    const PacBio::BAM::Filters& Filters(void) const;
+    const PacBio::BAM::DataSetMetadata& Metadata(void) const;
+    const PacBio::BAM::SubDataSets& SubDataSets(void) const;
+
+    PacBio::BAM::ExternalResources& ExternalResources(void);
+    PacBio::BAM::Filters& Filters(void);
+    PacBio::BAM::DataSetMetadata& Metadata(void);
+    PacBio::BAM::SubDataSets& SubDataSets(void);
+
+    DataSetBase& ExternalResources(const PacBio::BAM::ExternalResources& resources);
+    DataSetBase& Filters(const PacBio::BAM::Filters& filters);
+    DataSetBase& Metadata(const PacBio::BAM::DataSetMetadata& metadata);
+    DataSetBase& SubDataSets(const PacBio::BAM::SubDataSets& subdatasets);
+
+
+public:
+    const NamespaceRegistry& Namespaces(void) const;
+    NamespaceRegistry& Namespaces(void);
+
+private:
+    NamespaceRegistry registry_;
+};
+
+class PBBAM_EXPORT AlignmentSet : public DataSetBase
+{
+public:
+    AlignmentSet(void);
+};
+
+class PBBAM_EXPORT BarcodeSet : public DataSetBase
+{
+public:
+    BarcodeSet(void);
+};
+
+class PBBAM_EXPORT ConsensusAlignmentSet : public DataSetBase
+{
+public:
+    ConsensusAlignmentSet(void);
+};
+
+class PBBAM_EXPORT ConsensusReadSet : public DataSetBase
+{
+public:
+    ConsensusReadSet(void);
+};
+
+class PBBAM_EXPORT ContigSet : public DataSetBase
+{
+public:
+    ContigSet(void);
+};
+
+class PBBAM_EXPORT HdfSubreadSet : public DataSetBase
+{
+public:
+    HdfSubreadSet(void);
+};
+
+class PBBAM_EXPORT ReferenceSet : public DataSetBase
+{
+public:
+    ReferenceSet(void);
+};
+
+class PBBAM_EXPORT SubDataSets : public internal::DataSetListElement<DataSetBase>
+{
+public:
+    SubDataSets(void);
+
+    SubDataSets& operator+=(const DataSetBase& other); // single
+    SubDataSets& operator+=(const SubDataSets& other); // list
+
+    void Add(const DataSetBase& subdataset);
+    void Remove(const DataSetBase& subdataset);
+};
+
+class PBBAM_EXPORT SubreadSet : public DataSetBase
+{
+public:
+    SubreadSet(void);
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#include "internal/DataSetTypes.inl"
+
+#endif // DATASETTYPES_H
diff --git a/include/pbbam/DataSetXsd.h b/include/pbbam/DataSetXsd.h
new file mode 100644
index 0000000..29df5e1
--- /dev/null
+++ b/include/pbbam/DataSetXsd.h
@@ -0,0 +1,111 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef DATASETXSD_H
+#define DATASETXSD_H
+
+#include "pbbam/Config.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+enum class XsdType
+{
+    NONE
+
+  , AUTOMATION_CONSTRAINTS
+  , BASE_DATA_MODEL
+  , COLLECTION_METADATA
+  , COMMON_MESSAGES
+  , DATA_MODEL
+  , DATA_STORE
+  , DATASETS
+  , DECL_DATA
+  , PART_NUMBERS
+  , PRIMARY_METRICS
+  , REAGENT_KIT
+  , RIGHTS_AND_ROLES
+  , SAMPLE_INFO
+  , SEEDING_DATA
+};
+
+class PBBAM_EXPORT NamespaceInfo
+{
+public:
+    NamespaceInfo(void);
+    NamespaceInfo(const std::string& name,
+                  const std::string& uri);
+
+public:
+    const std::string& Name(void) const { return name_; }
+    const std::string& Uri(void) const { return uri_; }
+
+private:
+    std::string name_;
+    std::string uri_;
+};
+
+class PBBAM_EXPORT NamespaceRegistry
+{
+public:
+    NamespaceRegistry(void);
+    NamespaceRegistry(const NamespaceRegistry& other);
+    NamespaceRegistry& operator=(const NamespaceRegistry& other);
+    ~NamespaceRegistry(void);
+
+public:
+    const NamespaceInfo& DefaultNamespace(void) const;
+    XsdType DefaultXsd(void) const;
+    const NamespaceInfo& Namespace(const XsdType& xsd) const;
+
+    XsdType XsdForUri(const std::string& uri) const;
+
+public:
+    void Register(const XsdType& xsd, const NamespaceInfo& namespaceInfo);
+    void SetDefaultXsd(const XsdType& xsd);
+
+private:
+    std::map<XsdType, NamespaceInfo> data_;
+    XsdType defaultXsdType_;
+};
+
+} // namespace PacBio
+} // namespace BAM
+
+#endif // DATASETXSD_H
diff --git a/include/pbbam/EntireFileQuery.h b/include/pbbam/EntireFileQuery.h
new file mode 100644
index 0000000..cd5809e
--- /dev/null
+++ b/include/pbbam/EntireFileQuery.h
@@ -0,0 +1,60 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef ENTIREFILEQUERY_H
+#define ENTIREFILEQUERY_H
+
+#include "pbbam/internal/QueryBase.h"
+#include <htslib/sam.h>
+
+namespace PacBio {
+namespace BAM {
+
+class BamFile;
+
+class PBBAM_EXPORT EntireFileQuery : public internal::IQuery
+{
+public:
+    EntireFileQuery(const PacBio::BAM::DataSet& dataset);
+protected:
+    FileIterPtr CreateIterator(const BamFile& bamFile);
+};
+
+} // namespace BAM
+} // namspace PacBio
+
+#endif // ENTIREFILEQUERY_H
diff --git a/include/pbbam/Frames.h b/include/pbbam/Frames.h
new file mode 100644
index 0000000..f11598c
--- /dev/null
+++ b/include/pbbam/Frames.h
@@ -0,0 +1,205 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef FRAMES_H
+#define FRAMES_H
+
+#include "pbbam/Config.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT Frames
+{
+public:
+    /// \name Conversion Methods
+    /// \{
+
+    /// Constructs a Frames object from encoded (lossy, 8-bit data).
+    ///
+    /// \note This method should probably not be needed often by client code working with frame data.
+    /// It exists primarily for (internal) parsing & interpretation of the BAM file contents. The
+    /// method is available, though, should the conversion operation be needed.
+    ///
+    /// \param[in] codedData encoded data
+    /// \returns Frames object
+    static Frames Decode(const std::vector<uint8_t>& codedData);
+
+    /// Encodes a container of (raw) frames values in our 8-bit encoding.
+    ///
+    /// \param[in] frames expanded frame data
+    /// \returns lossy, 8-bit encoded frame codes
+    static std::vector<uint8_t> Encode(const std::vector<uint16_t>& frames);
+
+    /// \}
+
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    Frames(void);
+    Frames(const std::vector<uint16_t>& frames);
+    Frames(std::vector<uint16_t>&& frames);
+    Frames(const Frames& other);
+    Frames(Frames&& other);
+    Frames& operator=(const Frames& other);
+    Frames& operator=(Frames&& other);
+    ~Frames(void);
+
+    /// \}
+
+public:
+    /// \name Access Data
+    /// \{
+
+    /// \returns Frame data in expanded (not encoded) form
+    std::vector<uint16_t>& DataRaw(void);
+    const std::vector<uint16_t>& Data(void) const;
+
+    /// \}
+
+public:
+    /// \name Conversion Methods
+    /// \{
+
+    /// \returns Frame data in (lossy, 8-bit) encoded form.
+    std::vector<uint8_t> Encode(void) const;
+
+    /// \}
+
+public:
+    /// \name Comparison Operators
+    /// \{
+
+    bool operator==(const Frames& other) const;
+    bool operator!=(const Frames& other) const;
+
+    /// \}
+
+public:
+    /// \name Iterators
+    /// \{
+
+    /// \returns A const_iterator to the beginning of the sequence.
+    std::vector<uint16_t>::const_iterator cbegin(void) const;
+
+    /// \returns A const_iterator to the element past the end of the sequence.
+    std::vector<uint16_t>::const_iterator cend(void) const;
+
+    /// \returns A const_iterator to the beginning of the sequence.
+    std::vector<uint16_t>::const_iterator begin(void) const;
+
+    /// \returns A const_iterator to the element past the end of the sequence.
+    std::vector<uint16_t>::const_iterator end(void) const;
+
+    /// \returns An iterator to the beginning of the sequence.
+    std::vector<uint16_t>::iterator begin(void);
+
+    /// \returns An iterator to the element past the end of the sequence.
+    std::vector<uint16_t>::iterator end(void);
+
+    /// \} 
+
+public:
+    /// \name Access Data
+    /// \{
+
+    /// Sets this record's data.
+    ///
+    /// \param[in] frames data in expanded (not encoded) form
+    /// \returns reference to this object
+    Frames& Data(const std::vector<uint16_t>& frames);
+
+    /// Sets this record's data.
+    ///
+    /// This is an overloaded function, allowing move semantics
+    /// (instead of copying the data).
+    ///
+    /// \param[in] frames data in expanded (not encoded) form
+    /// \returns reference to this object
+    Frames& Data(std::vector<uint16_t>&& frames);
+
+    /// \}
+
+private:
+    std::vector<uint16_t> data_;
+};
+
+inline const std::vector<uint16_t>& Frames::Data(void) const
+{ return data_; }
+
+inline std::vector<uint16_t>& Frames::DataRaw(void)
+{ return data_; }
+
+inline std::vector<uint8_t> Frames::Encode(void) const
+{ return Frames::Encode(data_); }
+
+inline Frames& Frames::Data(const std::vector<uint16_t>& frames)
+{ data_ = frames; return *this; }
+
+inline Frames& Frames::Data(std::vector<uint16_t>&& frames)
+{ data_ = std::move(frames); return *this; }
+
+inline std::vector<uint16_t>::const_iterator Frames::cbegin(void) const
+{ return data_.cbegin(); }
+
+inline std::vector<uint16_t>::const_iterator Frames::cend(void) const
+{ return data_.cend(); }
+
+inline std::vector<uint16_t>::const_iterator Frames::begin(void) const
+{ return data_.begin(); }
+
+inline std::vector<uint16_t>::const_iterator Frames::end(void) const
+{ return data_.end(); }
+
+inline std::vector<uint16_t>::iterator Frames::begin(void)
+{ return data_.begin(); }
+
+inline std::vector<uint16_t>::iterator Frames::end(void)
+{ return data_.end(); }
+
+inline bool Frames::operator==(const Frames& other) const
+{ return data_ == other.data_; }
+
+inline bool Frames::operator!=(const Frames& other) const
+{ return !(*this == other); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // FRAMES_H
diff --git a/include/pbbam/GenomicInterval.h b/include/pbbam/GenomicInterval.h
new file mode 100644
index 0000000..12ebb9a
--- /dev/null
+++ b/include/pbbam/GenomicInterval.h
@@ -0,0 +1,214 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef GENOMICINTERVAL_H
+#define GENOMICINTERVAL_H
+
+#include "pbbam/Config.h"
+#include "pbbam/Interval.h"
+#include "pbbam/Position.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+/// This class represents a genomic interval (reference name, and 0-based coordinates)
+class PBBAM_EXPORT GenomicInterval
+{
+public:
+    /// \name Constructors & Related Methods
+    ///  \{
+
+    /// Default constructor; yields an empty genomic interval
+    GenomicInterval(void);
+
+    /// Constructor for interval on sequence with \p name, using range: [\p start, \p stop)
+    GenomicInterval(const std::string& name,
+                    const Position& start,
+                    const Position& stop);
+
+    /// Constructor for interval, using REGION string
+    ///
+    /// "<ref>:<start>-<stop>" ("chr8:200-600")
+    ///
+    /// \note The htslib/samtools REGION string expects start positions to be 1-based.
+    ///       However, throughout pbbam (including the rest of this class), we stick
+    ///       to 0-based start coordinates. Thus, while the syntax matches that of samtools,
+    ///       we are using a 0-based start coordinate here.
+    ///
+    GenomicInterval(const std::string& zeroBasedRegionString);
+
+    GenomicInterval(const GenomicInterval& other);
+    GenomicInterval& operator=(const GenomicInterval& other);
+
+    ~GenomicInterval(void);
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    /// \returns interval reference name
+    std::string Name(void) const;
+
+    /// \returns underlying Interval object
+    PacBio::BAM::Interval<Position> Interval(void) const;
+
+    /// \returns interval start coordinate
+    Position Start(void) const;
+
+    /// \returns interval stop coordinate
+    Position Stop(void) const;
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    /// Sets this interval's reference name.
+    ///
+    /// \param[in] name
+    /// \returns reference to this interval
+    GenomicInterval& Name(const std::string& name);
+
+    /// Sets this underlying Interval
+    ///
+    /// \param[in] interval
+    /// \returns reference to this interval
+    GenomicInterval& Interval(const PacBio::BAM::Interval<Position>& interval);
+
+    /// Sets this interval's start coordinate.
+    ///
+    /// \param[in] start
+    /// \returns reference to this interval
+    GenomicInterval& Start(const Position start);
+
+    /// Sets this interval's stop coordinate.
+    ///
+    /// \param[in] stop
+    /// \returns reference to this interval
+    GenomicInterval& Stop(const Position stop);
+
+    /// \}
+
+public:
+    /// \name Interval Operations
+    /// \{
+
+    /// \returns true if same id and underlying Interval::CoveredBy() other.
+    bool CoveredBy(const GenomicInterval& other) const;
+
+    /// \returns true if same id and underlying Interval::Covers() other.
+    bool Covers(const GenomicInterval& other) const;
+
+    /// \returns true if same id and underlying Interval::Intersects() other.
+    bool Intersects(const GenomicInterval& other) const;
+
+    /// \returns true if underlying Interval::IsValid(), and id/endpoints are non-negative.
+    bool IsValid(void) const;
+
+    /// \returns length of underlying
+    size_t Length(void) const;
+
+    /// \}
+
+public:
+    /// \name Comparison Operators
+    /// \{
+
+    /// \returns true if same id & underlying interval
+    bool operator==(const GenomicInterval& other) const;
+
+    /// \returns true if either ids or underlying intervals differ
+    bool operator!=(const GenomicInterval& other) const;
+
+    /// \}
+
+private:
+    std::string name_;
+    PacBio::BAM::Interval<Position> interval_;
+};
+
+inline GenomicInterval::~GenomicInterval(void) { }
+
+inline std::string GenomicInterval::Name(void) const
+{ return name_; }
+
+inline GenomicInterval& GenomicInterval::Name(const std::string& name)
+{ name_ = name; return *this; }
+
+inline PacBio::BAM::Interval<Position> GenomicInterval::Interval(void) const
+{ return interval_; }
+
+inline GenomicInterval& GenomicInterval::Interval(const PacBio::BAM::Interval<Position>& interval)
+{ interval_ = interval; return *this; }
+
+inline bool GenomicInterval::IsValid(void) const
+{
+    return !name_.empty() &&
+           interval_.Start() >= 0 &&
+           interval_.Stop()  >= 0 &&
+           interval_.IsValid();
+}
+
+inline size_t GenomicInterval::Length(void) const
+{ return interval_.Length(); }
+
+inline Position GenomicInterval::Start(void) const
+{ return interval_.Start(); }
+
+inline GenomicInterval& GenomicInterval::Start(const Position start)
+{ interval_.Start(start); return *this; }
+
+inline Position GenomicInterval::Stop(void) const
+{ return interval_.Stop(); }
+
+inline GenomicInterval& GenomicInterval::Stop(const Position stop)
+{ interval_.Stop(stop); return *this; }
+
+inline bool GenomicInterval::operator==(const GenomicInterval& other) const
+{ return name_ == other.name_ && interval_ == other.interval_; }
+
+inline bool GenomicInterval::operator!=(const GenomicInterval& other) const
+{ return !(*this == other); }
+
+} // namespace BAM
+} // namspace PacBio
+
+#endif // GENOMICINTERVAL_H
diff --git a/include/pbbam/GenomicIntervalQuery.h b/include/pbbam/GenomicIntervalQuery.h
new file mode 100644
index 0000000..c1e10f9
--- /dev/null
+++ b/include/pbbam/GenomicIntervalQuery.h
@@ -0,0 +1,72 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef GENOMICINTERVALQUERY_H
+#define GENOMICINTERVALQUERY_H
+
+#include "pbbam/GenomicInterval.h"
+#include "pbbam/QueryBase.h"
+#include "pbbam/internal/QueryBase.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class BamFile;
+
+class PBBAM_EXPORT GenomicIntervalQuery : public internal::IQuery
+{
+public:
+    GenomicIntervalQuery(const GenomicInterval& interval,
+                         const DataSet& dataset);
+
+public:
+    GenomicIntervalQuery& Interval(const GenomicInterval& interval);
+    GenomicInterval Interval(void) const;
+
+protected:
+    FileIterPtr CreateIterator(const BamFile& bamFile);
+
+private:
+    GenomicInterval interval_;
+};
+
+//} // namespace staging
+} // namespace BAM
+} // namspace PacBio
+
+#endif // GENOMICINTERVALQUERY_H
diff --git a/include/pbbam/GroupQuery.h b/include/pbbam/GroupQuery.h
new file mode 100644
index 0000000..abc1f5c
--- /dev/null
+++ b/include/pbbam/GroupQuery.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Yuan Li
+
+#ifndef _GROUP_QUERY_H_
+#define _GROUP_QUERY_H_
+#include "GroupQueryBase.h"
+#include <htslib/sam.h>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT SequentialGroupQueryBase: public GroupQueryBase
+{
+public:
+    SequentialGroupQueryBase(const BamFile & bamFile);
+
+protected:
+    virtual bool InSameGroup(const BamRecord & record, const BamRecord & another) = 0;
+    bool GetNext(std::vector<BamRecord> & records);
+    PBBAM_SHARED_PTR<samFile>   htsFile_;
+    PBBAM_SHARED_PTR<bam_hdr_t> htsHeader_;
+    BamRecord nextRecord_;
+};
+
+//class PBBAM_EXPORT ZmwQuery: public SequentialGroupQueryBase
+//{
+//public:
+//    ZmwQuery(const BamFile & bamFile)
+//    : SequentialGroupQueryBase(bamFile) { }
+
+//private:
+//    bool InSameGroup(const BamRecord & record, const BamRecord & another) {
+//        return (record.MovieName() == another.MovieName() &&
+//                record.HoleNumber() == another.HoleNumber());
+//    }
+//};
+
+class PBBAM_EXPORT QNameQuery: public SequentialGroupQueryBase
+{
+public:
+    QNameQuery(const BamFile & bamFile) 
+    : SequentialGroupQueryBase(bamFile) { }
+
+private:
+    bool InSameGroup(const BamRecord & record, const BamRecord & another) {
+        return (record.Impl().Name() == another.Impl().Name());
+    }
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // _SEQUENTIAL_GROUP_QUERY_BASE_H_
diff --git a/include/pbbam/GroupQueryBase.h b/include/pbbam/GroupQueryBase.h
new file mode 100644
index 0000000..624bdb1
--- /dev/null
+++ b/include/pbbam/GroupQueryBase.h
@@ -0,0 +1,214 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Yuan Li
+// TODO: Up to Derek's decision. This class mostly references 
+// QueryBase.h. We may make QueryBase a template class and make
+// GroupQueryBase a specialization of the template.
+
+#ifndef _GROUP_QUERY_BASE_H_
+#define _GROUP_QUERY_BASE_H_
+
+#include "pbbam/QueryBase.h"
+#include "pbbam/BamRecord.h"
+#include <memory>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class GroupQueryBase;
+
+class GroupQueryIterator
+{
+public:
+    std::vector<BamRecord> & operator* (void);
+    std::vector<BamRecord> * operator-> (void);
+    GroupQueryIterator& operator++ (void);
+    GroupQueryIterator  operator++ (int);
+
+    bool operator== (const GroupQueryIterator & other) const;
+    bool operator!= (const GroupQueryIterator & other) const;
+
+    GroupQueryIterator(void);
+    GroupQueryIterator(GroupQueryBase & parent);
+
+private:
+    GroupQueryBase * query_;
+    std::vector<BamRecord> records_;
+    friend class GroupQueryBase;
+};
+
+class GroupQueryConstIterator
+{
+public:
+    const std::vector<BamRecord>& operator*(void) const;
+    const std::vector<BamRecord>* operator->(void) const;
+    GroupQueryConstIterator& operator++(void);
+    GroupQueryConstIterator operator++(int);
+    bool operator==(const GroupQueryConstIterator& other) const;
+    bool operator!=(const GroupQueryConstIterator& other) const;
+
+    GroupQueryConstIterator(void);
+    GroupQueryConstIterator(const GroupQueryBase& parent);
+
+private:
+    GroupQueryBase* query_;
+    std::vector<BamRecord> records_;
+    friend class GroupQueryBase;
+};
+
+
+class PBBAM_EXPORT GroupQueryBase
+{
+public:
+    typedef GroupQueryIterator iterator;
+
+protected:
+    BamFile file_;
+
+public:
+    virtual ~GroupQueryBase(void);
+
+public:
+    GroupQueryBase::iterator begin(void);
+    GroupQueryBase::iterator end(void);
+
+protected:
+    GroupQueryBase(const BamFile & file);
+    virtual bool GetNext(std::vector<BamRecord>& records) = 0;
+
+    friend class GroupQueryIterator;
+    friend class GroupQueryConstIterator;
+};
+
+inline GroupQueryBase::iterator GroupQueryBase::begin(void)
+{ return GroupQueryBase::iterator(*this); }
+
+inline GroupQueryBase::iterator GroupQueryBase::end(void)
+{ return GroupQueryBase::iterator(); }
+
+
+inline GroupQueryBase::GroupQueryBase(const BamFile & file)
+    : file_(file)
+{ }
+
+inline GroupQueryBase::~GroupQueryBase(void) { }
+
+// -------------------
+// GroupQueryIterator
+// -------------------
+
+inline GroupQueryIterator::GroupQueryIterator(void): query_(0) {}
+
+inline GroupQueryIterator::GroupQueryIterator(GroupQueryBase & parent)
+    : query_(& parent)
+    , records_()
+{
+    if (!(query_->GetNext(records_)))
+        query_ = 0;
+}
+
+inline std::vector<BamRecord>& GroupQueryIterator::operator* (void)
+{ return records_; }
+
+inline std::vector<BamRecord>* GroupQueryIterator::operator-> (void)
+{ return &(operator*()); }
+
+inline GroupQueryIterator& GroupQueryIterator::operator++ (void)
+{
+    if (!(query_->GetNext(records_)))
+        query_ = 0;
+    return *this;
+}
+
+inline GroupQueryIterator GroupQueryIterator::operator++ (int)
+{
+    GroupQueryIterator result(*this);
+    ++(*this);
+    return result;
+}
+
+inline bool GroupQueryIterator::operator==(const GroupQueryIterator& other) const
+{ return query_ == other.query_; }
+
+inline bool GroupQueryIterator::operator!=(const GroupQueryIterator& other) const
+{ return !(*this == other); }
+
+
+// -------------------
+// GroupQueryConstIterator
+// -------------------
+
+inline const std::vector<BamRecord>& GroupQueryConstIterator::operator*(void) const
+{ return records_; }
+
+inline const std::vector<BamRecord>* GroupQueryConstIterator::operator->(void) const
+{ return &(operator*()); }
+
+inline GroupQueryConstIterator& GroupQueryConstIterator::operator++(void)
+{
+    if (!(query_->GetNext(records_)))
+        query_ = 0;
+    return *this;
+}
+
+inline GroupQueryConstIterator GroupQueryConstIterator::operator++(int)
+{
+    GroupQueryConstIterator result(*this);
+    ++(*this);
+    return result;
+}
+
+inline bool GroupQueryConstIterator::operator==(const GroupQueryConstIterator& other) const
+{ return query_ == other.query_; }
+
+inline bool GroupQueryConstIterator::operator!=(const GroupQueryConstIterator& other) const
+{ return !(*this == other); }
+
+inline GroupQueryConstIterator::GroupQueryConstIterator(void): query_(0) { }
+
+inline GroupQueryConstIterator::GroupQueryConstIterator(const GroupQueryBase& parent)
+    : query_(const_cast<GroupQueryBase*>(&parent))
+    , records_()
+{
+    if (!(query_->GetNext(records_)))
+        query_ = 0;
+}
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // _GROUP_QUERY_BASE_H_
diff --git a/include/pbbam/IndexedFastaReader.h b/include/pbbam/IndexedFastaReader.h
new file mode 100644
index 0000000..aa485db
--- /dev/null
+++ b/include/pbbam/IndexedFastaReader.h
@@ -0,0 +1,112 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: David Alexander
+
+#ifndef INDEXEDFASTAREADER_H
+#define INDEXEDFASTAREADER_H
+
+#include "pbbam/Orientation.h"
+#include "pbbam/Position.h"
+#include "htslib/faidx.h"
+
+#include <string>
+#include <iostream>
+#include <stdexcept>
+
+namespace PacBio {
+namespace BAM {
+
+class GenomicInterval;
+class BamRecord;
+
+class IndexedFastaReader {
+
+public:
+    IndexedFastaReader() = delete;
+    IndexedFastaReader(const std::string& filename);
+    ~IndexedFastaReader();
+
+public:
+    // Copy constructor
+    IndexedFastaReader(const IndexedFastaReader& src)
+    {
+        if (!Open(src.filename_)) 
+            throw std::runtime_error("Cannot open file " + src.filename_);
+    }
+
+    // Copy assignment operator
+    IndexedFastaReader& operator=(const IndexedFastaReader& rhs)
+    {
+        if(&rhs == this) return *this;
+
+        Open(rhs.filename_);
+        return *this;
+    }
+
+public:
+    std::string Subsequence(const std::string& id, Position begin, Position end) const;
+    std::string Subsequence(const GenomicInterval& interval) const;
+    std::string Subsequence(const char* htslibRegion) const;
+
+public:
+    // \returns subsequence of the reference corresponding to the bamRecord,
+    // oriented and gapped as requested.  For example, "native" orientation
+    // and "gapped" will return the reference sequence with gaps inserted, as
+    // would align against the read in "native" orientation
+    std::string ReferenceSubsequence(const BamRecord& bamRecord,
+                                     const Orientation orientation=Orientation::GENOMIC,
+                                     const bool gapped=false,
+                                     const bool exciseSoftClips=false) const;
+
+public:
+    int NumSequences() const;
+    bool HasSequence(const std::string& name) const;
+    int SequenceLength(const std::string& name) const;
+
+private:
+    std::string filename_;
+    faidx_t* handle_;
+
+private:
+    void Close(void);
+    bool Open(const std::string& filename);
+};
+
+
+
+}  // PacBio
+}  // BAM
+#endif  // INDEXEDFASTAREADER_H
diff --git a/include/pbbam/Interval.h b/include/pbbam/Interval.h
new file mode 100644
index 0000000..6c2e91a
--- /dev/null
+++ b/include/pbbam/Interval.h
@@ -0,0 +1,212 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef INTERVAL_H
+#define INTERVAL_H
+
+#include "pbbam/Config.h"
+#include <string>
+
+#define BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
+#include <boost/icl/discrete_interval.hpp>
+#include <boost/icl/interval_traits.hpp>
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief Utility class for working with half-open (right-open) intervals. [start, stop)
+///
+/// \note This class is agnostic whether the values are 0-based or 1-based.
+/// \todo Should it be? Should that go here or "higher up"?
+///
+template<typename T>
+class Interval
+{
+public:
+    typedef boost::icl::discrete_interval<T> interval_type;
+
+public:
+
+    /// \name Constructors
+    /// \{
+
+    /** Default constructor; yields an empty interval [0,0) */
+    inline Interval(void);
+
+    /** Constructor for a singleton interval [val,val+1) */
+    inline Interval(const T val);
+
+    /** Constructor for interval from [start, stop) */
+    inline Interval(const T start, const T stop);
+
+    /** Copy constructor */
+    inline Interval(const Interval<T>& other);
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    /// \returns interval start coordinate
+    inline T Start(void) const;
+
+    /// Sets this interval's start coordinate.
+    ///
+    /// \param[in] start
+    /// \returns reference to this interval
+    inline Interval<T>& Start(const T& start);
+
+    /// \returns interval stop coordinate
+    inline T Stop(void) const;
+
+    /// Sets this interval's stop coordinate.
+    ///
+    /// \param[in] stop
+    /// \returns reference to this interval
+    inline Interval<T>& Stop(const T& stop);
+
+    /// \}
+
+    /// \name Interval Operations
+
+    /// \returns true if this interval is fully covered by (or contained in) \p other
+    inline bool CoveredBy(const Interval<T>& other) const;
+
+    //// \returns true if this interval covers (or contains) \p other
+    inline bool Covers(const Interval<T>& other) const;
+
+    /// \returns true if intervals interset
+    inline bool Intersects(const Interval<T>& other) const;
+
+    /// \returns true if interval is valid (e.g. start < stop)
+    inline bool IsValid(void) const;
+
+    /// \returns interval length
+    inline size_t Length(void) const;
+
+    /// \}
+
+    /// \name Comparison Operators
+    /// \{
+
+    /// \returns true if both intervals share the same endpoints
+    inline bool operator==(const Interval<T>& other) const;
+
+    /// \returns true if either interval's endpoints differ
+    inline bool operator!=(const Interval<T>& other) const;
+
+    /// \}
+
+private:
+    interval_type data_;
+};
+
+template<typename T>
+Interval<T>::Interval(void)
+    : data_(boost::icl::discrete_interval<T>::right_open(0,0))
+{ }
+
+template<typename T>
+Interval<T>::Interval(const T val)
+    : data_(boost::icl::discrete_interval<T>::right_open(val,val+1))
+{ }
+
+template<typename T>
+Interval<T>::Interval(const T start, const T stop)
+    : data_(boost::icl::discrete_interval<T>::right_open(start,stop))
+{ }
+
+template<typename T>
+Interval<T>::Interval(const Interval<T>& other)
+    : data_(boost::icl::discrete_interval<T>::right_open(other.Start(), other.Stop()))
+{ }
+
+template<typename T>
+inline bool Interval<T>::operator==(const Interval<T>& other) const
+{ return data_ == other.data_; }
+
+template<typename T>
+inline bool Interval<T>::operator!=(const Interval<T>& other) const
+{ return !(data_ == other.data_); }
+
+template<typename T>
+inline bool Interval<T>::CoveredBy(const Interval<T>& other) const
+{ return boost::icl::within(data_, other.data_); }
+
+template<typename T>
+inline bool Interval<T>::Covers(const Interval<T>& other) const
+{ return boost::icl::contains(data_, other.data_); }
+
+template<typename T>
+inline bool Interval<T>::Intersects(const Interval<T>& other) const
+{ return boost::icl::intersects(data_, other.data_); }
+
+template<typename T>
+inline bool Interval<T>::IsValid(void) const
+{ return !boost::icl::is_empty(data_); }
+
+template<typename T>
+inline size_t Interval<T>::Length(void) const
+{ return boost::icl::length(data_); }
+
+template<typename T>
+inline T Interval<T>::Start(void) const
+{ return data_.lower(); }
+
+template<typename T>
+inline Interval<T>& Interval<T>::Start(const T& start)
+{
+    data_ = boost::icl::discrete_interval<T>::right_open(start, data_.upper());
+    return *this;
+}
+
+template<typename T>
+inline T Interval<T>::Stop(void) const
+{ return data_.upper(); }
+
+template<typename T>
+inline Interval<T>& Interval<T>::Stop(const T& stop)
+{
+    data_ = boost::icl::discrete_interval<T>::right_open(data_.lower(), stop);
+    return *this;
+}
+
+} // namespace BAM
+} // namspace PacBio
+
+#endif // GENOMICINTERVAL_H
diff --git a/include/pbbam/LocalContextFlags.h b/include/pbbam/LocalContextFlags.h
new file mode 100644
index 0000000..53e8c9e
--- /dev/null
+++ b/include/pbbam/LocalContextFlags.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Lance Hepler
+
+#ifndef LOCALCONTEXTFLAGS_H
+#define LOCALCONTEXTFLAGS_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+enum LocalContextFlags : uint8_t
+{
+    NO_LOCAL_CONTEXT = 0,
+    ADAPTER_BEFORE   = 1,
+    ADAPTER_AFTER    = 2,
+    BARCODE_BEFORE   = 4,
+    BARCODE_AFTER    = 8,
+    FORWARD_PASS     = 16,
+    REVERSE_PASS     = 32
+};
+
+// constexpr is implicitly inline
+constexpr LocalContextFlags operator|(const LocalContextFlags lhs, const LocalContextFlags rhs)
+{
+    return static_cast<LocalContextFlags>(static_cast<int>(lhs) | static_cast<int>(rhs));
+}
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // LOCALCONTEXTFLAGS_H
diff --git a/include/pbbam/Orientation.h b/include/pbbam/Orientation.h
new file mode 100644
index 0000000..7582199
--- /dev/null
+++ b/include/pbbam/Orientation.h
@@ -0,0 +1,55 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef ORIENTATION_H
+#define ORIENTATION_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+enum class Orientation
+{
+    NATIVE
+  , GENOMIC
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ORIENTATION_H
diff --git a/include/pbbam/PbiBuilder.h b/include/pbbam/PbiBuilder.h
new file mode 100644
index 0000000..6e99302
--- /dev/null
+++ b/include/pbbam/PbiBuilder.h
@@ -0,0 +1,121 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#ifndef PBIBUILDER_H
+#define PBIBUILDER_H
+
+#include "pbbam/Config.h"
+#include <memory>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class BamRecord;
+class PbiRawData;
+
+namespace internal { class PbiBuilderPrivate; }
+
+/// This class may be used to construct PBI index data while a BAM file is being
+/// written, rather than waiting to process it at the end.
+///
+class PBBAM_EXPORT PbiBuilder
+{
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    /// Initialize builder to write data to \p pbiFilename.
+    ///
+    /// \throws std::runtime_error if PBI file cannot be opened for writing
+    ///
+    PbiBuilder(const std::string& pbiFilename);
+
+    /// Initialize builder to write data to \p pbiFilename. Reference data-tracking
+    /// structures will be initialized to expect \p numReferenceSequences. (This is
+    /// useful so that we can mark any references that lack observed data appropriately).
+    ///
+    /// \throws std::runtime_error if PBI file cannot be opened for writing
+    ///
+    PbiBuilder(const std::string& pbiFilename, const size_t numReferenceSequences);
+
+    /// On destruction, data summaries are calculated, raw data is written to file, and
+    /// file handle closed.
+    ///
+    ~PbiBuilder(void);
+
+    /// \}
+
+public:
+    /// \name Index Building
+    /// \{
+
+    /// Adds \p record's data to underlying raw data structure. \p vOffset is the BGZF
+    /// virtual offset into the BAM file where the record begins.
+    ///
+    /// \sa BamWriter::Write(const BamRecord& record, int64_t* vOffset) for the easiest
+    ///     way to retrieve this information while generating a BAM file. See example below:
+    ///
+    /// \code{.cpp}
+    ///  BamWriter writer(...);
+    ///  PbiBuilder pbiBuilder(...);
+    ///  int64_t vOffset;
+    ///  while (...) {
+    ///     BamRecord record;
+    ///     // ... generate record data ...
+    ///     writer.Write(record, &vOffset);
+    ///     pbiBuilder.AddRecord(record, &vOffset);
+    ///  }
+    /// \endcode
+    ///
+    void AddRecord(const BamRecord& record, const int64_t vOffset);
+
+    /// \returns const reference to current raw index data. Mostly only used for testing;
+    ///          shouldn't be needed by most client code.
+    ///
+    const PbiRawData& Index(void) const;
+
+    /// \}
+
+private:
+    std::unique_ptr<internal::PbiBuilderPrivate> d_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PBIBUILDER_H
diff --git a/include/pbbam/PbiFile.h b/include/pbbam/PbiFile.h
new file mode 100644
index 0000000..81c3de3
--- /dev/null
+++ b/include/pbbam/PbiFile.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#ifndef PBIFILE_H
+#define PBIFILE_H
+
+#include "pbbam/Config.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class BamFile;
+
+// class-like namespace
+namespace PbiFile
+{
+
+    /// PBI File Sections
+    ///
+    /// See (spec/doc links) for more details.
+    ///
+    enum Section
+    {
+         SUBREAD   = 0x0000  ///< SubreadData   (required)
+       , MAPPED    = 0x0001  ///< MappedData    (always optional)
+       , REFERENCE = 0x0002  ///< ReferenceData (always optional)
+       , BARCODE   = 0x0004  ///< BarcodeData   (always optional)
+
+       , ALL  = SUBREAD | MAPPED | REFERENCE | BARCODE  ///< synonym for building
+    };
+    typedef uint16_t Sections;
+
+    /// PBI File Version
+    enum VersionEnum
+    {
+        Version_3_0_0 = 0x030000
+
+      , CurrentVersion = Version_3_0_0
+    };
+
+    /// Builds PBI index data from the supplied ".bam" file and writes a ".pbi" file.
+    ///
+    /// \param[in] bamFile The source BamFile.
+    ///
+    /// \throws std::exception if index file could not be created
+    ///
+    PBBAM_EXPORT void CreateFrom(const BamFile& bamFile);
+
+} // namespace PbiFile
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PBIFILE_H
diff --git a/include/pbbam/PbiIndex.h b/include/pbbam/PbiIndex.h
new file mode 100644
index 0000000..79aa880
--- /dev/null
+++ b/include/pbbam/PbiIndex.h
@@ -0,0 +1,299 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#ifndef PBIINDEX_H
+#define PBIINDEX_H
+
+#include "pbbam/Config.h"
+#include "pbbam/LocalContextFlags.h"
+#include "pbbam/PbiFile.h"
+#include "pbbam/Strand.h"
+#include <deque>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+namespace internal { class PbiIndexPrivate; }
+
+enum class SubreadField
+{
+    RG_ID
+  , Q_START
+  , Q_END
+  , ZMW
+  , READ_QUALITY
+  , VIRTUAL_OFFSET
+};
+
+enum class MappedField
+{
+    T_ID
+  , T_START
+  , T_END
+  , A_START
+  , A_END
+  , N_M
+  , N_MM
+  , N_INS
+  , N_DEL
+  , MAP_QUALITY
+  , STRAND
+};
+
+enum class BarcodeField
+{
+    BC_LEFT
+  , BC_RIGHT
+  , BC_QUALITY
+  , CONTEXT_FLAG
+};
+
+enum class CompareType
+{
+    EQUAL
+  , LESS_THAN
+  , LESS_THAN_EQUAL
+  , GREATER_THAN
+  , GREATER_THAN_EQUAL
+  , NOT_EQUAL
+};
+
+//
+// Contiguous reads that satisfy a query will be returned as a block.
+// This is to help minimize number of seeks (or even unneccesary checks).
+//
+// An index query can iterate over the lookup result 'IndexResultBlocks' list to
+// perform a seek and fetch 'numReads' consecutive records before needing to
+// seek again.
+//
+struct PBBAM_EXPORT IndexResultBlock
+{
+public:
+    IndexResultBlock(void);
+    IndexResultBlock(size_t idx, size_t numReads);
+
+public:
+    bool operator==(const IndexResultBlock& other) const;
+    bool operator!=(const IndexResultBlock& other) const;
+
+public:
+    size_t  firstIndex_;
+    size_t  numReads_;
+    int64_t virtualOffset_;
+};
+
+typedef std::deque<IndexResultBlock> IndexResultBlocks;
+
+typedef std::vector<size_t>       IndexList;
+typedef std::pair<size_t, size_t> IndexRange;
+
+template<typename FieldType, typename ValueType>
+struct IndexRequestBase
+{
+public:
+    FieldType field_;
+    ValueType value_;
+    CompareType compareType_;
+
+protected:
+    IndexRequestBase(const FieldType field,
+                     const ValueType& value,
+                     const CompareType compareType = CompareType::EQUAL);
+};
+
+// all multi-requests use CompareType::EQUAL
+template<typename FieldType, typename ValueType>
+struct IndexMultiRequestBase
+{
+public:
+    FieldType field_;
+    std::vector<ValueType> values_;
+
+protected:
+    IndexMultiRequestBase(const FieldType field,
+                          const std::vector<ValueType>& values);
+};
+
+class PBBAM_EXPORT PbiIndex
+{
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    PbiIndex(const std::string& pbiFilename);
+    PbiIndex(const PbiIndex& other);
+    PbiIndex(PbiIndex&& other);
+    PbiIndex& operator=(const PbiIndex& other);
+    PbiIndex& operator=(PbiIndex&& other);
+    ~PbiIndex(void);
+
+    /// \}
+
+public:
+    // PBI attributes
+    bool HasBarcodeData(void) const;
+    bool HasMappedData(void) const;
+    bool HasReferenceData(void) const;
+    bool HasSection(const PbiFile::Section section) const;
+
+    PbiFile::Sections FileSections(void) const;
+    uint32_t NumReads(void) const;
+    PbiFile::VersionEnum Version(void) const;
+
+public:
+
+    template<typename FieldType, typename ValueType>
+    IndexList RawIndices(const IndexRequestBase<FieldType, ValueType>& request) const;
+
+    template<typename FieldType, typename ValueType>
+    IndexList RawIndices(const IndexMultiRequestBase<FieldType, ValueType>& request) const;
+
+    template<typename FieldType, typename ValueType>
+    IndexResultBlocks Lookup(const IndexRequestBase<FieldType, ValueType>& request) const;
+
+    template<typename FieldType, typename ValueType>
+    IndexResultBlocks Lookup(const IndexMultiRequestBase<FieldType, ValueType>& request) const;
+
+    IndexResultBlocks LookupReference(const int32_t tId) const;
+
+    const std::vector<int64_t>& VirtualFileOffsets(void) const;
+
+private:
+    PbiIndex(void);
+    std::unique_ptr<internal::PbiIndexPrivate> d_;
+};
+
+template<SubreadField field, typename ValueType>
+class SubreadIndexRequest : public IndexRequestBase<SubreadField, ValueType>
+{
+public:
+    SubreadIndexRequest(const ValueType& value,
+                        const CompareType& compareType = CompareType::EQUAL);
+};
+
+template<SubreadField field, typename ValueType>
+class SubreadIndexMultiRequest : public IndexMultiRequestBase<SubreadField, ValueType>
+{
+public:
+    SubreadIndexMultiRequest(const std::vector<ValueType>& values);
+};
+
+typedef SubreadIndexRequest<SubreadField::RG_ID,        int32_t>  ReadGroupIndexRequest;
+typedef SubreadIndexRequest<SubreadField::Q_START,      int32_t>  QueryStartIndexRequest;
+typedef SubreadIndexRequest<SubreadField::Q_END,        int32_t>  QueryEndIndexRequest;
+typedef SubreadIndexRequest<SubreadField::ZMW,          int32_t>  ZmwIndexRequest;
+typedef SubreadIndexRequest<SubreadField::READ_QUALITY, uint16_t> ReadQualityIndexRequest;
+
+typedef SubreadIndexMultiRequest<SubreadField::RG_ID,        int32_t>  ReadGroupIndexMultiRequest;
+typedef SubreadIndexMultiRequest<SubreadField::Q_START,      int32_t>  QueryStartIndexMultiRequest;
+typedef SubreadIndexMultiRequest<SubreadField::Q_END,        int32_t>  QueryEndIndexMultiRequest;
+typedef SubreadIndexMultiRequest<SubreadField::ZMW,          int32_t>  ZmwIndexMultiRequest;
+typedef SubreadIndexMultiRequest<SubreadField::READ_QUALITY, uint16_t> ReadQualityIndexMultiRequest;
+
+template<MappedField field, typename ValueType>
+class MappedIndexRequest : public IndexRequestBase<MappedField, ValueType>
+{
+public:
+    MappedIndexRequest(const ValueType& value, const
+                       CompareType& compareType = CompareType::EQUAL);
+};
+
+template<MappedField field, typename ValueType>
+class MappedIndexMultiRequest : public IndexMultiRequestBase<SubreadField, ValueType>
+{
+public:
+    MappedIndexMultiRequest(const std::vector<ValueType>& values);
+};
+
+typedef MappedIndexRequest<MappedField::T_ID,         int32_t> ReferenceIdIndexRequest;
+typedef MappedIndexRequest<MappedField::T_START,      int32_t> ReferenceStartIndexRequest;
+typedef MappedIndexRequest<MappedField::T_END,        int32_t> ReferenceEndIndexRequest;
+typedef MappedIndexRequest<MappedField::A_START,      int32_t> AlignedStartIndexRequest;
+typedef MappedIndexRequest<MappedField::A_END,        int32_t> AlignedEndIndexRequest;
+typedef MappedIndexRequest<MappedField::N_M,          int32_t> NumMatchesIndexRequest;
+typedef MappedIndexRequest<MappedField::N_MM,         int32_t> NumMismatchesIndexRequest;
+typedef MappedIndexRequest<MappedField::N_INS,        int32_t> NumInsertionsIndexRequest;
+typedef MappedIndexRequest<MappedField::N_DEL,        int32_t> NumDeletionsIndexRequest;
+typedef MappedIndexRequest<MappedField::MAP_QUALITY,  uint8_t> MapQualityIndexRequest;
+typedef MappedIndexRequest<MappedField::STRAND,       Strand>  StrandIndexRequest;
+
+typedef MappedIndexMultiRequest<MappedField::T_ID,         int32_t> ReferenceIdIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::T_START,      int32_t> ReferenceStartIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::T_END,        int32_t> ReferenceEndIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::A_START,      int32_t> AlignedStartIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::A_END,        int32_t> AlignedEndIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::N_M,          int32_t> NumMatchesIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::N_MM,         int32_t> NumMismatchesIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::N_INS,        int32_t> NumInsertionsIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::N_DEL,        int32_t> NumDeletionsIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::MAP_QUALITY,  uint8_t> MapQualityIndexMultiRequest;
+typedef MappedIndexMultiRequest<MappedField::STRAND,       Strand>  StrandIndexMultiRequest;
+
+template<BarcodeField field, typename ValueType>
+class BarcodeIndexRequest : public IndexRequestBase<BarcodeField, ValueType>
+{
+public:
+    BarcodeIndexRequest(const ValueType& value,
+                        const CompareType& compareType = CompareType::EQUAL);
+};
+
+template<BarcodeField field, typename ValueType>
+class BarcodeIndexMultiRequest : public IndexMultiRequestBase<BarcodeField, ValueType>
+{
+public:
+    BarcodeIndexMultiRequest(const std::vector<ValueType>& values);
+};
+
+typedef BarcodeIndexRequest<BarcodeField::BC_LEFT,      uint16_t> BarcodeLeftIndexRequest;
+typedef BarcodeIndexRequest<BarcodeField::BC_RIGHT,     uint16_t> BarcodeRightIndexRequest;
+typedef BarcodeIndexRequest<BarcodeField::BC_QUALITY,   uint8_t>  BarcodeQualityIndexRequest;
+typedef BarcodeIndexRequest<BarcodeField::CONTEXT_FLAG, LocalContextFlags> ContextFlagIndexRequest;
+
+typedef BarcodeIndexMultiRequest<BarcodeField::BC_LEFT,      uint16_t> BarcodeLeftIndexMultiRequest;
+typedef BarcodeIndexMultiRequest<BarcodeField::BC_RIGHT,     uint16_t> BarcodeRightIndexMultiRequest;
+typedef BarcodeIndexMultiRequest<BarcodeField::BC_QUALITY,   uint8_t>  BarcodeQualityIndexMultiRequest;
+typedef BarcodeIndexMultiRequest<BarcodeField::CONTEXT_FLAG, LocalContextFlags> ContextFlagIndexMultiRequest;
+
+} // namespace BAM
+} // namespace PacBio
+
+#include "internal/PbiIndex_p.inl"
+
+#endif // PBIINDEX_H
diff --git a/include/pbbam/PbiRawData.h b/include/pbbam/PbiRawData.h
new file mode 100644
index 0000000..37c7706
--- /dev/null
+++ b/include/pbbam/PbiRawData.h
@@ -0,0 +1,307 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#ifndef PBIRAWDATA_H
+#define PBIRAWDATA_H
+
+#include "pbbam/Config.h"
+#include "pbbam/PbiFile.h"
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+class BamRecord;
+
+class PBBAM_EXPORT PbiRawBarcodeData
+{
+public:
+    PbiRawBarcodeData(void);
+    PbiRawBarcodeData(uint32_t numReads);
+    PbiRawBarcodeData(const PbiRawBarcodeData& other);
+    PbiRawBarcodeData(PbiRawBarcodeData&& other);
+    PbiRawBarcodeData& operator=(const PbiRawBarcodeData& other);
+    PbiRawBarcodeData& operator=(PbiRawBarcodeData&& other);
+
+public:
+    /// Maybe add barcode data for \p b, if available.
+    /// \returns true if record had barcode data
+    ///
+    bool AddRecord(const BamRecord& b);
+
+public:
+    std::vector<uint16_t> bcLeft_;
+    std::vector<uint16_t> bcRight_;
+    std::vector<uint8_t>  bcQual_;
+    std::vector<uint8_t>  ctxtFlag_;
+};
+
+class PBBAM_EXPORT PbiRawMappedData
+{
+public:
+    PbiRawMappedData(void);
+    PbiRawMappedData(uint32_t numReads);
+    PbiRawMappedData(const PbiRawMappedData& other);
+    PbiRawMappedData(PbiRawMappedData&& other);
+    PbiRawMappedData& operator=(const PbiRawMappedData& other);
+    PbiRawMappedData& operator=(PbiRawMappedData&& other);
+
+public:
+    /// Maybe add mapping data for \p b, if available.
+    /// \returns true if record had mapping data
+    ///
+    bool AddRecord(const BamRecord& b);
+
+public:
+    std::vector<int32_t>  tId_;
+    std::vector<uint32_t> tStart_;
+    std::vector<uint32_t> tEnd_;
+    std::vector<uint32_t> aStart_;
+    std::vector<uint32_t> aEnd_;
+    std::vector<uint8_t>  revStrand_;
+    std::vector<uint32_t> nM_;
+    std::vector<uint32_t> nMM_;
+    std::vector<uint8_t>  mapQV_;
+};
+
+class PBBAM_EXPORT PbiReferenceEntry
+{
+public:
+    typedef uint32_t ID;
+    typedef uint32_t Row;
+
+public:
+    PbiReferenceEntry(void);
+    PbiReferenceEntry(ID id);
+    PbiReferenceEntry(const PbiReferenceEntry& other);
+    PbiReferenceEntry(PbiReferenceEntry&& other);
+    PbiReferenceEntry& operator=(const PbiReferenceEntry& other);
+    PbiReferenceEntry& operator=(PbiReferenceEntry&& other);
+
+    bool operator==(const PbiReferenceEntry& other) const
+    {
+        return tId_      == other.tId_ &&
+               beginRow_ == other.beginRow_ &&
+               endRow_   == other.endRow_;
+    }
+
+public:
+    static const ID  UNMAPPED_ID;
+    static const Row UNSET_ROW;
+
+public:
+    ID  tId_;
+    Row beginRow_;
+    Row endRow_;
+};
+
+class PBBAM_EXPORT PbiRawReferenceData
+{
+public:
+    PbiRawReferenceData(void);
+    PbiRawReferenceData(uint32_t numRefs);
+    PbiRawReferenceData(const PbiRawReferenceData& other);
+    PbiRawReferenceData(PbiRawReferenceData&& other);
+    PbiRawReferenceData& operator=(const PbiRawReferenceData& other);
+    PbiRawReferenceData& operator=(PbiRawReferenceData&& other);
+
+public:
+    std::vector<PbiReferenceEntry> entries_;
+};
+
+class PBBAM_EXPORT PbiRawSubreadData
+{
+public:
+    PbiRawSubreadData(void);
+    PbiRawSubreadData(uint32_t numReads);
+    PbiRawSubreadData(const PbiRawSubreadData& other);
+    PbiRawSubreadData(PbiRawSubreadData&& other);
+    PbiRawSubreadData& operator=(const PbiRawSubreadData& other);
+    PbiRawSubreadData& operator=(PbiRawSubreadData&& other);
+
+public:
+    void AddRecord(const BamRecord& b, int64_t offset);
+
+public:
+    std::vector<int32_t>  rgId_;
+    std::vector<int32_t>  qStart_;
+    std::vector<int32_t>  qEnd_;
+    std::vector<int32_t>  holeNumber_;
+    std::vector<uint16_t> readQual_;
+    std::vector<int64_t>  fileOffset_;
+};
+
+class PBBAM_EXPORT PbiRawData
+{
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    /// Default ctor. Used in index building
+    PbiRawData(void);
+
+    /// Load raw data from \p pbiFilename.
+    ///
+    /// \param[in] pbiFilename PBI filename
+    ///
+    /// \throws if file contents cannot be loaded properly
+    ///
+    PbiRawData(const std::string& pbiFilename);
+
+    PbiRawData(const PbiRawData& other);
+    PbiRawData(PbiRawData&& other);
+    PbiRawData& operator=(const PbiRawData& other);
+    PbiRawData& operator=(PbiRawData&& other);
+    ~PbiRawData(void);
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    bool HasBarcodeData(void) const;
+    bool HasMappedData(void) const;
+    bool HasReferenceData(void) const;
+    bool HasSection(const PbiFile::Section section) const;
+
+    PbiFile::Sections FileSections(void) const;
+    uint32_t NumReads(void) const;
+    PbiFile::VersionEnum Version(void) const;
+
+    /// \}
+
+public:
+    /// \name Indexed Sections
+    /// \{
+
+    const PbiRawBarcodeData&   BarcodeData(void) const;
+    const PbiRawMappedData&    MappedData(void) const;
+    const PbiRawReferenceData& ReferenceData(void) const;
+    const PbiRawSubreadData&   SubreadData(void) const;
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    PbiRawData& FileSections(PbiFile::Sections sections);
+    PbiRawData& NumReads(uint32_t num);
+    PbiRawData& Version(PbiFile::VersionEnum version);
+
+    /// \}
+
+public:
+    /// \name Indexed Sections
+
+    PbiRawBarcodeData&   BarcodeData(void);
+    PbiRawMappedData&    MappedData(void);
+    PbiRawReferenceData& ReferenceData(void);
+    PbiRawSubreadData&   SubreadData(void);
+
+    /// \}
+
+private:
+    PbiFile::VersionEnum version_;
+    PbiFile::Sections    sections_;
+    uint32_t             numReads_;
+    PbiRawBarcodeData    barcodeData_;
+    PbiRawMappedData     mappedData_;
+    PbiRawReferenceData  referenceData_;
+    PbiRawSubreadData    subreadData_;
+};
+
+inline const PbiRawBarcodeData& PbiRawData::BarcodeData(void) const
+{ return barcodeData_; }
+
+inline PbiRawBarcodeData& PbiRawData::BarcodeData(void)
+{ return barcodeData_; }
+
+inline PbiFile::Sections PbiRawData::FileSections(void) const
+{ return sections_; }
+
+inline PbiRawData& PbiRawData::FileSections(PbiFile::Sections sections)
+{ sections_ = sections; return *this; }
+
+inline bool PbiRawData::HasBarcodeData(void) const
+{ return HasSection(PbiFile::BARCODE); }
+
+inline bool PbiRawData::HasMappedData(void) const
+{ return HasSection(PbiFile::MAPPED); }
+
+inline bool PbiRawData::HasReferenceData(void) const
+{ return HasSection(PbiFile::REFERENCE); }
+
+inline bool PbiRawData::HasSection(const PbiFile::Section section) const
+{ return (sections_ & section) != 0; }
+
+inline uint32_t PbiRawData::NumReads(void) const
+{ return numReads_; }
+
+inline PbiRawData& PbiRawData::NumReads(uint32_t num)
+{ numReads_ = num; return *this; }
+
+inline const PbiRawMappedData& PbiRawData::MappedData(void) const
+{ return mappedData_; }
+
+inline PbiRawMappedData& PbiRawData::MappedData(void)
+{ return mappedData_; }
+
+inline const PbiRawReferenceData& PbiRawData::ReferenceData(void) const
+{ return referenceData_; }
+
+inline PbiRawReferenceData& PbiRawData::ReferenceData(void)
+{ return referenceData_; }
+
+inline const PbiRawSubreadData& PbiRawData::SubreadData(void) const
+{ return subreadData_; }
+
+inline PbiRawSubreadData& PbiRawData::SubreadData(void)
+{ return subreadData_; }
+
+inline PbiFile::VersionEnum PbiRawData::Version(void) const
+{ return version_; }
+
+inline PbiRawData& PbiRawData::Version(PbiFile::VersionEnum version)
+{ version_ = version; return *this; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PBIRAWDATA_H
diff --git a/include/pbbam/Position.h b/include/pbbam/Position.h
new file mode 100644
index 0000000..110d7ed
--- /dev/null
+++ b/include/pbbam/Position.h
@@ -0,0 +1,59 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#ifndef POSITION_H
+#define POSITION_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+/// \typedef typedef int32_t PacBio::BAM::Position
+///
+/// This type refers to all genomic positions. We use signed
+/// because SAM/BAM uses the -1 value to indicate unknown, unmapped, etc.
+/// positions.
+///
+typedef int32_t Position;
+
+static const Position UnmappedPosition = Position(-1);
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // POSITION_H
diff --git a/include/pbbam/ProgramInfo.h b/include/pbbam/ProgramInfo.h
new file mode 100644
index 0000000..d1bbcfe
--- /dev/null
+++ b/include/pbbam/ProgramInfo.h
@@ -0,0 +1,186 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef PROGRAMINFO_H
+#define PROGRAMINFO_H
+
+#include "pbbam/Config.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT ProgramInfo
+{
+public:
+    /// \name Conversion & Validation
+    ///
+
+    static ProgramInfo FromSam(const std::string& sam);
+
+    static std::string ToSam(const ProgramInfo& prog);
+
+    /// \}
+
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    ProgramInfo(void);
+    ProgramInfo(const std::string& id);
+    ProgramInfo(const ProgramInfo& other);
+    ProgramInfo(ProgramInfo&& other);
+    ProgramInfo& operator=(const ProgramInfo& other);
+    ProgramInfo& operator=(ProgramInfo&& other);
+    ~ProgramInfo(void);
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    std::string CommandLine(void) const;
+
+    std::map<std::string, std::string> CustomTags(void) const;
+
+    std::string Description(void) const;
+
+    std::string Id(void) const;
+
+    std::string Name(void) const;
+
+    std::string PreviousProgramId(void) const;
+
+    std::string Version(void) const;
+
+    /// \}
+
+    /// \name Conversion & Validation
+    ///
+
+    bool IsValid(void) const;
+
+    std::string ToSam(void) const;
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    ProgramInfo& CommandLine(const std::string& cmd);
+
+    ProgramInfo& CustomTags(const std::map<std::string, std::string>& custom);
+
+    ProgramInfo& Description(const std::string& description);
+
+    ProgramInfo& Id(const std::string& id);
+
+    ProgramInfo& Name(const std::string& name);
+
+    ProgramInfo& PreviousProgramId(const std::string& id);
+
+    ProgramInfo& Version(const std::string& version);
+
+    /// \}
+
+private:
+    std::string commandLine_;            // CL:<CommandLine>
+    std::string description_;            // DS:<Description>
+    std::string id_;                     // ID:<ID>              * Unique ID required for valid SAM header*
+    std::string name_;                   // PN:<Name>
+    std::string previousProgramId_;      // PP:<PreviousProgramID>
+    std::string version_;                // VN:<Version>
+
+    // custom attributes
+    std::map<std::string, std::string> custom_; // tag => value
+};
+
+inline std::string ProgramInfo::CommandLine(void) const
+{ return commandLine_; }
+
+inline ProgramInfo& ProgramInfo::CommandLine(const std::string& cmd)
+{ commandLine_ = cmd; return *this; }
+
+inline std::map<std::string, std::string> ProgramInfo::CustomTags(void) const
+{ return custom_; }
+
+inline ProgramInfo& ProgramInfo::CustomTags(const std::map<std::string, std::string>& custom)
+{ custom_ = custom; return *this; }
+
+inline std::string ProgramInfo::Description(void) const
+{ return description_; }
+
+inline ProgramInfo& ProgramInfo::Description(const std::string& description)
+{ description_ = description; return *this; }
+
+inline std::string ProgramInfo::Id(void) const
+{ return id_; }
+
+inline ProgramInfo& ProgramInfo::Id(const std::string& id)
+{ id_ = id; return *this; }
+
+inline bool ProgramInfo::IsValid(void) const
+{ return !id_.empty(); }
+
+inline std::string ProgramInfo::Name(void) const
+{ return name_; }
+
+inline ProgramInfo& ProgramInfo::Name(const std::string& name)
+{ name_ = name; return *this; }
+
+inline std::string ProgramInfo::PreviousProgramId(void) const
+{ return previousProgramId_; }
+
+inline ProgramInfo& ProgramInfo::PreviousProgramId(const std::string& id)
+{ previousProgramId_ = id; return *this; }
+
+inline std::string ProgramInfo::ToSam(const ProgramInfo& prog)
+{ return prog.ToSam(); }
+
+inline std::string ProgramInfo::Version(void) const
+{ return version_; }
+
+inline ProgramInfo& ProgramInfo::Version(const std::string& version)
+{ version_ = version; return *this; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PROGRAMINFO_H
diff --git a/include/pbbam/QualityValue.h b/include/pbbam/QualityValue.h
new file mode 100644
index 0000000..7eecc12
--- /dev/null
+++ b/include/pbbam/QualityValue.h
@@ -0,0 +1,112 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef QUALITYVALUE_H
+#define QUALITYVALUE_H
+
+#include "pbbam/Config.h"
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief The QualityValue class represents a FASTQ-compatible quality value.
+///
+/// Integers are clamped to [0, 93] (corresponding to ASCII printable chars [!-~]).
+///
+/// Use the explicitly-named static method for constructing QualityValue entries from
+/// FASTQ encoding characters. Otherwise, the value will be interpreted as the actual
+/// integer value.
+///
+class PBBAM_EXPORT QualityValue
+{
+public:
+    static const uint8_t MAX;
+
+public:
+    /// Creates a QualityValue from a FASTQ encoding character.
+    static QualityValue FromFastq(const char c);
+
+public:
+    /// \name Constructors & Related Methods
+    ///  \{
+
+    QualityValue(const uint8_t value = 0);
+    QualityValue(const QualityValue& other);
+    ~QualityValue(void);
+
+    /// \}
+
+public:
+    /// \returns the FASTQ encoding char for this QualityValue
+    char Fastq(void) const;
+
+    /// \returns the integer value of this QualityValue
+    operator uint8_t(void) const;
+
+private:
+    uint8_t value_;
+};
+
+inline QualityValue::QualityValue(const uint8_t value)
+    : value_(value)
+{
+    // clamp QV
+    if (value_ > QualityValue::MAX)
+        value_ = QualityValue::MAX;
+}
+
+inline QualityValue::QualityValue(const QualityValue& other)
+    : value_(other.value_)
+{ }
+
+inline QualityValue::~QualityValue(void) { }
+
+inline char QualityValue::Fastq(void) const
+{ return static_cast<char>(value_ + 33); }
+
+inline QualityValue::operator uint8_t(void) const
+{ return value_; }
+
+inline QualityValue QualityValue::FromFastq(const char c)
+{ return QualityValue(static_cast<uint8_t>(c-33)); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // QUALITYVALUE_H
diff --git a/include/pbbam/QualityValues.h b/include/pbbam/QualityValues.h
new file mode 100644
index 0000000..240b96f
--- /dev/null
+++ b/include/pbbam/QualityValues.h
@@ -0,0 +1,233 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef QUALITYVALUES_H
+#define QUALITYVALUES_H
+
+#include "pbbam/QualityValue.h"
+#include <algorithm>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief The QualityValues class represents a sequence of FASTQ-compatible
+/// quality values. See QualityValue documentation for details.
+///
+class PBBAM_EXPORT QualityValues : public std::vector<QualityValue>
+{
+public:
+    /// Creates a QualityValues collection from a FASTQ-encoded string.
+    static QualityValues FromFastq(const std::string& fastq);
+
+public:
+    /// \name Constructors & Related Methods
+    ///  \{
+
+    QualityValues(void);
+    explicit QualityValues(const std::string& fastqString);
+    explicit QualityValues(const std::vector<QualityValue>& quals);
+    explicit QualityValues(const std::vector<uint8_t>& quals);
+
+    QualityValues(const std::vector<uint8_t>::const_iterator first,
+                  const std::vector<uint8_t>::const_iterator last);
+    QualityValues(const QualityValues::const_iterator first,
+                  const QualityValues::const_iterator last);
+
+    QualityValues(const QualityValues& other);
+    QualityValues(QualityValues&& other);
+
+    QualityValues(std::vector<QualityValue>&& quals);
+
+    QualityValues& operator=(const QualityValues& other);
+    QualityValues& operator=(QualityValues&& other);
+
+    QualityValues& operator=(const std::vector<QualityValue>& quals);
+    QualityValues& operator=(std::vector<QualityValue>&& quals);
+
+    ~QualityValues(void);
+
+    /// \}
+
+public:
+    /// \name Comparison Operators
+    /// \{
+
+    bool operator==(const std::string& other) const;
+    bool operator!=(const std::string& other) const;
+
+    /// \}
+
+public:
+    /// \name Iterators
+    /// \{
+
+    /// \returns A const_iterator to the beginning of the sequence.
+    std::vector<QualityValue>::const_iterator cbegin(void) const;
+
+    /// \returns A const_iterator to the element past the end of the sequence.
+    std::vector<QualityValue>::const_iterator cend(void) const;
+
+    /// \returns A const_iterator to the beginning of the sequence.
+    std::vector<QualityValue>::const_iterator begin(void) const;
+
+    /// \returns A const_iterator to the element past the end of the sequence.
+    std::vector<QualityValue>::const_iterator end(void) const;
+
+    /// \returns An iterator to the beginning of the sequence.
+    std::vector<QualityValue>::iterator begin(void);
+
+    /// \returns An iterator to the element past the end of the sequence.
+    std::vector<QualityValue>::iterator end(void);
+
+    /// \}
+
+public:
+    /// \returns the FASTQ-encoded string for this collection
+    std::string Fastq(void) const;
+};
+
+inline QualityValues::QualityValues(void)
+    : std::vector<QualityValue>()
+{ }
+
+inline QualityValues::QualityValues(const std::string& fastqString)
+    : std::vector<QualityValue>()
+{
+    resize(fastqString.size());
+    std::transform(fastqString.cbegin(), fastqString.cend(),
+                   begin(), QualityValue::FromFastq);
+}
+
+inline QualityValues::QualityValues(const std::vector<QualityValue>& quals)
+    : std::vector<QualityValue>(quals)
+{ }
+
+inline QualityValues::QualityValues(const std::vector<uint8_t>& quals)
+    : std::vector<QualityValue>()
+{
+    resize(quals.size());
+    std::copy(quals.cbegin(), quals.cend(), begin());
+}
+
+inline QualityValues::QualityValues(const std::vector<uint8_t>::const_iterator first,
+                                    const std::vector<uint8_t>::const_iterator last)
+    : std::vector<QualityValue>(first, last)
+{ }
+
+inline QualityValues::QualityValues(const QualityValues::const_iterator first,
+                                    const QualityValues::const_iterator last)
+    : std::vector<QualityValue>()
+{
+    assign(first, last);
+}
+
+inline QualityValues::QualityValues(const QualityValues& other)
+    : std::vector<QualityValue>(other)
+{ }
+
+inline QualityValues::QualityValues(std::vector<QualityValue>&& quals)
+    : std::vector<QualityValue>(std::move(quals))
+{ }
+
+inline QualityValues::QualityValues(QualityValues&& other)
+    : std::vector<QualityValue>(std::move(other))
+{ }
+
+inline QualityValues& QualityValues::operator=(const QualityValues& other)
+{ std::vector<QualityValue>::operator=(other); return *this; }
+
+inline QualityValues& QualityValues::operator=(const std::vector<QualityValue>& quals)
+{ std::vector<QualityValue>::operator=(quals); return *this; }
+
+inline QualityValues& QualityValues::operator=(QualityValues&& other)
+{ std::vector<QualityValue>::operator=(std::move(other)); return *this; }
+
+inline QualityValues& QualityValues::operator=(std::vector<QualityValue>&& quals)
+{ std::vector<QualityValue>::operator=(std::move(quals)); return *this; }
+
+inline QualityValues::~QualityValues(void) { }
+
+inline std::vector<QualityValue>::const_iterator QualityValues::cbegin(void) const
+{ return std::vector<QualityValue>::cbegin(); }
+
+inline std::vector<QualityValue>::const_iterator QualityValues::cend(void) const
+{ return std::vector<QualityValue>::cend(); }
+
+inline std::vector<QualityValue>::const_iterator QualityValues::begin(void) const
+{ return std::vector<QualityValue>::begin(); }
+
+inline std::vector<QualityValue>::const_iterator QualityValues::end(void) const
+{ return std::vector<QualityValue>::end(); }
+
+inline std::vector<QualityValue>::iterator QualityValues::begin(void)
+{ return std::vector<QualityValue>::begin(); }
+
+inline std::vector<QualityValue>::iterator QualityValues::end(void)
+{ return std::vector<QualityValue>::end(); }
+
+inline QualityValues QualityValues::FromFastq(const std::string& fastq)
+{
+    return QualityValues(fastq);
+//    QualityValues result;
+//    result.resize(fastq.size());
+//    std::transform(fastq.cbegin(), fastq.cend(), result.begin(), QualityValue::FromFastq);
+//    return result;
+}
+
+inline std::string QualityValues::Fastq(void) const
+{
+    std::string result;
+    result.reserve(size());
+    auto iter = cbegin();
+    const auto end = cend();
+    for (; iter != end; ++iter)
+        result.push_back((*iter).Fastq());
+    return result;
+}
+
+inline bool QualityValues::operator==(const std::string& fastq) const
+{ return *this == QualityValues(fastq); }
+
+inline bool QualityValues::operator!=(const std::string& fastq) const
+{ return *this != QualityValues(fastq); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // QUALITYVALUES_H
diff --git a/include/pbbam/QueryBase.h b/include/pbbam/QueryBase.h
new file mode 100644
index 0000000..6106a4a
--- /dev/null
+++ b/include/pbbam/QueryBase.h
@@ -0,0 +1,241 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef QUERYBASE_H
+#define QUERYBASE_H
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/BamFile.h"
+
+namespace PacBio {
+namespace BAM {
+
+class QueryBase;
+
+class QueryIterator
+{
+public:
+    BamRecord& operator*(void);
+    BamRecord* operator->(void);
+    QueryIterator& operator++(void);
+    QueryIterator operator++(int);
+    bool operator==(const QueryIterator& other) const;
+    bool operator!=(const QueryIterator& other) const;
+
+    QueryIterator(void);
+    QueryIterator(QueryBase& parent);
+
+private:
+    QueryBase* query_;
+    BamRecord record_;
+    friend class QueryBase;
+};
+
+class QueryConstIterator
+{
+public:
+    const BamRecord& operator*(void) const;
+    const BamRecord* operator->(void) const;
+    QueryConstIterator& operator++(void);
+    QueryConstIterator operator++(int);
+    bool operator==(const QueryConstIterator& other) const;
+    bool operator!=(const QueryConstIterator& other) const;
+
+    QueryConstIterator(void);
+    QueryConstIterator(const QueryBase& parent);
+
+private:
+    QueryBase* query_;
+    BamRecord record_;
+    friend class QueryBase;
+};
+
+/// This class provides the base functionality and iterators for querying BAM files.
+class PBBAM_EXPORT QueryBase {
+
+public:
+    typedef QueryIterator      iterator;
+    typedef QueryConstIterator const_iterator;
+
+public:
+    virtual ~QueryBase(void);
+
+public:
+
+    /// \name Iterators
+    /// \{
+
+    /// \returns an iterator to the beginning of the query results.
+    QueryBase::iterator begin(void);
+
+    /// \returns a const_iterator to the beginning of the query results.
+    QueryBase::const_iterator begin(void) const;
+
+    /// \returns a const_iterator to the beginning of the query results.
+    QueryBase::const_iterator cbegin(void) const;
+
+    /// \returns an iterator marking the end of query results.
+    QueryBase::iterator end(void);
+
+    /// \returns a const_iterator marking the end of query results.
+    QueryBase::const_iterator end(void) const;
+
+    /// \returns a const_iterator marking the end of query results.
+    QueryBase::const_iterator cend(void) const;
+
+    /// \}
+
+protected:
+    QueryBase(const BamFile& file);
+
+    /// Primary method for iterating through a query. Derived classes will implement this
+    /// method to return
+    virtual bool GetNext(BamRecord& x) =0;
+
+protected:
+    const BamFile& file_;
+
+    friend class QueryIterator;
+    friend class QueryConstIterator;
+};
+
+inline QueryBase::iterator QueryBase::begin(void)
+{ return QueryBase::iterator(*this); }
+
+inline QueryBase::const_iterator QueryBase::begin(void) const
+{ return QueryBase::const_iterator(*this); }
+
+inline QueryBase::const_iterator QueryBase::cbegin(void) const
+{ return QueryBase::const_iterator(*this); }
+
+inline QueryBase::iterator QueryBase::end(void)
+{ return QueryBase::iterator(); }
+
+inline QueryBase::const_iterator QueryBase::end(void) const
+{ return QueryBase::const_iterator(); }
+
+inline QueryBase::const_iterator QueryBase::cend(void) const
+{ return QueryBase::const_iterator(); }
+
+// ---------------
+// QueryIterator
+// ---------------
+
+inline QueryIterator::QueryIterator(void)
+    : query_(0)
+{ }
+
+inline QueryIterator::QueryIterator(QueryBase& parent)
+    : query_(&parent)
+    , record_(parent.file_.Header())
+{
+    if (!(query_->GetNext(record_)))
+        query_ = 0;
+}
+
+inline BamRecord& QueryIterator::operator*(void)
+{ return record_; }
+
+inline BamRecord* QueryIterator::operator->(void)
+{ return &(operator*()); }
+
+inline QueryIterator& QueryIterator::operator++(void)
+{
+    if (!(query_->GetNext(record_)))
+        query_ = 0;
+    return *this;
+}
+
+inline QueryIterator QueryIterator::operator++(int)
+{
+    QueryIterator result(*this);
+    ++(*this);
+    return result;
+}
+
+inline bool QueryIterator::operator==(const QueryIterator& other) const
+{ return query_ == other.query_; }
+
+inline bool QueryIterator::operator!=(const QueryIterator& other) const
+{ return !(*this == other); }
+
+// --------------------
+// QueryConstIterator
+// --------------------
+
+inline const BamRecord& QueryConstIterator::operator*(void) const
+{ return record_; }
+
+inline const BamRecord* QueryConstIterator::operator->(void) const
+{ return &(operator*()); }
+
+inline QueryConstIterator& QueryConstIterator::operator++(void)
+{
+    if (!(query_->GetNext(record_)))
+        query_ = 0;
+    return *this;
+}
+
+inline QueryConstIterator QueryConstIterator::operator++(int)
+{
+    QueryConstIterator result(*this);
+    ++(*this);
+    return result;
+}
+
+inline bool QueryConstIterator::operator==(const QueryConstIterator& other) const
+{ return query_ == other.query_; }
+
+inline bool QueryConstIterator::operator!=(const QueryConstIterator& other) const
+{ return !(*this == other); }
+
+inline QueryConstIterator::QueryConstIterator(void)
+    : query_(0)
+{ }
+
+inline QueryConstIterator::QueryConstIterator(const QueryBase& parent)
+    : record_(parent.file_.Header())
+{
+    query_ = const_cast<QueryBase*>(&parent);
+    if (!(query_->GetNext(record_)))
+        query_ = 0;
+}
+
+} // namespace BAM
+} // namspace PacBio
+
+#endif // QUERYBASE_H
diff --git a/include/pbbam/ReadGroupInfo.h b/include/pbbam/ReadGroupInfo.h
new file mode 100644
index 0000000..86372ee
--- /dev/null
+++ b/include/pbbam/ReadGroupInfo.h
@@ -0,0 +1,392 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef READGROUPINFO_H
+#define READGROUPINFO_H
+
+#include "pbbam/Config.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+enum class BaseFeature
+{
+    DELETION_QV
+  , DELETION_TAG
+  , INSERTION_QV
+  , MERGE_QV
+  , SUBSTITUTION_QV
+  , SUBSTITUTION_TAG
+  , IPD
+  , PULSE_WIDTH
+  , PKMID
+  , PKMEAN
+  , LABEL
+  , LABEL_QV
+  , ALT_LABEL
+  , ALT_LABEL_QV
+  , PULSE_MERGE_QV
+  , PULSE_CALL
+  , PRE_PULSE_FRAMES
+  , PULSE_CALL_WIDTH
+};
+
+enum class FrameCodec
+{
+    RAW
+  , V1
+};
+
+class PBBAM_EXPORT ReadGroupInfo
+{
+public:
+    /// \name Conversion & Validation
+    ///
+
+    static ReadGroupInfo FromSam(const std::string& sam);
+
+    static std::string ToSam(const ReadGroupInfo& rg);
+
+    /// \}
+
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    ReadGroupInfo(void);
+    ReadGroupInfo(const std::string& id);
+    ReadGroupInfo(const std::string& movieName, const std::string& readType);
+    ReadGroupInfo(const ReadGroupInfo& other);
+    ReadGroupInfo(ReadGroupInfo&& other);
+    ReadGroupInfo& operator=(const ReadGroupInfo& other);
+    ReadGroupInfo& operator=(ReadGroupInfo&& other);
+    ~ReadGroupInfo(void);
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    const std::string& BasecallerVersion(void) const;
+
+    bool HasBaseFeature(const BaseFeature& feature) const;
+
+    std::string BaseFeatureTag(const BaseFeature& feature) const;
+
+    std::string BindingKit(void) const;
+
+    bool Control(void) const;
+
+    std::map<std::string, std::string> CustomTags(void) const;
+
+    std::string Date(void) const;
+
+    std::string FlowOrder(void) const;
+
+    std::string FrameRateHz(void) const;
+
+    std::string Id(void) const;
+
+    FrameCodec IpdCodec(void) const;
+
+    std::string KeySequence(void) const;
+
+    std::string Library(void) const;
+
+    std::string MovieName(void) const;
+
+    std::string Platform(void) const;
+
+    std::string PredictedInsertSize(void) const;
+
+    std::string Programs(void) const;
+
+    FrameCodec PulseWidthCodec(void) const;
+
+    std::string ReadType(void) const;
+
+    std::string Sample(void) const;
+
+    std::string SequencingCenter(void) const;
+
+    std::string SequencingKit(void) const;
+
+    /// \}
+
+    /// \name Conversion & Validation
+    /// \{
+
+    bool IsValid(void) const;
+
+    std::string ToSam(void) const;
+
+    /// \}
+
+    /// \name Comparison
+    /// \{
+
+    bool operator==(const ReadGroupInfo& other) const;
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    ReadGroupInfo& BasecallerVersion(const std::string& versionNumber);
+
+    ReadGroupInfo& BaseFeatureTag(const BaseFeature& feature,
+                                  const std::string& tag);
+
+    ReadGroupInfo& BindingKit(const std::string& kitNumber);
+
+    ReadGroupInfo& Control(const bool ctrl);
+
+    ReadGroupInfo& CustomTags(const std::map<std::string, std::string>& custom);
+
+    ReadGroupInfo& Date(const std::string& date);
+
+    ReadGroupInfo& FlowOrder(const std::string& order);
+
+    ReadGroupInfo& FrameRateHz(const std::string& frameRateHz);
+
+    ReadGroupInfo& Id(const std::string& id);
+
+    ReadGroupInfo& Id(const std::string& movieName, const std::string& readType);
+
+    ReadGroupInfo& IpdCodec(const FrameCodec& codec, const std::string& tag = std::string());
+
+    ReadGroupInfo& KeySequence(const std::string& sequence);
+
+    ReadGroupInfo& Library(const std::string& library);
+
+    ReadGroupInfo& MovieName(const std::string& id);
+
+    ReadGroupInfo& PredictedInsertSize(const std::string& size);
+
+    ReadGroupInfo& Programs(const std::string& programs);
+
+    ReadGroupInfo& PulseWidthCodec(const FrameCodec& codec, const std::string& tag = std::string());
+
+    ReadGroupInfo& ReadType(const std::string& type);
+
+    ReadGroupInfo& Sample(const std::string& sample);
+
+    ReadGroupInfo& SequencingCenter(const std::string& center);
+
+    ReadGroupInfo& SequencingKit(const std::string& kitNumber);
+
+    /// \}
+
+private:
+    std::string id_;                     // ID * Unique ID required for valid SAM/BAM header *
+    std::string sequencingCenter_;       // CN
+    std::string date_;                   // DT * (ISO 8601) *
+    std::string flowOrder_;              // FO
+    std::string keySequence_;            // KS
+    std::string library_;                // LB
+    std::string programs_;               // PG
+    std::string predictedInsertSize_;    // PI
+    std::string movieName_;              // PU * more explicit, in place of "platform unit" *
+    std::string sample_;                 // SM
+
+    // DS:<Description> components
+    std::string readType_;
+    std::string bindingKit_;
+    std::string sequencingKit_;
+    std::string basecallerVersion_;
+    std::string frameRateHz_;
+    bool        control_ = false;
+    FrameCodec  ipdCodec_;
+    FrameCodec  pulseWidthCodec_;
+    std::map<BaseFeature, std::string> features_;
+
+    // custom attributes
+    std::map<std::string, std::string> custom_; // tag => value
+
+private:
+    std::string EncodeSamDescription(void) const;
+    void DecodeSamDescription(const std::string& description);
+};
+
+PBBAM_EXPORT
+std::string MakeReadGroupId(const std::string& movieName,
+                            const std::string& readType);
+
+inline const std::string& ReadGroupInfo::BasecallerVersion(void) const
+{ return basecallerVersion_; }
+
+inline ReadGroupInfo& ReadGroupInfo::BasecallerVersion(const std::string& versionNumber)
+{ basecallerVersion_ = versionNumber; return *this; }
+
+inline std::string ReadGroupInfo::BaseFeatureTag(const BaseFeature& feature) const
+{
+    const auto iter = features_.find(feature);
+    if (iter == features_.end())
+        return std::string();
+    return iter->second;
+}
+
+inline ReadGroupInfo& ReadGroupInfo::BaseFeatureTag(const BaseFeature& feature,
+                                                    const std::string& tag)
+{ features_[feature] = tag; return *this; }
+
+inline std::string ReadGroupInfo::BindingKit(void) const
+{ return bindingKit_; }
+
+inline ReadGroupInfo& ReadGroupInfo::BindingKit(const std::string& kitNumber)
+{ bindingKit_ = kitNumber; return *this; }
+
+inline bool ReadGroupInfo::Control(void) const
+{ return control_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Control(const bool ctrl)
+{ control_ = ctrl; return *this; }
+
+inline std::map<std::string, std::string> ReadGroupInfo::CustomTags(void) const
+{ return custom_; }
+
+inline ReadGroupInfo& ReadGroupInfo::CustomTags(const std::map<std::string, std::string>& custom)
+{ custom_ = custom; return *this; }
+
+inline std::string ReadGroupInfo::Date(void) const
+{ return date_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Date(const std::string& date)
+{ date_ = date; return *this; }
+
+inline std::string ReadGroupInfo::FlowOrder(void) const
+{ return flowOrder_; }
+
+inline ReadGroupInfo& ReadGroupInfo::FlowOrder(const std::string& order)
+{ flowOrder_ = order; return *this; }
+
+inline std::string ReadGroupInfo::FrameRateHz(void) const
+{ return frameRateHz_; }
+
+inline ReadGroupInfo& ReadGroupInfo::FrameRateHz(const std::string& frameRateHz)
+{ frameRateHz_ = frameRateHz; return *this; }
+
+inline bool ReadGroupInfo::HasBaseFeature(const BaseFeature& feature) const
+{ return features_.find(feature) != features_.end(); }
+
+inline std::string ReadGroupInfo::Id(void) const
+{ return id_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Id(const std::string& id)
+{ id_ = id; return *this; }
+
+inline ReadGroupInfo& ReadGroupInfo::Id(const std::string& movieName,
+                                        const std::string& readType)
+{ id_ = MakeReadGroupId(movieName, readType); return *this; }
+
+inline FrameCodec ReadGroupInfo::IpdCodec(void) const
+{ return ipdCodec_; }
+
+inline bool ReadGroupInfo::IsValid(void) const
+{ return !id_.empty(); }
+
+inline std::string ReadGroupInfo::KeySequence(void) const
+{ return keySequence_; }
+
+inline ReadGroupInfo& ReadGroupInfo::KeySequence(const std::string& sequence)
+{ keySequence_ = sequence; return *this; }
+
+inline std::string ReadGroupInfo::Library(void) const
+{ return library_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Library(const std::string& library)
+{ library_ = library; return *this; }
+
+inline std::string ReadGroupInfo::MovieName(void) const
+{ return movieName_; }
+
+inline ReadGroupInfo& ReadGroupInfo::MovieName(const std::string& movieName)
+{ movieName_ = movieName; return *this; }
+
+inline std::string ReadGroupInfo::Platform(void) const
+{ return std::string("PACBIO"); }
+
+inline std::string ReadGroupInfo::PredictedInsertSize(void) const
+{ return predictedInsertSize_; }
+
+inline ReadGroupInfo& ReadGroupInfo::PredictedInsertSize(const std::string& size)
+{ predictedInsertSize_ = size; return *this; }
+
+inline std::string ReadGroupInfo::Programs(void) const
+{ return programs_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Programs(const std::string& programs)
+{ programs_ = programs; return *this; }
+
+inline FrameCodec ReadGroupInfo::PulseWidthCodec(void) const
+{ return pulseWidthCodec_; }
+
+inline std::string ReadGroupInfo::ReadType(void) const
+{ return readType_; }
+
+inline ReadGroupInfo& ReadGroupInfo::ReadType(const std::string& type)
+{ readType_ = type; return *this; }
+
+inline std::string ReadGroupInfo::Sample(void) const
+{ return sample_; }
+
+inline ReadGroupInfo& ReadGroupInfo::Sample(const std::string& sample)
+{ sample_ = sample; return *this; }
+
+inline std::string ReadGroupInfo::SequencingCenter(void) const
+{ return sequencingCenter_; }
+
+inline ReadGroupInfo& ReadGroupInfo::SequencingCenter(const std::string& center)
+{ sequencingCenter_ = center; return *this; }
+
+inline std::string ReadGroupInfo::SequencingKit(void) const
+{ return sequencingKit_; }
+
+inline ReadGroupInfo& ReadGroupInfo::SequencingKit(const std::string& kitNumber)
+{ sequencingKit_ = kitNumber; return *this; }
+
+inline std::string ReadGroupInfo::ToSam(const ReadGroupInfo& rg)
+{ return rg.ToSam(); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // READGROUPINFO_H
diff --git a/include/pbbam/SamTagCodec.h b/include/pbbam/SamTagCodec.h
new file mode 100644
index 0000000..b0b6796
--- /dev/null
+++ b/include/pbbam/SamTagCodec.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2014, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef SAMTAGCODEC_H
+#define SAMTAGCODEC_H
+
+#include "pbbam/Config.h"
+#include "pbbam/TagCollection.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT SamTagCodec
+{
+public:
+    static TagCollection Decode(const std::string& tagString);
+    static std::string Encode(const PacBio::BAM::TagCollection& tags);
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // SAMTAGCODEC_H
diff --git a/include/pbbam/SequenceInfo.h b/include/pbbam/SequenceInfo.h
new file mode 100644
index 0000000..0cf9d04
--- /dev/null
+++ b/include/pbbam/SequenceInfo.h
@@ -0,0 +1,182 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef SEQUENCEINFO_H
+#define SEQUENCEINFO_H
+
+#include "pbbam/Config.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT SequenceInfo
+{
+public:
+    /// \name Conversion & Validation
+    ///
+
+    static SequenceInfo FromSam(const std::string& sam);
+
+    static std::string ToSam(const SequenceInfo& seq);
+
+    /// \}
+
+public:
+    /// \name Constructors & Related Methods
+    /// \{
+
+    SequenceInfo(void);
+    SequenceInfo(const std::string& name, const std::string& length = "0");
+    SequenceInfo(const SequenceInfo& other);
+    SequenceInfo(SequenceInfo&& other);
+    SequenceInfo& operator=(const SequenceInfo& other);
+    SequenceInfo& operator=(SequenceInfo&& other);
+    ~SequenceInfo(void);
+
+    /// \}
+
+public:
+    /// \name Attributes
+    /// \{
+
+    std::string AssemblyId(void) const;
+
+    std::string Checksum(void) const;
+
+    std::map<std::string, std::string> CustomTags(void) const;
+
+    std::string Length(void) const;
+
+    std::string Name(void) const;
+
+    std::string Species(void) const;
+
+    std::string Uri(void) const;
+
+    /// \}
+
+    /// \name Conversion & Validation
+    ///
+
+    bool IsValid(void) const;
+
+    std::string ToSam(void) const;
+
+    /// \}
+
+public:
+    /// \name Attributes
+
+    SequenceInfo& AssemblyId(const std::string& id);
+
+    SequenceInfo& Checksum(const std::string& checksum);
+
+    SequenceInfo& CustomTags(const std::map<std::string, std::string>& custom);
+
+    SequenceInfo& Length(const std::string& length);
+
+    SequenceInfo& Name(const std::string& name);
+
+    SequenceInfo& Species(const std::string& species);
+
+    SequenceInfo& Uri(const std::string& uri);
+
+    /// \}
+
+private:
+    std::string name_;                   // SN:<Name>            * Unique Name required for valid SAM header*
+    std::string length_;                 // LN:<Length>          * [0 - 2^31-1]
+    std::string assemblyId_;             // AS:<AssemblyId>
+    std::string checksum_;               // M5:<Checksum>
+    std::string species_;                // SP:<Species>
+    std::string uri_;                    // UR:<URI>
+
+    // custom attributes
+    std::map<std::string, std::string> custom_; // tag => value
+};
+
+inline std::string SequenceInfo::AssemblyId(void) const
+{ return assemblyId_; }
+
+inline SequenceInfo& SequenceInfo::AssemblyId(const std::string& id)
+{ assemblyId_ = id; return *this; }
+
+inline std::string SequenceInfo::Checksum(void) const
+{ return checksum_; }
+
+inline SequenceInfo& SequenceInfo::Checksum(const std::string& checksum)
+{ checksum_ = checksum; return *this; }
+
+inline std::map<std::string, std::string> SequenceInfo::CustomTags(void) const
+{ return custom_; }
+
+inline SequenceInfo& SequenceInfo::CustomTags(const std::map<std::string, std::string>& custom)
+{ custom_ = custom; return *this; }
+
+inline std::string SequenceInfo::Length(void) const
+{ return length_; }
+
+inline SequenceInfo& SequenceInfo::Length(const std::string& length)
+{ length_ = length; return *this; }
+
+inline std::string SequenceInfo::Name(void) const
+{ return name_; }
+
+inline SequenceInfo& SequenceInfo::Name(const std::string& name)
+{ name_ = name; return *this; }
+
+inline std::string SequenceInfo::Species(void) const
+{ return species_; }
+
+inline SequenceInfo& SequenceInfo::Species(const std::string& species)
+{ species_ = species; return *this; }
+
+inline std::string SequenceInfo::ToSam(const SequenceInfo& seq)
+{ return seq.ToSam(); }
+
+inline std::string SequenceInfo::Uri(void) const
+{ return uri_; }
+
+inline SequenceInfo& SequenceInfo::Uri(const std::string& uri)
+{ uri_ = uri; return *this; }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // SEQUENCEINFO_H
diff --git a/include/pbbam/Strand.h b/include/pbbam/Strand.h
new file mode 100644
index 0000000..aa8535f
--- /dev/null
+++ b/include/pbbam/Strand.h
@@ -0,0 +1,55 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef STRAND_H
+#define STRAND_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+
+enum class Strand
+{
+    FORWARD
+  , REVERSE
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // STRAND_H
diff --git a/include/pbbam/Tag.h b/include/pbbam/Tag.h
new file mode 100644
index 0000000..c7f3d94
--- /dev/null
+++ b/include/pbbam/Tag.h
@@ -0,0 +1,362 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef TAG_H
+#define TAG_H
+
+#include "pbbam/Config.h"
+#include <boost/variant.hpp>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+
+/// \brief Provides information on the exact (C++) data type held by a Tag.
+enum class TagDataType
+{
+    INVALID      = 0     ///< boost::blank
+  , INT8                 ///< int8_t
+  , UINT8                ///< uint8_t
+  , INT16                ///< int16_t
+  , UINT16               ///< uint16_t
+  , INT32        = 5     ///< int32_t
+  , UINT32               ///< uint32_t
+  , FLOAT                ///< float
+  , STRING               ///< std::string
+  , INT8_ARRAY           ///< std::vector<int8_t>
+  , UINT8_ARRAY  = 10    ///< std::vector<uint8_t>
+  , INT16_ARRAY          ///< std::vector<int16_t>
+  , UINT16_ARRAY         ///< std::vector<uint16_t>
+  , INT32_ARRAY          ///< std::vector<int32_t>
+  , UINT32_ARRAY         ///< std::vector<uint32_t>
+  , FLOAT_ARRAY  = 15    ///< std::vector<float>
+};
+
+/// \brief Provides additional instructions on interpreting the tag's value.
+///
+/// Some C++ data types (e.g. std::string) may represent more than one BAM tag type
+/// ('H' vs 'Z'). These modifiers indicate how to properly interpret those shared
+/// data types.
+enum class TagModifier
+{
+    /// \brief This indicates the tag has no modifiers set.
+    NONE = 0,
+
+    /// \brief This modifier marks an integer as ASCII.
+    ///
+    /// SAM/BAM has the concept of an ASCII character that is distinct from an 8-bit
+    /// integer. However, there is no such pure separation in C++
+    /// (int8_t/uint8_t are likely implemented as typedefs around char/unsigned char).
+    /// Thus this modifier can be used to indicate a tag's integer data should be
+    /// interpreted as a printable, ASCII character.
+    ASCII_CHAR,
+
+    /// \brief This modifier marks std::string data as "hex string", rather than a regular string.
+    ///
+    /// SAM/BAM has a distinction between regular strings and "Hex format" strings.
+    /// However, they are both manipulated in C++ via std::string. Thus this modifier
+    /// can be used to indicate that a tag's string data should be interpreted as
+    /// "Hex format" rather than a regular, literal string.
+    HEX_STRING
+};
+
+// Inspired by (but greatly simplified & modified from) the boost::variant
+// wrapper approach taken by DynamicCpp (https://code.google.com/p/dynamic-cpp)
+class PBBAM_EXPORT Tag
+{
+public:
+
+    /// \name Constructors & Related Methods
+    /// \{
+
+    /// Constructs a null tag.
+    /// \sa IsNull()
+    Tag(void);
+
+    Tag(int8_t value);
+    Tag(uint8_t value);
+    Tag(int16_t value);
+    Tag(uint16_t value);
+    Tag(int32_t value);
+    Tag(uint32_t value);
+    Tag(float value);
+    Tag(const std::string& value);
+    Tag(const std::vector<int8_t>& value);
+    Tag(const std::vector<uint8_t>& value);
+    Tag(const std::vector<int16_t>& value);
+    Tag(const std::vector<uint16_t>& value);
+    Tag(const std::vector<int32_t>& value);
+    Tag(const std::vector<uint32_t>& value);
+    Tag(const std::vector<float>& value);
+    
+    Tag(const Tag& other);
+    Tag(Tag&& other);
+
+    ~Tag(void);
+
+    Tag& operator=(boost::blank value);
+    Tag& operator=(int8_t value);
+    Tag& operator=(uint8_t value);
+    Tag& operator=(int16_t value);
+    Tag& operator=(uint16_t value);
+    Tag& operator=(int32_t value);
+    Tag& operator=(uint32_t value);
+    Tag& operator=(float value);
+    Tag& operator=(const std::string& value);
+    Tag& operator=(const std::vector<int8_t>& value);
+    Tag& operator=(const std::vector<uint8_t>& value);
+    Tag& operator=(const std::vector<int16_t>& value);
+    Tag& operator=(const std::vector<uint16_t>& value);
+    Tag& operator=(const std::vector<int32_t>& value);
+    Tag& operator=(const std::vector<uint32_t>& value);
+    Tag& operator=(const std::vector<float>& value);
+    Tag& operator=(const Tag& other);
+    Tag& operator=(Tag&& other);
+
+    bool operator== (const Tag& other) const;
+    bool operator!= (const Tag& other) const;
+
+    /// \}
+
+public:
+    /// \name Data Conversion & Validation
+    /// \{
+
+    /// Converts the tag value to an ASCII character
+    ///
+    /// Tag must hold an integer type, within the valid ASCII range [33-127].
+    ///
+    /// \returns ASCII character if valid
+    /// \throws if not ASCII-compatible
+    char ToAscii(void) const;
+
+    /// \returns tag data as signed 8-bit (casting if needed)
+    /// \throws if not integral data, or out of valid range
+    int8_t ToInt8(void) const;
+
+    /// \returns tag data as unsigned 8-bit (casting if needed)
+    /// \throws if not integral data, or out of valid range
+    uint8_t ToUInt8(void) const;
+
+    /// \returns tag data as signed 16-bit (casting if needed)
+    /// \throws if not integral data, or out of valid range
+    int16_t ToInt16(void) const;
+
+    /// \returns tag data as unsigned 16-bit (casting if needed)
+    /// \throws if not integral data, or out of valid range
+    uint16_t ToUInt16(void) const;
+
+    /// \returns tag data as signed 32-bit (casting if needed)
+    /// \throws if not integral data, or out of valid range
+    int32_t ToInt32(void) const;
+
+    /// \returns tag data as unsigned 32-bit (casting if needed)
+    /// \throws if not integral data, or out of valid range
+    uint32_t ToUInt32(void) const;
+
+    /// \returns tag data as float
+    /// \throws if tag does not contain a value of explicit type: float
+    float ToFloat(void) const;
+
+    /// \returns tag data as std::string
+    /// \throws if tag does not contain a value of explicit type: std::string
+    std::string ToString(void) const;
+
+    /// \returns tag data as std::vector<int8_t>
+    /// \throws if tag does not contain a value of explicit type: std::vector<int8_t>
+    std::vector<int8_t> ToInt8Array(void) const;
+
+    /// \returns tag data as std::vector<uint8_t>
+    /// \throws if tag does not contain a value of explicit type: std::vector<uint8_t>
+    std::vector<uint8_t> ToUInt8Array(void) const;
+
+    /// \returns tag data as std::vector<int16_t>
+    /// \throws if tag does not contain a value of explicit type: std::vector<int16_t>
+    std::vector<int16_t> ToInt16Array(void) const;
+
+    /// \returns tag data as std::vector<uint16_t>
+    /// \throws if tag does not contain a value of explicit type: std::vector<uint16_t>
+    std::vector<uint16_t> ToUInt16Array(void) const;
+
+    /// \returns tag data as std::vector<int32_t>
+    /// \throws if tag does not contain a value of explicit type: std::vector<int32_t>
+    std::vector<int32_t> ToInt32Array(void) const;
+
+    /// \returns tag data as std::vector<uint32_t>
+    /// \throws if tag does not contain a value of explicit type: std::vector<uint32_t>
+    std::vector<uint32_t> ToUInt32Array(void) const;
+
+    /// \returns tag data as std::vector<float>
+    /// \throws if tag does not contain a value of explicit type: std::vector<float>
+    std::vector<float> ToFloatArray(void) const;
+
+    /// \}
+
+public:
+
+    /// \name Data Conversion & Validation
+    ///
+
+    /// \returns true if tag is null (e.g. default-constructed)
+    bool IsNull(void) const;
+
+    /// \returns true if tag contains a value of type: int8_t
+    bool IsInt8(void) const;
+
+    /// \returns true if tag contains a value of type: uint8_t
+    bool IsUInt8(void) const;
+
+    /// \returns true if tag contains a value of type: int16_t
+    bool IsInt16(void) const;
+
+    /// \returns true if tag contains a value of type: uint16_t
+    bool IsUInt16(void) const;
+
+    /// \returns true if tag contains a value of type: int32_t
+    bool IsInt32(void) const;
+
+    /// \returns true if tag contains a value of type: uint32_t
+    bool IsUInt32(void) const;
+
+    /// \returns true if tag contains a value of type: float
+    bool IsFloat(void) const;
+
+    /// \returns true if tag contains a value of type: std::string
+    bool IsString(void) const;
+
+    /// \returns true if tag contains a value of type: std::string \b AND has a TagModifier of HEX_STRING
+    bool IsHexString(void) const;
+
+    /// \returns true if tag contains a value of type: std::vector<int8_t>
+    bool IsInt8Array(void) const;
+
+    /// \returns true if tag contains a value of type: std::vector<uint8_t>
+    bool IsUInt8Array(void) const;
+
+    /// \returns true if tag contains a value of type: std::vector<int16_t>
+    bool IsInt16Array(void) const;
+
+    /// \returns true if tag contains a value of type: std::vector<uint16_t>
+    bool IsUInt16Array(void) const;
+
+    /// \returns true if tag contains a value of type: std::vector<int32_t>
+    bool IsInt32Array(void) const;
+
+    /// \returns true if tag contains a value of type: std::vector<uint32_t>
+    bool IsUInt32Array(void) const;
+
+    /// \returns true if tag contains a value of type: std::vector<float>
+    bool IsFloatArray(void) const;
+
+    /// \returns true if tag contains a value with any signed integer type
+    bool IsSignedInt(void) const;
+
+    /// \returns true if tag contains a value with any unsigned integer type
+    bool IsUnsignedInt(void) const;
+
+    /// \returns true if tag contains a value with any integer type
+    bool IsIntegral(void) const;
+
+    /// \returns true if tag contains a value with any integer or float type
+    bool IsNumeric(void) const;
+
+    /// \returns true if tag contains a vector containing signed integers
+    bool IsSignedArray(void) const;
+
+    /// \returns true if tag contains a vector containing unsigned integers
+    bool IsUnsignedArray(void) const;
+
+    /// \returns true if tag contains a vector containing integers
+    bool IsIntegralArray(void) const;
+
+    /// \returns true if tag contains a vector (integers or floats)
+    bool IsArray(void) const;
+
+    /// \}
+
+public:
+    /// \name Type & Modifier Attributes
+    /// \{
+
+    /// \returns enum value for current tag data
+    TagDataType Type(void) const;
+
+    /// \returns printable type name for current tag data
+    std::string Typename(void) const;
+
+    /// \returns true if tag data modifier \p m is set
+    bool HasModifier(const TagModifier m) const;
+
+    /// \returns current tag data modifier
+    TagModifier Modifier(void) const;
+
+    /// Sets tag data modifier
+    /// \returns reference to this tag
+    Tag& Modifier(const TagModifier m);
+
+    /// \}
+
+private :
+    // NOTE - keep this synced with TagDataType enum ordering
+    typedef boost::variant<boost::blank, // <-- default constructor creates variant of this type
+                           int8_t,
+                           uint8_t,
+                           int16_t,
+                           uint16_t,
+                           int32_t,
+                           uint32_t,
+                           float,
+                           std::string,
+                           std::vector<int8_t>,
+                           std::vector<uint8_t>,
+                           std::vector<int16_t>,
+                           std::vector<uint16_t>,
+                           std::vector<int32_t>,
+                           std::vector<uint32_t>,
+                           std::vector<float> > var_t;
+
+    var_t data_;
+    TagModifier modifier_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#include "internal/Tag.inl"
+
+#endif // TAG_H
diff --git a/include/pbbam/TagCollection.h b/include/pbbam/TagCollection.h
new file mode 100644
index 0000000..42b4018
--- /dev/null
+++ b/include/pbbam/TagCollection.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef TAGCOLLECTION_H
+#define TAGCOLLECTION_H
+
+#include "pbbam/Config.h"
+#include "pbbam/Tag.h"
+#include <map>
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class PBBAM_EXPORT TagCollection : public std::map<std::string, Tag>
+{
+public:
+    bool Contains(const std::string& name) const;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // TAGCOLLECTION_H
diff --git a/include/pbbam/UnmappedReadsQuery.h b/include/pbbam/UnmappedReadsQuery.h
new file mode 100644
index 0000000..1623dc9
--- /dev/null
+++ b/include/pbbam/UnmappedReadsQuery.h
@@ -0,0 +1,70 @@
+// Copyright (c) 2014, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef UNMAPPEDREADSQUERY_H
+#define UNMAPPEDREADSQUERY_H
+
+// TODO: Not yet implemented.
+//       Can't get bam_itr_queryi(idx, HTS_IDX_NOCOOR, -1, -1) to work reliably at the moment.
+
+//#include "pbbam/QueryBase.h"
+//#include <string>
+
+//namespace PacBio {
+//namespace BAM {
+
+//class BamFile;
+
+//class PBBAM_EXPORT UnmappedReadsQuery : public QueryBase
+//{
+//public:
+//    UnmappedReadsQuery(const BamFile& file);
+
+//protected:
+//    bool GetNext(BamRecord& record);
+
+//private:
+//    std::shared_ptr<samFile>   file_;
+//    std::shared_ptr<bam_hdr_t> header_;
+//    std::shared_ptr<hts_idx_t> index_;
+//    std::shared_ptr<hts_itr_t> iterator_;
+//};
+
+//} // namespace BAM
+//} // namspace PacBio
+
+#endif // UNMAPPEDREADSQUERY_H
diff --git a/include/pbbam/ZmwGroupQuery.h b/include/pbbam/ZmwGroupQuery.h
new file mode 100644
index 0000000..8b88113
--- /dev/null
+++ b/include/pbbam/ZmwGroupQuery.h
@@ -0,0 +1,67 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef ZMWGROUPQUERY_H
+#define ZMWGROUPQUERY_H
+
+#include "pbbam/Config.h"
+#include "pbbam/internal/QueryBase.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+//namespace staging {
+
+class PBBAM_EXPORT ZmwGroupQuery : public internal::IGroupQuery
+{
+public:
+    ZmwGroupQuery(const DataSet& dataset);
+    ZmwGroupQuery(const std::vector<int32_t>& zmwWhitelist,
+                  const DataSet& dataset);
+
+protected:
+    FileIterPtr CreateIterator(const BamFile& file);
+
+private:
+    std::vector<int> whitelist_;
+};
+
+//} // namespace staging
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ZMWGROUPQUERY_H
diff --git a/include/pbbam/ZmwQuery.h b/include/pbbam/ZmwQuery.h
new file mode 100644
index 0000000..fdd1d1d
--- /dev/null
+++ b/include/pbbam/ZmwQuery.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef ZMWQUERY_H
+#define ZMWQUERY_H
+
+#include "pbbam/Config.h"
+#include "pbbam/internal/QueryBase.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+//namespace staging {
+
+class PBBAM_EXPORT ZmwQuery : public internal::IQuery
+{
+public:
+    ZmwQuery(const std::vector<int32_t>& zmwWhitelist,
+             const DataSet& dataset);
+
+protected:
+    FileIterPtr CreateIterator(const BamFile& bamFile);
+
+private:
+    std::vector<int> whitelist_;
+};
+
+//} // namespace staging
+} // namespace BAM
+} // namespace PacBio
+
+#endif // ZMWQUERY_H
diff --git a/include/pbbam/internal/BamRecordSort.h b/include/pbbam/internal/BamRecordSort.h
new file mode 100644
index 0000000..53dab05
--- /dev/null
+++ b/include/pbbam/internal/BamRecordSort.h
@@ -0,0 +1,138 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef BAMRECORDSORT_H
+#define BAMRECORDSORT_H
+
+#include "pbbam/BamRecord.h"
+#include <functional>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+enum class SortOrder {
+    Ascending = 0
+  , Descending
+};
+
+template<typename ElemType>
+inline bool sort_helper(const SortOrder& order,
+                        const ElemType& lhs,
+                        const ElemType& rhs)
+{
+    switch ( order ) {
+        case SortOrder::Ascending   : { std::less<ElemType> comp;    return comp(lhs, rhs); }
+        case SortOrder::Descending  : { std::greater<ElemType> comp; return comp(lhs, rhs); }
+        default :
+            assert(false);
+    }
+    return false; // <-- unreachable
+}
+
+typedef std::binary_function<BamRecord, BamRecord, bool> BamRecordSortBase;
+
+struct Unsorted : public BamRecordSortBase
+{
+public:
+    Unsorted(const SortOrder& order = SortOrder::Ascending)
+    { (void)order; }
+
+    bool operator()(const BamRecord& lhs, const BamRecord& rhs)
+    { (void)lhs; (void)rhs; return false; }
+};
+
+struct ByQName : public BamRecordSortBase
+{
+public:
+    ByQName(const SortOrder& order = SortOrder::Ascending)
+        : m_order(order)
+    { }
+
+    bool operator()(const BamRecord& lhs, const BamRecord& rhs)
+    { return sort_helper(m_order, lhs.FullName(), rhs.FullName()); }
+
+private:
+    const SortOrder m_order;
+};
+
+struct ByPosition : public BamRecordSortBase
+{
+public:
+    ByPosition(const SortOrder& order = SortOrder::Ascending)
+        : m_order(order)
+    { }
+
+    // comparison function
+    bool operator()(const BamRecord& lhs, const BamRecord& rhs) {
+
+        const int32_t lhsId = lhs.ReferenceId();
+        const int32_t rhsId = rhs.ReferenceId();
+
+        // force unmapped aligmnents to end
+        if ( lhsId == -1 ) return false;
+        if ( rhsId == -1 ) return true;
+
+        // if on same reference, sort on position
+        if ( lhsId == rhsId )
+            return sort_helper(m_order, lhs.ReferenceStart(), rhs.ReferenceStart());
+
+        // otherwise sort on reference ID
+        return sort_helper(m_order, lhsId, rhsId);
+    }
+
+private:
+    const SortOrder m_order;
+};
+
+struct ByZmw : public BamRecordSortBase {
+public:
+    ByZmw(const SortOrder& order = SortOrder::Ascending) : m_order(order) { }
+
+    bool operator()(const BamRecord& lhs, const BamRecord& rhs)
+    { return sort_helper(m_order, lhs.HoleNumber(), rhs.HoleNumber()); }
+
+private:
+    const SortOrder m_order;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // BAMRECORDSORT_H
diff --git a/include/pbbam/internal/DataSet.inl b/include/pbbam/internal/DataSet.inl
new file mode 100644
index 0000000..34f4af3
--- /dev/null
+++ b/include/pbbam/internal/DataSet.inl
@@ -0,0 +1,197 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSet.h"
+
+namespace PacBio {
+namespace BAM {
+
+inline const std::string& DataSet::Attribute(const std::string& name) const
+{ return d_->Attribute(name); }
+
+inline std::string& DataSet::Attribute(const std::string& name)
+{ return d_->Attribute(name); }
+
+inline DataSet& DataSet::Attribute(const std::string& name, const std::string& value)
+{ d_->Attribute(name, value); return *this; }
+
+inline const std::string& DataSet::CreatedAt(void) const
+{ return d_->CreatedAt(); }
+
+inline std::string& DataSet::CreatedAt(void)
+{ return d_->CreatedAt(); }
+
+inline DataSet& DataSet::CreatedAt(const std::string& createdAt)
+{ d_->CreatedAt(createdAt); return *this; }
+
+inline const PacBio::BAM::Extensions& DataSet::Extensions(void) const
+{ return d_->Extensions(); }
+
+inline PacBio::BAM::Extensions& DataSet::Extensions(void)
+{ return d_->Extensions(); }
+
+inline DataSet& DataSet::Extensions(const PacBio::BAM::Extensions& extensions)
+{ d_->Extensions(extensions); return *this; }
+
+inline const PacBio::BAM::ExternalResources& DataSet::ExternalResources(void) const
+{ return d_->ExternalResources(); }
+
+inline PacBio::BAM::ExternalResources& DataSet::ExternalResources(void)
+{ return d_->ExternalResources(); }
+
+inline DataSet& DataSet::ExternalResources(const PacBio::BAM::ExternalResources& resources)
+{ d_->ExternalResources(resources); return *this; }
+
+inline const PacBio::BAM::Filters& DataSet::Filters(void) const
+{ return d_->Filters(); }
+
+inline PacBio::BAM::Filters& DataSet::Filters(void)
+{ return d_->Filters(); }
+
+inline DataSet& DataSet::Filters(const PacBio::BAM::Filters& filters)
+{ d_->Filters(filters); return *this; }
+
+inline const std::string& DataSet::Format(void) const
+{ return d_->Format(); }
+
+inline std::string& DataSet::Format(void)
+{ return d_->Format(); }
+
+inline DataSet& DataSet::Format(const std::string& format)
+{ d_->Format(format); return *this; }
+
+inline const PacBio::BAM::DataSetMetadata& DataSet::Metadata(void) const
+{ return d_->Metadata(); }
+
+inline PacBio::BAM::DataSetMetadata& DataSet::Metadata(void)
+{ return d_->Metadata(); }
+
+inline DataSet& DataSet::Metadata(const PacBio::BAM::DataSetMetadata& metadata)
+{ d_->Metadata(metadata); return *this; }
+
+inline const std::string& DataSet::MetaType(void) const
+{ return d_->MetaType(); }
+
+inline std::string& DataSet::MetaType(void)
+{ return d_->MetaType(); }
+
+inline DataSet& DataSet::MetaType(const std::string& metatype)
+{ d_->MetaType(metatype); return *this; }
+
+inline const std::string& DataSet::ModifiedAt(void) const
+{ return d_->ModifiedAt(); }
+
+inline std::string& DataSet::ModifiedAt(void)
+{ return d_->ModifiedAt(); }
+
+inline DataSet& DataSet::ModifiedAt(const std::string& modifiedAt)
+{ d_->ModifiedAt(modifiedAt); return *this; }
+
+inline const std::string& DataSet::Name(void) const
+{ return d_->Name(); }
+
+inline std::string& DataSet::Name(void)
+{ return d_->Name(); }
+
+inline DataSet& DataSet::Name(const std::string& name)
+{ d_->Name(name); return *this; }
+
+inline const std::string& DataSet::ResourceId(void) const
+{ return d_->ResourceId(); }
+
+inline std::string& DataSet::ResourceId(void)
+{ return d_->ResourceId(); }
+
+inline DataSet& DataSet::ResourceId(const std::string& resourceId)
+{ d_->ResourceId(resourceId); return *this; }
+
+inline const PacBio::BAM::SubDataSets& DataSet::SubDataSets(void) const
+{ return d_->SubDataSets(); }
+
+inline PacBio::BAM::SubDataSets& DataSet::SubDataSets(void)
+{ return d_->SubDataSets(); }
+
+inline DataSet& DataSet::SubDataSets(const PacBio::BAM::SubDataSets& subdatasets)
+{ d_->SubDataSets(subdatasets); return *this; }
+
+inline const std::string& DataSet::Tags(void) const
+{ return d_->Tags(); }
+
+inline std::string& DataSet::Tags(void)
+{ return d_->Tags(); }
+
+inline DataSet& DataSet::Tags(const std::string& tags)
+{ d_->Tags(tags); return *this; }
+
+inline const std::string& DataSet::TimeStampedName(void) const
+{ return d_->TimeStampedName(); }
+
+inline std::string& DataSet::TimeStampedName(void)
+{ return d_->TimeStampedName(); }
+
+inline DataSet& DataSet::TimeStampedName(const std::string& timeStampedName)
+{ d_->TimeStampedName(timeStampedName); return *this; }
+
+inline PacBio::BAM::DataSet::TypeEnum DataSet::Type(void) const
+{ return DataSet::NameToType(TypeName()); }
+
+inline DataSet& DataSet::Type(const DataSet::TypeEnum type)
+{ d_->Label(DataSet::TypeToName(type)); return *this; }
+
+inline std::string DataSet::TypeName(void) const
+{ return d_->LocalNameLabel().to_string(); }
+
+inline const std::string& DataSet::UniqueId(void) const
+{ return d_->UniqueId(); }
+
+inline std::string& DataSet::UniqueId(void)
+{ return d_->UniqueId(); }
+
+inline DataSet& DataSet::UniqueId(const std::string& uuid)
+{ d_->UniqueId(uuid); return *this; }
+
+inline const std::string& DataSet::Version(void) const
+{ return d_->Version(); }
+
+inline std::string& DataSet::Version(void)
+{ return d_->Version(); }
+
+inline DataSet& DataSet::Version(const std::string& version)
+{ d_->Version(version); return *this; }
+
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/DataSetBaseTypes.h b/include/pbbam/internal/DataSetBaseTypes.h
new file mode 100644
index 0000000..98fae1f
--- /dev/null
+++ b/include/pbbam/internal/DataSetBaseTypes.h
@@ -0,0 +1,174 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef DATASETBASETYPES_H
+#define DATASETBASETYPES_H
+
+#include "pbbam/Config.h"
+#include "pbbam/internal/DataSetElement.h"
+#include "pbbam/internal/DataSetListElement.h"
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+
+class DataSetMetadata;
+class Extensions;
+class ExternalResources;
+class FileIndices;
+class Filters;
+class Properties;
+class Provenance;
+
+namespace internal {
+
+class BaseEntityType : public DataSetElement
+{
+protected:
+    BaseEntityType(const std::string& label,
+                   const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+
+public:
+    const std::string& CreatedAt(void) const;
+    const std::string& Description(void) const;
+    const PacBio::BAM::Extensions& Extensions(void) const;
+    const std::string& Format(void) const;
+    const std::string& ModifiedAt(void) const;
+    const std::string& Name(void) const;
+    const std::string& ResourceId(void) const;
+    const std::string& Tags(void) const;
+    const std::string& Version(void) const;
+
+    std::string& CreatedAt(void);
+    std::string& Description(void);
+    PacBio::BAM::Extensions& Extensions(void);
+    std::string& Format(void);
+    std::string& ModifiedAt(void);
+    std::string& Name(void);
+    std::string& ResourceId(void);
+    std::string& Tags(void);
+    std::string& Version(void);
+
+    BaseEntityType& CreatedAt(const std::string& createdAt);
+    BaseEntityType& Description(const std::string& description);
+    BaseEntityType& Extensions(const PacBio::BAM::Extensions& extensions);
+    BaseEntityType& Format(const std::string& format);    
+    BaseEntityType& ModifiedAt(const std::string& modifiedAt);
+    BaseEntityType& Name(const std::string& name);
+    BaseEntityType& ResourceId(const std::string& resourceId);
+    BaseEntityType& Tags(const std::string& tags);
+    BaseEntityType& Version(const std::string& version);
+};
+
+class DataEntityType : public BaseEntityType
+{
+protected:
+    DataEntityType(const std::string& label,
+                   const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+
+public:
+    const std::string& Checksum(void) const;
+    const std::string& EncodedValue(void) const;
+    const std::string& MetaType(void) const;
+    const std::string& SimpleValue(void) const;
+    const std::string& TimeStampedName(void) const;
+    const std::string& UniqueId(void) const;
+    const std::string& ValueDataType(void) const;
+
+    std::string& Checksum(void);
+    std::string& EncodedValue(void);
+    std::string& MetaType(void);
+    std::string& SimpleValue(void);
+    std::string& TimeStampedName(void);
+    std::string& UniqueId(void);
+    std::string& ValueDataType(void);
+
+    DataEntityType& Checksum(const std::string& checksum);
+    DataEntityType& EncodedValue(const std::string& encodedValue);
+    DataEntityType& MetaType(const std::string& metatype);
+    DataEntityType& SimpleValue(const std::string& simpleValue);
+    DataEntityType& TimeStampedName(const std::string& timeStampedName);
+    DataEntityType& UniqueId(const std::string& uuid);
+    DataEntityType& ValueDataType(const std::string& valueDataType);
+};
+
+class StrictEntityType : public BaseEntityType
+{
+protected:
+    StrictEntityType(const std::string& label,
+                     const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+
+public:
+    const std::string& MetaType(void) const;
+    const std::string& TimeStampedName(void) const;
+    const std::string& UniqueId(void) const;
+
+    std::string& MetaType(void);
+    std::string& TimeStampedName(void);
+    std::string& UniqueId(void);
+
+    StrictEntityType& MetaType(const std::string& metatype);
+    StrictEntityType& TimeStampedName(const std::string& timeStampedName);
+    StrictEntityType& UniqueId(const std::string& uuid);
+};
+
+class InputOutputDataType : public StrictEntityType
+{
+protected:
+    InputOutputDataType(const std::string& label,
+                        const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+};
+
+class IndexedDataType : public InputOutputDataType
+{
+protected:
+    IndexedDataType(const std::string& label,
+                    const XsdType& xsd = XsdType::BASE_DATA_MODEL);
+
+public:
+    const PacBio::BAM::FileIndices& FileIndices(void) const;
+    PacBio::BAM::FileIndices& FileIndices(void);
+    IndexedDataType& FileIndices(const PacBio::BAM::FileIndices& indices);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#include "pbbam/internal/DataSetBaseTypes.inl"
+
+#endif // DATASETBASETYPES_H
diff --git a/include/pbbam/internal/DataSetBaseTypes.inl b/include/pbbam/internal/DataSetBaseTypes.inl
new file mode 100644
index 0000000..c1d2f43
--- /dev/null
+++ b/include/pbbam/internal/DataSetBaseTypes.inl
@@ -0,0 +1,220 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/DataSetBaseTypes.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// ----------------
+// BaseEntityType
+// ----------------
+
+inline const std::string& BaseEntityType::CreatedAt(void) const
+{ return Attribute("CreatedAt"); }
+
+inline std::string& BaseEntityType::CreatedAt(void)
+{ return Attribute("CreatedAt"); }
+
+inline BaseEntityType& BaseEntityType::CreatedAt(const std::string& createdAt)
+{ Attribute("CreatedAt", createdAt); return *this; }
+
+inline const std::string& BaseEntityType::Description(void) const
+{ return Attribute("Description"); }
+
+inline std::string& BaseEntityType::Description(void)
+{ return Attribute("Description"); }
+
+inline BaseEntityType& BaseEntityType::Description(const std::string& description)
+{ Attribute("Description", description); return *this; }
+
+inline const std::string& BaseEntityType::Format(void) const
+{ return Attribute("Format"); }
+
+inline std::string& BaseEntityType::Format(void)
+{ return Attribute("Format"); }
+
+inline BaseEntityType& BaseEntityType::Format(const std::string& format)
+{ Attribute("Format", format); return *this; }
+
+inline const std::string& BaseEntityType::ModifiedAt(void) const
+{ return Attribute("ModifiedAt"); }
+
+inline std::string& BaseEntityType::ModifiedAt(void)
+{ return Attribute("ModifiedAt"); }
+
+inline BaseEntityType& BaseEntityType::ModifiedAt(const std::string& modifiedAt)
+{ Attribute("ModifiedAt", modifiedAt); return *this; }
+
+inline const std::string& BaseEntityType::Name(void) const
+{ return Attribute("Name"); }
+
+inline std::string& BaseEntityType::Name(void)
+{ return Attribute("Name"); }
+
+inline BaseEntityType& BaseEntityType::Name(const std::string& name)
+{ Attribute("Name", name); return *this; }
+
+inline const std::string& BaseEntityType::ResourceId(void) const
+{ return Attribute("ResourceId"); }
+
+inline std::string& BaseEntityType::ResourceId(void)
+{ return Attribute("ResourceId"); }
+
+inline BaseEntityType& BaseEntityType::ResourceId(const std::string& resourceId)
+{ Attribute("ResourceId", resourceId); return *this; }
+
+inline const std::string& BaseEntityType::Tags(void) const
+{ return Attribute("Tags"); }
+
+inline std::string& BaseEntityType::Tags(void)
+{ return Attribute("Tags"); }
+
+inline BaseEntityType& BaseEntityType::Tags(const std::string& tags)
+{ Attribute("Tags", tags); return *this; }
+
+inline const std::string& BaseEntityType::Version(void) const
+{ return Attribute("Version"); }
+
+inline std::string& BaseEntityType::Version(void)
+{ return Attribute("Version"); }
+
+inline BaseEntityType& BaseEntityType::Version(const std::string& version)
+{ Attribute("Version", version); return *this; }
+
+// ----------------
+// DataEntityType
+// ----------------
+
+inline const std::string& DataEntityType::Checksum(void) const
+{ return ChildText("Checksum"); }
+
+inline std::string& DataEntityType::Checksum(void)
+{ return ChildText("Checksum"); }
+
+inline DataEntityType& DataEntityType::Checksum(const std::string& checksum)
+{ ChildText("Checksum", checksum); return *this; }
+
+inline const std::string& DataEntityType::EncodedValue(void) const
+{ return ChildText("EncodedValue"); }
+
+inline std::string& DataEntityType::EncodedValue(void)
+{ return ChildText("EncodedValue"); }
+
+inline DataEntityType& DataEntityType::EncodedValue(const std::string& encodedValue)
+{ ChildText("EncodedValue", encodedValue); return *this; }
+
+inline const std::string& DataEntityType::MetaType(void) const
+{ return Attribute("MetaType"); }
+
+inline std::string& DataEntityType::MetaType(void)
+{ return Attribute("MetaType"); }
+
+inline DataEntityType& DataEntityType::MetaType(const std::string& metatype)
+{ Attribute("MetaType", metatype); return *this; }
+
+inline const std::string& DataEntityType::SimpleValue(void) const
+{ return Attribute("SimpleValue"); }
+
+inline std::string& DataEntityType::SimpleValue(void)
+{ return Attribute("SimpleValue"); }
+
+inline DataEntityType& DataEntityType::SimpleValue(const std::string& simpleValue)
+{ Attribute("SimpleValue", simpleValue); return *this; }
+
+inline const std::string& DataEntityType::TimeStampedName(void) const
+{ return Attribute("TimeStampedName"); }
+
+inline std::string& DataEntityType::TimeStampedName(void)
+{ return Attribute("TimeStampedName"); }
+
+inline DataEntityType& DataEntityType::TimeStampedName(const std::string& timeStampedName)
+{ Attribute("TimeStampedName", timeStampedName); return *this; }
+
+inline const std::string& DataEntityType::UniqueId(void) const
+{ return Attribute("UniqueId"); }
+
+inline std::string& DataEntityType::UniqueId(void)
+{ return Attribute("UniqueId"); }
+
+inline DataEntityType& DataEntityType::UniqueId(const std::string& uuid)
+{ Attribute("UniqueId", uuid); return *this; }
+
+inline const std::string& DataEntityType::ValueDataType(void) const
+{ return Attribute("ValueDataType"); }
+
+inline std::string& DataEntityType::ValueDataType(void)
+{ return Attribute("ValueDataType"); }
+
+inline DataEntityType& DataEntityType::ValueDataType(const std::string& valueDataType)
+{ Attribute("ValueDataType", valueDataType); return *this; }
+
+// ----------------
+// StrictEntityType
+// ----------------
+
+inline const std::string& StrictEntityType::MetaType(void) const
+{ return Attribute("MetaType"); }
+
+inline std::string& StrictEntityType::MetaType(void)
+{ return Attribute("MetaType"); }
+
+inline StrictEntityType& StrictEntityType::MetaType(const std::string& metatype)
+{ Attribute("MetaType", metatype); return *this; }
+
+inline const std::string& StrictEntityType::TimeStampedName(void) const
+{ return Attribute("TimeStampedName"); }
+
+inline std::string& StrictEntityType::TimeStampedName(void)
+{ return Attribute("TimeStampedName"); }
+
+inline StrictEntityType& StrictEntityType::TimeStampedName(const std::string& timeStampedName)
+{ Attribute("TimeStampedName", timeStampedName); return *this; }
+
+inline const std::string& StrictEntityType::UniqueId(void) const
+{ return Attribute("UniqueId"); }
+
+inline std::string& StrictEntityType::UniqueId(void)
+{ return Attribute("UniqueId"); }
+
+inline StrictEntityType& StrictEntityType::UniqueId(const std::string& uuid)
+{ Attribute("UniqueId", uuid); return *this; }
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/DataSetElement.h b/include/pbbam/internal/DataSetElement.h
new file mode 100644
index 0000000..e80e55e
--- /dev/null
+++ b/include/pbbam/internal/DataSetElement.h
@@ -0,0 +1,186 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef DATASETELEMENT_H
+#define DATASETELEMENT_H
+
+#include "pbbam/DataSetXsd.h"
+
+#include <boost/utility/string_ref.hpp>
+#include <algorithm>
+#include <map>
+#include <stdexcept>
+#include <string>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class XmlName
+{
+    //    qualified name
+    //       |
+    //  --------------
+    // <pbns:node_name >
+    //  ---- ---------
+    //   |        |
+    //  prefix    local name
+
+public:
+    XmlName(const std::string& fullName);
+    XmlName(const std::string& localName, const std::string& prefix);
+    XmlName(const XmlName& other);
+    XmlName(XmlName&& other);
+    XmlName& operator=(const XmlName& other);
+    XmlName& operator=(XmlName&& other);
+    ~XmlName(void);
+
+public:
+    bool operator==(const XmlName& other) const;
+    bool operator!=(const XmlName& other) const;
+
+public:
+    const boost::string_ref LocalName(void) const;
+    const boost::string_ref Prefix(void) const;
+    const std::string& QualifiedName(void) const;
+
+private:
+    std::string qualifiedName_;
+    size_t prefixSize_;
+    size_t localNameOffset_;
+    size_t localNameSize_;
+};
+
+class DataSetElement
+{
+public:
+    DataSetElement(const std::string& label, const XsdType& xsd = XsdType::NONE);
+    DataSetElement(const DataSetElement& other);
+    DataSetElement(DataSetElement&& other);
+    DataSetElement& operator=(const DataSetElement& other);
+    DataSetElement& operator=(DataSetElement&& other);
+    virtual ~DataSetElement(void);
+
+public:
+    bool operator==(const DataSetElement& other) const;
+    bool operator!=(const DataSetElement& other) const;
+
+public:
+    const std::string& Attribute(const std::string& name) const;
+    std::string& Attribute(const std::string& name);
+    const std::map<std::string, std::string>& Attributes(void) const;
+    std::map<std::string, std::string>& Attributes(void);
+    bool HasAttribute(const std::string& name) const;
+
+    const std::vector<DataSetElement>& Children(void) const;
+    std::vector<DataSetElement>& Children(void);
+    bool HasChild(const std::string& label) const;
+
+    const boost::string_ref LocalNameLabel(void) const;
+    const boost::string_ref PrefixLabel(void) const;
+    const std::string& QualifiedNameLabel(void) const;
+
+    const std::string& Text(void) const;
+    std::string& Text(void);
+
+    const XsdType& Xsd(void) const;
+
+public:
+    void Attribute(const std::string& name, const std::string& value);
+    void Label(const std::string& label);
+    void Text(const std::string& text);
+
+public:
+    size_t NumAttributes(void) const;
+    size_t NumChildren(void) const;
+
+public:
+    void AddChild(const DataSetElement& e);
+    void RemoveChild(const DataSetElement& e);
+
+    template<typename T>
+    const T& Child(size_t index) const;
+
+    template<typename T>
+    T& Child(size_t index);
+
+    template<typename T>
+    const T& Child(const std::string& label) const;
+
+    template<typename T>
+    T& Child(const std::string& label);
+
+    template<typename T>
+    const T& operator[](size_t index) const;
+
+    template<typename T>
+    T& operator[](size_t index);
+
+    template<typename T = DataSetElement>
+    const T& operator[](const std::string& label) const;
+
+    template<typename T = DataSetElement>
+    T& operator[](const std::string& label);
+
+protected:
+    static const std::string& SharedNullString(void);
+
+public:
+    const std::string& ChildText(const std::string& label) const;
+    std::string& ChildText(const std::string& label);
+    void ChildText(const std::string& label, const std::string& text);
+
+protected:
+    XsdType xsd_;
+    XmlName label_;
+    std::string text_;
+    std::map<std::string, std::string> attributes_;
+    std::vector<DataSetElement> children_;
+
+private:
+    int IndexOf(const std::string& label) const;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#include "pbbam/internal/DataSetElement.inl"
+
+#endif // DATASETELEMENT_H
diff --git a/include/pbbam/internal/DataSetElement.inl b/include/pbbam/internal/DataSetElement.inl
new file mode 100644
index 0000000..08f15b1
--- /dev/null
+++ b/include/pbbam/internal/DataSetElement.inl
@@ -0,0 +1,371 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/DataSetElement.h"
+
+#include <iostream>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// ----------------
+// DataSetElement
+// ----------------
+
+inline DataSetElement::DataSetElement(const std::string& label, const XsdType& xsd)
+    : xsd_(xsd)
+    , label_(label)
+{ }
+
+inline DataSetElement::DataSetElement(const DataSetElement& other)
+    : xsd_(other.xsd_)
+    , label_(other.label_)
+    , text_(other.text_)
+    , attributes_(other.attributes_)
+    , children_(other.children_)
+{ }
+
+inline DataSetElement::DataSetElement(DataSetElement&& other)
+    : xsd_(std::move(other.xsd_))
+    , label_(std::move(other.label_))
+    , text_(std::move(other.text_))
+    , attributes_(std::move(other.attributes_))
+    , children_(std::move(other.children_))
+{ }
+
+inline DataSetElement& DataSetElement::operator=(const DataSetElement& other)
+{
+    xsd_ = other.xsd_;
+    label_ = other.label_;
+    text_ = other.text_;
+    attributes_ = other.attributes_;
+    children_ = other.children_;
+    return *this;
+}
+
+inline DataSetElement& DataSetElement::operator=(DataSetElement&& other)
+{
+    xsd_ = std::move(other.xsd_);
+    label_ = std::move(other.label_);
+    text_ = std::move(other.text_);
+    attributes_ = std::move(other.attributes_);
+    children_ = std::move(other.children_);
+    return *this;
+}
+
+inline DataSetElement::~DataSetElement(void) { }
+
+inline bool DataSetElement::operator==(const DataSetElement& other) const
+{
+    return xsd_   == other.xsd_   &&
+           label_ == other.label_ &&
+           text_  == other.text_  &&
+           attributes_ == other.attributes_ &&
+           children_   == other.children_;
+}
+
+inline bool DataSetElement::operator!=(const DataSetElement& other) const
+{ return !(*this == other); }
+
+template<typename T>
+const T& DataSetElement::operator[](size_t index) const
+{ return Child<T>(index); }
+
+template<typename T>
+T& DataSetElement::operator[](size_t index)
+{ return Child<T>(index); }
+
+template<typename T>
+const T& DataSetElement::operator[](const std::string& label) const
+{ return Child<T>(label); }
+
+template<typename T>
+T& DataSetElement::operator[](const std::string& label)
+{ return Child<T>(label); }
+
+inline void DataSetElement::AddChild(const DataSetElement& e)
+{ children_.push_back(e); }
+
+inline std::string& DataSetElement::Attribute(const std::string& name)
+{ return attributes_[name]; }
+
+inline const std::string& DataSetElement::Attribute(const std::string& name) const
+{
+    auto iter = attributes_.find(name);
+    if (iter == attributes_.cend())
+        return SharedNullString();
+    return iter->second;
+}
+
+inline void DataSetElement::Attribute(const std::string& name, const std::string& value)
+{ attributes_[name] = value; }
+
+inline const std::map<std::string, std::string>& DataSetElement::Attributes(void) const
+{ return attributes_; }
+
+inline std::map<std::string, std::string>& DataSetElement::Attributes(void)
+{ return attributes_; }
+
+template<typename T>
+inline const T& DataSetElement::Child(size_t index) const
+{ return static_cast<const T&>(children_.at(index)); }
+
+template<typename T>
+inline T& DataSetElement::Child(size_t index)
+{ return static_cast<T&>(children_.at(index)); }
+
+template<typename T>
+inline const T& DataSetElement::Child(const std::string& label) const
+{ return Child<T>(IndexOf(label)); }
+
+template<typename T>
+inline T& DataSetElement::Child(const std::string& label)
+{
+    const int i = IndexOf(label);
+    if (i >= 0) {
+        assert(static_cast<size_t>(i) < NumChildren());
+        return Child<T>(i);
+    } else {
+        AddChild(DataSetElement(label));
+        return Child<T>(NumChildren()-1);
+    }
+}
+
+inline const std::vector<DataSetElement>& DataSetElement::Children(void) const
+{ return children_; }
+
+inline std::vector<DataSetElement>& DataSetElement::Children(void)
+{ return children_; }
+
+inline const std::string& DataSetElement::ChildText(const std::string& label) const
+{
+    if (!HasChild(label))
+        return SharedNullString();
+    return Child<DataSetElement>(label).Text();
+}
+
+inline std::string& DataSetElement::ChildText(const std::string& label)
+{
+    if (!HasChild(label))
+        AddChild(DataSetElement(label));
+    return Child<DataSetElement>(label).Text();
+}
+
+inline bool DataSetElement::HasAttribute(const std::string& name) const
+{ return attributes_.find(name) != attributes_.cend(); }
+
+inline bool DataSetElement::HasChild(const std::string& label) const
+{ return IndexOf(label) != -1; }
+
+inline int DataSetElement::IndexOf(const std::string& label) const
+{
+    const size_t count = NumChildren();
+    for (size_t i = 0; i < count; ++i) {
+        const DataSetElement& child = children_.at(i);
+        if (child.LocalNameLabel() == label || child.label_ == label)
+            return i;
+    }
+    return -1;
+}
+
+inline const boost::string_ref DataSetElement::LocalNameLabel(void) const
+{ return label_.LocalName(); }
+
+inline const boost::string_ref DataSetElement::PrefixLabel(void) const
+{ return label_.Prefix(); }
+
+inline const std::string& DataSetElement::QualifiedNameLabel(void) const
+{ return label_.QualifiedName(); }
+
+//inline std::string& DataSetElement::Label(void)
+//{ return label_.QualifiedName(); }
+
+inline void DataSetElement::Label(const std::string& label)
+{ label_ = XmlName(label); }
+
+inline size_t DataSetElement::NumAttributes(void) const
+{ return attributes_.size(); }
+
+inline size_t DataSetElement::NumChildren(void) const
+{ return children_.size(); }
+
+inline void DataSetElement::RemoveChild(const DataSetElement& e)
+{
+    children_.erase(
+        std::remove(children_.begin(),
+                    children_.end(),
+                    e),
+        children_.end()
+    );
+}
+
+inline void DataSetElement::ChildText(const std::string& label,
+                                         const std::string& text)
+{
+    if (!HasChild(label)) {
+        DataSetElement e(label);
+        e.Text(text);
+        AddChild(e);
+    } else {
+        Child<DataSetElement>(label).Text(text);
+    }
+}
+
+inline const std::string& DataSetElement::Text(void) const
+{ return text_; }
+
+inline std::string& DataSetElement::Text(void)
+{ return text_; }
+
+inline void DataSetElement::Text(const std::string& text)
+{ text_ = text; }
+
+inline const XsdType& DataSetElement::Xsd(void) const
+{ return xsd_; }
+
+// ----------------
+// XmlName
+// ----------------
+
+inline XmlName::XmlName(const std::string& fullName)
+    : qualifiedName_(fullName)
+    , prefixSize_(0)
+    , localNameOffset_(0)
+    , localNameSize_(0)
+{
+//    std::cerr << "Creating XmlName from fullName: " << fullName << std::endl;
+
+    const size_t colonFound = qualifiedName_.find(':');
+    if (colonFound == std::string::npos || colonFound == 0)
+        localNameSize_ = qualifiedName_.size();
+    else {
+        prefixSize_ = colonFound;
+        localNameSize_ = (qualifiedName_.size() - colonFound) - 1;
+    }
+
+    // adjust for colon if prefix present
+    localNameOffset_ = prefixSize_;
+    if (prefixSize_ != 0)
+        ++localNameOffset_;
+
+//    std::cerr << "  qualName:  " << qualifiedName_ << std::endl;
+//    std::cerr << "  prefix:    " << Prefix() << std::endl;
+//    std::cerr << "  localName: " << LocalName() << std::endl;
+}
+
+inline XmlName::XmlName(const std::string& localName,
+                        const std::string& prefix)
+    : prefixSize_(prefix.size())
+    , localNameOffset_(prefixSize_)
+    , localNameSize_(localName.size())
+{
+    qualifiedName_.clear();
+    qualifiedName_.reserve(localNameSize_+ prefixSize_ + 1);
+    qualifiedName_.append(prefix);
+    if (!qualifiedName_.empty())
+        qualifiedName_.append(1, ':');
+    qualifiedName_.append(localName);
+
+    // adjust for colon if prefix present
+    if (prefixSize_ != 0)
+        ++localNameOffset_;
+}
+
+inline XmlName::XmlName(const XmlName& other)
+    : qualifiedName_(other.qualifiedName_)
+    , prefixSize_(other.prefixSize_)
+    , localNameOffset_(other.localNameOffset_)
+    , localNameSize_(other.localNameSize_)
+{ }
+
+inline XmlName::XmlName(XmlName&& other)
+    : qualifiedName_(std::move(other.qualifiedName_))
+    , prefixSize_(std::move(other.prefixSize_))
+    , localNameOffset_(std::move(other.localNameOffset_))
+    , localNameSize_(std::move(other.localNameSize_))
+{ }
+
+inline XmlName& XmlName::operator=(const XmlName& other)
+{
+    qualifiedName_   = other.qualifiedName_;
+    prefixSize_      = other.prefixSize_;
+    localNameOffset_ = other.localNameOffset_;
+    localNameSize_   = other.localNameSize_;
+    return *this;
+}
+
+inline XmlName& XmlName::operator=(XmlName&& other)
+{
+    qualifiedName_   = std::move(other.qualifiedName_);
+    prefixSize_      = std::move(other.prefixSize_);
+    localNameOffset_ = std::move(other.localNameOffset_);
+    localNameSize_   = std::move(other.localNameSize_);
+    return *this;
+}
+
+inline XmlName::~XmlName(void) { }
+
+inline bool XmlName::operator==(const XmlName& other) const
+{ return qualifiedName_ == other.qualifiedName_; }
+
+inline bool XmlName::operator!=(const XmlName& other) const
+{ return !(*this == other); }
+
+//inline void XmlName::CalculateSizes(const size_t localNameSize,
+//                                    const size_t prefixSize)
+//{
+//    size_t offset = prefixSize;
+//    if (offset != 0)
+//        ++offset;
+
+//    localName_ = boost::string_ref(qualifiedName_.data() + offset, localNameSize);
+//    prefix_    = boost::string_ref(qualifiedName_.data(), prefixSize);
+//}
+
+inline const boost::string_ref XmlName::LocalName(void) const
+{ return boost::string_ref(qualifiedName_.data() + localNameOffset_, localNameSize_); }
+
+inline const boost::string_ref XmlName::Prefix(void) const
+{ return boost::string_ref(qualifiedName_.data(), prefixSize_); }
+
+inline const std::string& XmlName::QualifiedName(void) const
+{ return qualifiedName_; }
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/DataSetListElement.h b/include/pbbam/internal/DataSetListElement.h
new file mode 100644
index 0000000..5c44d25
--- /dev/null
+++ b/include/pbbam/internal/DataSetListElement.h
@@ -0,0 +1,118 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef DATASETLISTELEMENT_H
+#define DATASETLISTELEMENT_H
+
+#include "pbbam/internal/DataSetElement.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+//
+// adds iterators for convenience
+//
+template<class T> class DataSetListElement;
+
+template<class T>
+class DataSetListIteratorBase
+{
+public:
+    bool operator==(const DataSetListIteratorBase<T>& other) const;
+    bool operator!=(const DataSetListIteratorBase<T>& other) const;
+
+protected:
+    DataSetListIteratorBase(const DataSetListElement<T>* parent, size_t i);
+    void ReadNext(void);
+
+protected:
+    const DataSetListElement<T>* parent_;
+    size_t index_;
+};
+
+template<class T>
+class DataSetListIterator : public DataSetListIteratorBase<T>
+{
+public:
+    DataSetListIterator(const DataSetListElement<T>* parent, size_t i);
+    T& operator*(void);
+    T* operator->(void);
+    DataSetListIterator<T>& operator++(void);
+    DataSetListIterator<T> operator++(int);
+};
+
+template<class T>
+class DataSetListConstIterator : public DataSetListIteratorBase<T>
+{
+public:
+    DataSetListConstIterator(const DataSetListElement<T>* parent, size_t i);
+    const T& operator*(void) const;
+    const T* operator->(void) const;
+    DataSetListConstIterator<T>& operator++(void);
+    DataSetListConstIterator<T> operator++(int);
+};
+
+template<class T>
+class DataSetListElement : public DataSetElement
+{
+public:
+    DataSetListElement(const std::string& label, const XsdType& xsd = XsdType::NONE);
+
+// child access through index
+public:
+    const T& operator[](size_t index) const;
+    T& operator[](size_t index);
+    size_t Size(void) const;
+
+// child access through iterators
+public:
+    DataSetListIterator<T> begin(void);
+    DataSetListConstIterator<T> begin(void) const;
+    DataSetListConstIterator<T> cbegin(void) const;
+    DataSetListIterator<T> end(void);
+    DataSetListConstIterator<T> end(void) const;
+    DataSetListConstIterator<T> cend(void) const;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#include "pbbam/internal/DataSetListElement.inl"
+
+#endif // DATASETLISTELEMENT_H
diff --git a/include/pbbam/internal/DataSetListElement.inl b/include/pbbam/internal/DataSetListElement.inl
new file mode 100644
index 0000000..1479fa5
--- /dev/null
+++ b/include/pbbam/internal/DataSetListElement.inl
@@ -0,0 +1,181 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/DataSetListElement.h"
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// --------------------
+// DataSetListElement
+// --------------------
+
+template<class T>
+inline DataSetListElement<T>::DataSetListElement(const std::string& label,
+                                                 const XsdType& xsd)
+    : DataSetElement(label, xsd)
+{ }
+
+template<class T>
+inline const T& DataSetListElement<T>::operator[](size_t index) const
+{ return static_cast<const T&>(children_.at(index)); }
+
+template<class T>
+inline T& DataSetListElement<T>::operator[](size_t index)
+{ return static_cast<T&>(children_.at(index)); }
+
+template<class T>
+inline size_t DataSetListElement<T>::Size(void) const
+{ return NumChildren(); }
+
+template<class T>
+inline DataSetListIterator<T> DataSetListElement<T>::begin(void)
+{ return DataSetListIterator<T>(this, 0); }
+
+template<class T>
+inline DataSetListConstIterator<T> DataSetListElement<T>::begin(void) const
+{ return DataSetListConstIterator<T>(this, 0); }
+
+template<class T>
+inline DataSetListConstIterator<T> DataSetListElement<T>::cbegin(void) const
+{ return DataSetListConstIterator<T>(this, 0); }
+
+template<class T>
+inline DataSetListIterator<T> DataSetListElement<T>::end(void)
+{ return DataSetListIterator<T>(this, NumChildren()); }
+
+template<class T>
+inline DataSetListConstIterator<T> DataSetListElement<T>::end(void) const
+{ return DataSetListConstIterator<T>(this, NumChildren()); }
+
+template<class T>
+inline DataSetListConstIterator<T>DataSetListElement<T>::cend(void) const
+{ return DataSetListConstIterator<T>(this, NumChildren()); }
+
+// -------------------------
+// DataSetListIteratorBase
+// -------------------------
+
+template<class T>
+inline bool DataSetListIteratorBase<T>::operator==(const DataSetListIteratorBase<T>& other) const
+{ return parent_ == other.parent_ &&
+         index_ == other.index_;
+}
+
+template<class T>
+inline bool DataSetListIteratorBase<T>::operator!=(const DataSetListIteratorBase<T>& other) const
+{ return !(*this == other); }
+
+template<class T>
+inline DataSetListIteratorBase<T>::DataSetListIteratorBase(const DataSetListElement<T>* parent, size_t i)
+    : parent_(parent)
+    , index_(i)
+{ }
+
+template<class T>
+inline void DataSetListIteratorBase<T>::ReadNext(void)
+{
+    if (index_ >= parent_->NumChildren()) {
+        parent_ = nullptr;
+        return;
+    }
+    ++index_;
+}
+
+// ---------------------
+// DataSetListIterator
+// ---------------------
+
+template<class T>
+inline DataSetListIterator<T>::DataSetListIterator(const DataSetListElement<T>* parent, size_t i)
+    : DataSetListIteratorBase<T>(parent, i)
+{ }
+
+template<class T>
+inline T& DataSetListIterator<T>::operator*(void)
+{ return DataSetListIteratorBase<T>::parent_->template Child<T>(DataSetListIteratorBase<T>::index_); }
+
+template<class T>
+inline T* DataSetListIterator<T>::operator->(void)
+{ return &(operator*()); }
+
+template<class T>
+inline DataSetListIterator<T>& DataSetListIterator<T>::operator++(void)
+{ DataSetListIteratorBase<T>::ReadNext(); return *this; }
+
+template<class T>
+inline DataSetListIterator<T> DataSetListIterator<T>::operator++(int)
+{
+    DataSetListIterator<T> result(*this);
+    ++(*this);
+    return result;
+}
+
+// --------------------------
+// DataSetListConstIterator
+// --------------------------
+
+template<class T>
+inline DataSetListConstIterator<T>::DataSetListConstIterator(const DataSetListElement<T>* parent, size_t i)
+    : DataSetListIteratorBase<T>(parent, i)
+{ }
+
+template<class T>
+inline const T& DataSetListConstIterator<T>::operator*(void) const
+{ return DataSetListIteratorBase<T>::parent_->template Child<T>(DataSetListIteratorBase<T>::index_); }
+
+template<class T>
+inline const T* DataSetListConstIterator<T>::operator->(void) const
+{ return &(operator*()); }
+
+template<class T>
+inline DataSetListConstIterator<T>& DataSetListConstIterator<T>::operator++(void)
+{ DataSetListIteratorBase<T>::ReadNext(); return *this; }
+
+template<class T>
+inline DataSetListConstIterator<T> DataSetListConstIterator<T>::operator++(int)
+{
+    DataSetListConstIterator<T> result(*this);
+    ++(*this);
+    return result;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/DataSetTypes.inl b/include/pbbam/internal/DataSetTypes.inl
new file mode 100644
index 0000000..105dffb
--- /dev/null
+++ b/include/pbbam/internal/DataSetTypes.inl
@@ -0,0 +1,150 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSetTypes.h"
+
+namespace PacBio {
+namespace BAM {
+
+// -------------
+// DataSetBase
+// --------------
+
+inline const NamespaceRegistry& DataSetBase::Namespaces(void) const
+{ return registry_; }
+
+inline NamespaceRegistry& DataSetBase::Namespaces(void)
+{ return registry_; }
+
+// ---------------------
+// DataSetMetadata
+// ---------------------
+
+inline const std::string& DataSetMetadata::NumRecords(void) const
+{ return ChildText("NumRecords"); }
+
+inline std::string& DataSetMetadata::NumRecords(void)
+{ return ChildText("NumRecords"); }
+
+inline DataSetMetadata& DataSetMetadata::NumRecords(const std::string& numRecords)
+{ ChildText("NumRecords", numRecords); return *this; }
+
+inline const std::string& DataSetMetadata::TotalLength(void) const
+{ return ChildText("TotalLength"); }
+
+inline std::string& DataSetMetadata::TotalLength(void)
+{ return ChildText("TotalLength"); }
+
+inline DataSetMetadata& DataSetMetadata::TotalLength(const std::string& totalLength)
+{ ChildText("TotalLength", totalLength); return *this; }
+
+// ----------
+// Property
+// ----------
+
+inline const std::string& Property::Name(void) const
+{ return Attribute("Name"); }
+
+inline std::string& Property::Name(void)
+{ return Attribute("Name"); }
+
+inline Property& Property::Name(const std::string& name)
+{ Attribute("Name", name); return *this; }
+
+inline const std::string& Property::Operator(void) const
+{ return Attribute("Operator"); }
+
+inline std::string& Property::Operator(void)
+{ return Attribute("Operator"); }
+
+inline Property& Property::Operator(const std::string& op)
+{ Attribute("Operator", op); return *this; }
+
+inline const std::string& Property::Value(void) const
+{ return Attribute("Value"); }
+
+inline std::string& Property::Value(void)
+{ return Attribute("Value"); }
+
+inline Property& Property::Value(const std::string& value)
+{ Attribute("Value", value); return *this; }
+
+// ------------
+// Provenance
+// ------------
+
+inline const std::string& Provenance::CreatedBy(void) const
+{ return Attribute("CreatedBy"); }
+
+inline std::string& Provenance::CreatedBy(void)
+{ return Attribute("CreatedBy"); }
+
+inline Provenance& Provenance::CreatedBy(const std::string& createdBy)
+{ Attribute("CreatedBy", createdBy); return *this; }
+
+inline const std::string& Provenance::CommonServicesInstanceId(void) const
+{ return ChildText("CommonServicesInstanceId"); }
+
+inline std::string& Provenance::CommonServicesInstanceId(void)
+{ return ChildText("CommonServicesInstanceId"); }
+
+inline Provenance& Provenance::CommonServicesInstanceId(const std::string& id)
+{ ChildText("CommonServicesInstanceId", id); return *this; }
+
+inline const std::string& Provenance::CreatorUserId(void) const
+{ return ChildText("CreatorUserId"); }
+
+inline std::string& Provenance::CreatorUserId(void)
+{ return ChildText("CreatorUserId"); }
+
+inline Provenance& Provenance::CreatorUserId(const std::string& id)
+{ ChildText("CreatorUserId", id); return *this; }
+
+inline const std::string& Provenance::ParentJobId(void) const
+{ return ChildText("ParentJobId"); }
+
+inline std::string& Provenance::ParentJobId(void)
+{ return ChildText("ParentJobId"); }
+
+inline Provenance& Provenance::ParentJobId(const std::string& id)
+{ ChildText("ParentJobId", id); return *this; }
+
+inline Provenance& Provenance::ParentTool(const PacBio::BAM::ParentTool& tool)
+{ ParentTool() = tool; return *this; }
+
+} // namespace BAM
+} // namespace PacBio
diff --git a/include/pbbam/internal/FilterEngine.h b/include/pbbam/internal/FilterEngine.h
new file mode 100644
index 0000000..bc4b88b
--- /dev/null
+++ b/include/pbbam/internal/FilterEngine.h
@@ -0,0 +1,71 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef FILTERENGINE_H
+#define FILTERENGINE_H
+
+#include "pbbam/BamRecord.h"
+#include <memory>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+
+
+class FilterEngine {
+
+public:
+    FilterEngine(void);
+
+public:
+    // returns true if record passes filter
+    bool Accepts(const BamRecord& r) const;
+
+    // removes records that do not pass filter, returns true if !empty()
+    bool Accepts(std::vector<BamRecord>& r) const;
+
+private:
+
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // FILTERENGINE_H
diff --git a/include/pbbam/internal/IBamFileIterator.h b/include/pbbam/internal/IBamFileIterator.h
new file mode 100644
index 0000000..5ea34f3
--- /dev/null
+++ b/include/pbbam/internal/IBamFileIterator.h
@@ -0,0 +1,79 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef IBAMFILEITERATOR_H
+#define IBAMFILEITERATOR_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include <memory>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+class IBamFileIteratorBase
+{
+public:
+    typedef std::shared_ptr< IBamFileIteratorBase<T> > Ptr;
+
+protected:
+    IBamFileIteratorBase(const BamFile& file)
+        : header_(file.Header().DeepCopy())
+    { }
+public:
+    virtual ~IBamFileIteratorBase(void) { }
+
+public:
+    virtual bool GetNext(T& result) =0;
+    virtual bool InSameGroup(const BamRecord& lhs, const BamRecord& rhs) const
+    { (void)lhs; (void)rhs; return true; }
+
+protected:
+    const BamHeader header_;
+};
+
+typedef IBamFileIteratorBase<BamRecord>               IBamFileIterator;
+typedef IBamFileIteratorBase<std::vector<BamRecord> > IBamFileGroupIterator;
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // IBAMFILEITERATOR_H
diff --git a/include/pbbam/internal/IMergeStrategy.h b/include/pbbam/internal/IMergeStrategy.h
new file mode 100644
index 0000000..0677f31
--- /dev/null
+++ b/include/pbbam/internal/IMergeStrategy.h
@@ -0,0 +1,67 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef IMERGESTRATEGY_H
+#define IMERGESTRATEGY_H
+
+#include "pbbam/internal/IBamFileIterator.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+class IMergeStrategyBase
+{
+public:
+    typedef typename IBamFileIteratorBase<T>::Ptr FileIterPtr;
+protected:
+    IMergeStrategyBase(void) { }
+public:
+    virtual ~IMergeStrategyBase(void) { }
+public:
+    virtual bool GetNext(T& result) =0;
+};
+
+typedef IMergeStrategyBase<BamRecord>               IMergeStrategy;
+typedef IMergeStrategyBase<std::vector<BamRecord> > IGroupMergeStrategy;
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // IMERGESTRATEGY_H
diff --git a/include/pbbam/internal/MergeItem.h b/include/pbbam/internal/MergeItem.h
new file mode 100644
index 0000000..f3d2347
--- /dev/null
+++ b/include/pbbam/internal/MergeItem.h
@@ -0,0 +1,77 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef MERGEITEM_H
+#define MERGEITEM_H
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/internal/IBamFileIterator.h"
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+struct MergeItemBase
+{
+public:
+    typedef typename IBamFileIteratorBase<T>::Ptr FileIterPtr;
+
+public:
+    MergeItemBase(void) { }
+    MergeItemBase(const T& r, const FileIterPtr& iter)
+        : record_(r), iter_(iter)
+    { }
+
+public:
+    bool IsNull(void) const
+    { return !iter_; }
+
+public:
+    T record_;
+    FileIterPtr iter_;
+};
+
+typedef MergeItemBase<BamRecord>               MergeItem;
+typedef MergeItemBase<std::vector<BamRecord> > GroupMergeItem;
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // MERGEITEM_H
diff --git a/include/pbbam/internal/MergeStrategy.h b/include/pbbam/internal/MergeStrategy.h
new file mode 100644
index 0000000..1a8a564
--- /dev/null
+++ b/include/pbbam/internal/MergeStrategy.h
@@ -0,0 +1,239 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef MERGESTRATEGY_H
+#define MERGESTRATEGY_H
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/internal/IMergeStrategy.h"
+#include "pbbam/internal/MergeItem.h"
+#include <functional>
+#include <set>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename Compare>
+struct MergeItemSorter : public std::binary_function<MergeItem, MergeItem, bool>
+{
+public:
+    MergeItemSorter(const Compare& comp = Compare())
+        : comp_(comp)
+    { }
+
+    bool operator()(const MergeItem& lhs, const MergeItem& rhs) {
+        const BamRecord& l = lhs.record_;
+        const BamRecord& r = rhs.record_;
+        return comp_(l, r);
+    }
+
+private:
+    Compare comp_;
+};
+
+template<typename Compare>
+struct GroupMergeItemSorter : public std::binary_function<GroupMergeItem, GroupMergeItem, bool>
+{
+public:
+    GroupMergeItemSorter(const Compare& comp = Compare())
+        : comp_(comp)
+    { }
+
+    bool operator()(const GroupMergeItem& lhs, const GroupMergeItem& rhs) {
+        if ( lhs.record_.empty())
+            return false;
+        if ( rhs.record_.empty())
+            return true;
+        assert(!lhs.record_.empty());
+        assert(!rhs.record_.empty());
+        const BamRecord& l = lhs.record_.front();
+        const BamRecord& r = rhs.record_.front();
+        return comp_(l, r);
+    }
+
+private:
+    Compare comp_;
+};
+
+template<typename Compare>
+class MergeStrategy : public IMergeStrategy
+{
+public:
+    MergeStrategy(const std::vector<FileIterPtr>& iters);
+    bool GetNext(BamRecord& record);
+private:
+    std::multiset<MergeItem, MergeItemSorter<Compare> > mergeItems_;
+};
+
+template<typename Compare>
+class GroupMergeStrategy : public IGroupMergeStrategy
+{
+public:
+    GroupMergeStrategy(const std::vector<FileIterPtr>& iters);
+    bool GetNext(std::vector<BamRecord>& records);
+private:
+    GroupMergeItem nextItem_;
+    std::multiset<GroupMergeItem, GroupMergeItemSorter<Compare> > mergeItems_;
+};
+
+// -----------------------
+// MergeStrategy
+// -----------------------
+
+template<typename Compare>
+inline MergeStrategy<Compare>::MergeStrategy(const std::vector<FileIterPtr>& iters)
+    : IMergeStrategy()
+{
+    BamRecord r;
+    for (FileIterPtr iter : iters) {
+        if (iter->GetNext(r)) {
+            MergeItem item(r, iter);
+            mergeItems_.insert(item);
+        }
+    }
+}
+
+template<typename Compare>
+inline bool MergeStrategy<Compare>::GetNext(BamRecord& record)
+{
+    if (mergeItems_.empty())
+        return false;
+
+    // pop first merge item & record
+    auto firstIter = mergeItems_.begin();
+    MergeItem firstItem = (*firstIter);
+    mergeItems_.erase(firstIter);
+    record = firstItem.record_;
+
+    // try fetch iter's next (if failed, do not replace)
+    if (firstItem.iter_->GetNext(firstItem.record_))
+        mergeItems_.insert(firstItem);
+    return true;
+}
+
+// -----------------------
+// GroupMergeStrategy
+// -----------------------
+
+template<typename Compare>
+inline GroupMergeStrategy<Compare>::GroupMergeStrategy(const std::vector<FileIterPtr>& iters)
+    : IGroupMergeStrategy()
+{
+    std::vector<BamRecord> r;
+    for (FileIterPtr iter : iters) {
+        if (iter->GetNext(r)) {
+            GroupMergeItem item(r, iter);
+            mergeItems_.insert(item);
+        }
+    }
+    if (!mergeItems_.empty()) {
+        auto firstIter = mergeItems_.begin();
+        nextItem_ = (*firstIter);
+        mergeItems_.erase(firstIter);
+    }
+}
+
+template<typename Compare>
+inline bool GroupMergeStrategy<Compare>::GetNext(std::vector<BamRecord>& records)
+{
+    records.clear();
+    if (nextItem_.IsNull())
+        return false;
+
+    // append "nextItem" records
+    records = nextItem_.record_;
+
+    // try fetch iter's next (if failed, do not replace)
+    if (nextItem_.iter_->GetNext(nextItem_.record_))
+        mergeItems_.insert(nextItem_);
+    else
+        nextItem_ = GroupMergeItem();
+
+    while (!mergeItems_.empty()) {
+
+        // pop first merge item
+        auto firstIter = mergeItems_.begin();
+        GroupMergeItem firstItem = (*firstIter);
+        mergeItems_.erase(firstIter);
+
+        // if first item has records
+        if (!firstItem.record_.empty()) {
+
+            // if first block to store
+            if (records.empty())
+                records = firstItem.record_;
+
+            // else see if we match current group
+            else {
+                const BamRecord& lhs = records.front();
+                const BamRecord& rhs = firstItem.record_.front();
+
+                // if match, append to output & fetch next
+                if (firstItem.iter_->InSameGroup(lhs, rhs)) {
+
+                    for (const BamRecord& r : firstItem.record_)
+                        records.push_back(r);
+                    if (firstItem.iter_->GetNext(firstItem.record_))
+                        mergeItems_.insert(firstItem);
+                }
+
+                // no match, item becomes the "next item" to use
+                else {
+                    nextItem_ = firstItem;
+                    break;
+                }
+            }
+        }
+
+        // first item has no records, try fetch next
+        else {
+            if (firstItem.iter_->GetNext(firstItem.record_))
+                mergeItems_.insert(firstItem);
+        }
+    }
+
+    return true;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // MERGESTRATEGY_H
diff --git a/include/pbbam/internal/PbiIndex_p.h b/include/pbbam/internal/PbiIndex_p.h
new file mode 100644
index 0000000..5f0db35
--- /dev/null
+++ b/include/pbbam/internal/PbiIndex_p.h
@@ -0,0 +1,931 @@
+//// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+////
+//// All rights reserved.
+////
+//// Redistribution and use in source and binary forms, with or without
+//// modification, are permitted (subject to the limitations in the
+//// disclaimer below) provided that the following conditions are met:
+////
+////  * Redistributions of source code must retain the above copyright
+////    notice, this list of conditions and the following disclaimer.
+////
+////  * 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.
+////
+////  * Neither the name of Pacific Biosciences nor the names of its
+////    contributors may be used to endorse or promote products derived
+////    from this software without specific prior written permission.
+////
+//// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+//// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+//// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+//// 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.
+////
+//// Author: Derek Barnett
+
+//#ifndef PBIINDEX_P_H
+//#define PBIINDEX_P_H
+
+//#include "pbbam/BamRecord.h"
+//#include "pbbam/PbiFile.h"
+//#include "pbbam/PbiIndex.h"
+//#include "pbbam/PbiRawData.h"
+
+//#include <algorithm>
+//#include <map>
+//#include <memory>
+//#include <unordered_map>
+//#include <utility>
+//#include <vector>
+//#include <cassert>
+
+//namespace PacBio {
+//namespace BAM {
+//namespace internal {
+
+//// --------------------------
+//// Ordered Lookup Container (e.g. map)
+//// --------------------------
+
+//template<typename T>
+//class OrderedLookup
+//{
+//public:
+//    typedef T         KeyType;
+//    typedef IndexList ValueType;
+//    typedef std::map<KeyType, ValueType> ContainerType;
+//    typedef typename ContainerType::const_iterator IterType;
+
+//public:
+//    OrderedLookup(void);
+//    OrderedLookup(size_t n);
+//    OrderedLookup(const ContainerType& data);
+//    OrderedLookup(ContainerType&& data);
+//    OrderedLookup(const std::vector<T>& rawData);
+//    OrderedLookup(std::vector<T>&& rawData);
+
+//public:
+//    bool operator==(const OrderedLookup<T>& other) const;
+//    bool operator!=(const OrderedLookup<T>& other) const;
+
+//public:
+//    IndexList LookupIndices(const KeyType& key,
+//                            const CompareType& compare) const;
+
+//private:
+//    IndexList LookupInclusiveRange(const IterType& begin,
+//                                   const IterType& end) const;
+
+//    IndexList LookupExclusiveRange(const IterType& begin,
+//                                   const IterType& end,
+//                                   const KeyType& key) const;
+
+//private:
+//    ContainerType data_;
+//};
+
+//// --------------------------
+//// Unordered Lookup Container (e.g. hash)
+//// --------------------------
+
+//template<typename T>
+//class UnorderedLookup
+//{
+//public:
+//    typedef T         KeyType;
+//    typedef IndexList ValueType;
+//    typedef std::unordered_map<KeyType, ValueType> ContainerType;
+
+//public:
+//    UnorderedLookup(void);
+//    UnorderedLookup(size_t n);
+//    UnorderedLookup(const ContainerType& data);
+//    UnorderedLookup(ContainerType&& data);
+//    UnorderedLookup(const std::vector<T>& rawData);
+//    UnorderedLookup(std::vector<T>&& rawData);
+
+//public:
+//    bool operator==(const UnorderedLookup<T>& other) const;
+//    bool operator!=(const UnorderedLookup<T>& other) const;
+
+//public:
+//    IndexList LookupIndices(const KeyType& key,
+//                            const CompareType& compare) const;
+
+//private:
+//    template<typename Compare>
+//    IndexList LookupHelper(const KeyType& key, const Compare& cmp) const;
+
+//private:
+//    ContainerType data_;
+//};
+
+//// ----------------
+//// Subread Data
+//// ----------------
+
+//struct SubreadLookupData
+//{
+//    // ctors
+//    SubreadLookupData(void);
+//    SubreadLookupData(const PbiRawSubreadData& rawData);
+////    SubreadLookupData(PbiRawSubreadData&& rawData);
+
+//    // add offset data to index result blocks
+//    void ApplyOffsets(IndexResultBlocks& blocks) const;
+
+//    template<typename T>
+//    IndexList Indices(const SubreadField& field,
+//                      const T& value,
+//                      const CompareType& compareType) const;
+
+//    template<typename T>
+//    IndexList IndicesMulti(const SubreadField& field,
+//                           const std::vector<T>& values) const;
+
+//    // map ordering doesn't make sense, optimize for direct lookup
+//    UnorderedLookup<int32_t> rgId_;
+
+//    // numeric comparisons make sense, keep key ordering preserved
+//    OrderedLookup<int32_t>  qStart_;
+//    OrderedLookup<int32_t>  qEnd_;
+//    OrderedLookup<int32_t>  holeNumber_;
+//    OrderedLookup<uint16_t> readQual_;
+
+//    // offsets
+//    std::vector<int64_t> fileOffset_;
+//};
+
+//// -----------------
+//// Mapped Data
+//// -----------------
+
+//struct MappedLookupData
+//{
+//    // ctors
+//    MappedLookupData(void);
+//    MappedLookupData(const PbiRawMappedData& rawData);
+////    MappedLookupData(PbiRawMappedData&& rawData);
+
+//    template<typename T>
+//    IndexList Indices(const MappedField& field,
+//                      const T& value,
+//                      const CompareType& compareType) const;
+
+//    template<typename T>
+//    IndexList IndicesMulti(const MappedField& field,
+//                           const std::vector<T>& values) const;
+
+//    // numeric comparisons make sense, keep key ordering preserved
+//    OrderedLookup<int32_t>  tId_;
+//    OrderedLookup<uint32_t> tStart_;
+//    OrderedLookup<uint32_t> tEnd_;
+//    OrderedLookup<uint32_t> aStart_;
+//    OrderedLookup<uint32_t> aEnd_;
+//    OrderedLookup<uint32_t> nM_;
+//    OrderedLookup<uint32_t> nMM_;
+//    OrderedLookup<uint8_t>  mapQV_;
+
+//    // generated, not stored in PBI
+//    OrderedLookup<uint32_t> nIns_;
+//    OrderedLookup<uint32_t> nDel_;
+
+//    // no need for map overhead, just store direct indices
+//    IndexList reverseStrand_;
+//    IndexList forwardStrand_;
+//};
+
+//// ------------------
+//// Reference Data
+//// ------------------
+
+//struct ReferenceLookupData
+//{
+//    // ctors
+//    ReferenceLookupData(void);
+//    ReferenceLookupData(const PbiRawReferenceData& rawData);
+////    ReferenceLookupData(PbiRawReferenceData&& rawData);
+
+//    IndexRange Indices(const int32_t tId) const;
+
+//    // references_[tId] = (begin, end) indices
+//    // into SubreadLookupData::fileOffset_
+//    std::unordered_map<int32_t, IndexRange> references_;
+//};
+
+//// ---------------
+//// Barcode Data
+//// ---------------
+
+//struct BarcodeLookupData
+//{
+//    // ctors
+//    BarcodeLookupData(void);
+//    BarcodeLookupData(const PbiRawBarcodeData& rawData);
+////    BarcodeLookupData(PbiRawBarcodeData&& rawData);
+
+//    template<typename T>
+//    IndexList Indices(const BarcodeField& field,
+//                      const T& value,
+//                      const CompareType& compareType) const;
+
+//    template<typename T>
+//    IndexList IndicesMulti(const BarcodeField& field,
+//                           const std::vector<T>& values) const;
+
+//    // numeric comparisons make sense, keep key ordering preserved
+//    OrderedLookup<uint16_t> bcLeft_;
+//    OrderedLookup<uint16_t> bcRight_;
+//    OrderedLookup<uint8_t>  bcQual_;
+
+//    // see if this works, or if can use unordered, 'direct' query
+//    OrderedLookup<uint8_t> ctxtFlag_;
+//};
+
+//// --------------------------
+//// Pbi Lookup Aggregate
+//// --------------------------
+
+//class PbiIndexPrivate
+//{
+//public:
+//    PbiIndexPrivate(void);
+//    PbiIndexPrivate(const PbiRawData& rawIndex);
+//    PbiIndexPrivate(PbiRawData&& rawIndex);
+
+//    std::unique_ptr<PbiIndexPrivate> DeepCopy(void) const;
+
+//public:
+//    bool HasSection(const PbiFile::Section flag) const;
+//    void SetSection(const PbiFile::Section flag, bool ok = true);
+
+//public:
+
+//    template<typename T>
+//    IndexList Indices(const SubreadField& field,
+//                      const T& value,
+//                      const CompareType& compareType) const;
+
+//    template<typename T>
+//    IndexList Indices(const MappedField& field,
+//                      const T& value,
+//                      const CompareType& compareType) const;
+
+//    template<typename T>
+//    IndexList Indices(const BarcodeField& field,
+//                      const T& value,
+//                      const CompareType& compareType) const;
+
+//    template<typename T>
+//    IndexList IndicesMulti(const SubreadField& field,
+//                           const T& value) const;
+
+//    template<typename T>
+//    IndexList IndicesMulti(const MappedField& field,
+//                           const T& value) const;
+
+//    template<typename T>
+//    IndexList IndicesMulti(const BarcodeField& field,
+//                           const T& value) const;
+
+//    template<typename T>
+//    IndexResultBlocks Lookup(const SubreadField& field,
+//                             const T& value,
+//                             const CompareType& compareType) const;
+
+//    template<typename T>
+//    IndexResultBlocks Lookup(const MappedField& field,
+//                             const T& value,
+//                             const CompareType& compareType) const;
+
+//    template<typename T>
+//    IndexResultBlocks Lookup(const BarcodeField& field,
+//                             const T& value,
+//                             const CompareType& compareType) const;
+
+//    template<typename T>
+//    IndexResultBlocks LookupMulti(const SubreadField& field,
+//                                  const std::vector<T>& values) const;
+
+//    template<typename T>
+//    IndexResultBlocks LookupMulti(const MappedField& field,
+//                                  const std::vector<T>& values) const;
+
+//    template<typename T>
+//    IndexResultBlocks LookupMulti(const BarcodeField& field,
+//                                  const std::vector<T>& values) const;
+
+//    IndexResultBlocks LookupReference(const int32_t tId) const;
+
+//private:
+//    IndexResultBlocks MergeBlocksWithOffsets(const IndexList& indices) const;
+
+//public:
+//    PbiFile::VersionEnum version_;
+//    PbiFile::Sections sections_;
+//    uint32_t numReads_;
+
+//    // lookup structures
+//    SubreadLookupData   subreadData_;
+//    MappedLookupData    mappedData_;
+//    ReferenceLookupData referenceData_;
+//    BarcodeLookupData   barcodeData_;
+
+//private:
+//    // not-implemented - ensure no copy
+//    PbiIndexPrivate(const PbiIndexPrivate& other);
+//    PbiIndexPrivate& operator=(const PbiIndexPrivate& other);
+//};
+
+//// ----------------
+//// helper methods
+//// ----------------
+
+//inline IndexResultBlocks mergedIndexBlocks(IndexList&& indices)
+//{
+//    if (indices.empty())
+//        return IndexResultBlocks();
+//    std::sort(indices.begin(), indices.end());
+
+//    IndexResultBlocks result;
+//    result.push_back(IndexResultBlock(indices.at(0), 1));
+//    const size_t numIndices = indices.size();
+//    for (size_t i = 1; i < numIndices; ++i) {
+//        if (indices.at(i) == indices.at(i-1)+1)
+//            ++result.back().numReads_;
+//        else
+//            result.push_back(IndexResultBlock(indices.at(i), 1));
+//    }
+//    return result;
+//}
+
+//inline IndexResultBlocks mergedIndexBlocks(const IndexList& indices)
+//{
+//    IndexList copy = indices;
+//    return mergedIndexBlocks(std::move(copy));
+//}
+
+//inline size_t nullIndex(void)
+//{ return static_cast<size_t>(-1); }
+
+//inline
+//void pushBackIndices(IndexList& result,
+//                     const IndexList& toAppend)
+//{
+//    result.reserve(result.size() + toAppend.size());
+//    for (auto element : toAppend)
+//        result.push_back(element);
+//}
+
+//// -----------------
+//// OrderedLookup
+//// -----------------
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(void) { }
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(size_t n)
+//{ data_.reserve(n); }
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(const ContainerType& data)
+//    : data_(data)
+//{ }
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(ContainerType&& data)
+//    : data_(std::move(data))
+//{ }
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(const std::vector<T>& rawData)
+//{
+//    const size_t numElements = rawData.size();
+//    for (size_t i = 0; i < numElements; ++i)
+//        data_[ rawData.at(i) ].push_back(i);
+//}
+
+//template<typename T>
+//inline OrderedLookup<T>::OrderedLookup(std::vector<T>&& rawData)
+//{
+//    const size_t numElements = rawData.size();
+//    for (size_t i = 0; i < numElements; ++i)
+//        data_[ rawData.at(i) ].push_back(i);
+//}
+
+//template<typename T>
+//inline bool OrderedLookup<T>::operator==(const OrderedLookup<T>& other) const
+//{ return data_ == other.data_; }
+
+//template<typename T>
+//inline bool OrderedLookup<T>::operator!=(const OrderedLookup<T>& other) const
+//{ return !(*this == other); }
+
+//template<typename T>
+//inline IndexList
+//OrderedLookup<T>::LookupInclusiveRange(const IterType& begin,
+//                                       const IterType& end) const
+//{
+//    IndexList result;
+//    for ( auto iter = begin; iter != end; ++iter )
+//        pushBackIndices(result, iter->second);
+//    std::sort(result.begin(), result.end());
+//    return result;
+//}
+
+//template<typename T>
+//inline IndexList
+//OrderedLookup<T>::LookupExclusiveRange(const IterType& begin,
+//                                       const IterType& end,
+//                                       const KeyType& key) const
+//{
+//    IndexList result;
+//    for ( auto iter = begin; iter != end; ++iter ) {
+//        if (iter->first != key)
+//            pushBackIndices(result, iter->second);
+//    }
+//    std::sort(result.begin(), result.end());
+//    return result;
+//}
+
+//template<typename T>
+//inline IndexList
+//OrderedLookup<T>::LookupIndices(const OrderedLookup::KeyType& key,
+//                                const CompareType& compare) const
+//{
+//    const IterType begin = data_.cbegin();
+//    const IterType end   = data_.cend();
+//    switch(compare)
+//    {
+//        case CompareType::EQUAL:
+//        {
+//            const auto found = data_.find(key);
+//            if (found != end)
+//                return found->second;
+//            return IndexList();
+//        }
+//        case CompareType::LESS_THAN:          return LookupExclusiveRange(begin, data_.upper_bound(key), key);
+//        case CompareType::LESS_THAN_EQUAL:    return LookupInclusiveRange(begin, data_.upper_bound(key));
+//        case CompareType::GREATER_THAN:       return LookupExclusiveRange(data_.lower_bound(key), end, key);
+//        case CompareType::GREATER_THAN_EQUAL: return LookupInclusiveRange(data_.lower_bound(key), end);
+//        case CompareType::NOT_EQUAL:          return LookupExclusiveRange(begin, end, key);
+//        default:
+//            assert(false);
+//    }
+//    return IndexList();
+//}
+
+//// -----------------
+//// UnorderedLookup
+//// -----------------
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(void) { }
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(size_t n)
+//{ data_.reserve(n); }
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(const ContainerType& data)
+//    : data_(data)
+//{ }
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(ContainerType&& data)
+//    : data_(std::move(data))
+//{ }
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(const std::vector<T> &rawData)
+//{
+//    const size_t numElements = rawData.size();
+//    for (size_t i = 0; i < numElements; ++i)
+//        data_[ rawData.at(i) ].push_back(i);
+//}
+
+//template<typename T>
+//inline UnorderedLookup<T>::UnorderedLookup(std::vector<T>&& rawData)
+//{
+//    const size_t numElements = rawData.size();
+//    for (size_t i = 0; i < numElements; ++i)
+//        data_[ rawData.at(i) ].push_back(i);
+//}
+
+//template<typename T>
+//inline bool UnorderedLookup<T>::operator==(const UnorderedLookup<T>& other) const
+//{ return data_ == other.data_; }
+
+//template<typename T>
+//inline bool UnorderedLookup<T>::operator!=(const UnorderedLookup<T>& other) const
+//{ return !(*this == other); }
+
+//template<typename T>
+//template<typename Compare>
+//inline IndexList
+//UnorderedLookup<T>::LookupHelper(const UnorderedLookup::KeyType& key,
+//                                 const Compare& cmp) const
+//{
+//    auto iter = data_.cbegin();
+//    const auto end = data_.cend();
+//    IndexList result; // init with some avg size ??
+//    for ( ; iter != end; ++iter ) {
+//        const auto e = (iter->first);
+//        if (cmp(e, key))
+//            pushBackIndices(result, iter->second);
+//    }
+//    std::sort(result.begin(), result.end());
+//    return result;
+//}
+
+//template<typename T>
+//inline IndexList
+//UnorderedLookup<T>::LookupIndices(const UnorderedLookup::KeyType& key,
+//                                  const CompareType& compare) const
+//{
+//    switch (compare) {
+//        case CompareType::EQUAL:
+//        {
+//            const auto found = data_.find(key);
+//            if (found != data_.cend())
+//                return found->second;
+//            else
+//                return IndexList();
+//        }
+//        case CompareType::LESS_THAN:          return LookupHelper(key, std::less<KeyType>());
+//        case CompareType::LESS_THAN_EQUAL:    return LookupHelper(key, std::less_equal<KeyType>());
+//        case CompareType::GREATER_THAN:       return LookupHelper(key, std::greater<KeyType>());
+//        case CompareType::GREATER_THAN_EQUAL: return LookupHelper(key, std::greater_equal<KeyType>());
+//        case CompareType::NOT_EQUAL:          return LookupHelper(key, std::not_equal_to<KeyType>());
+//        default:
+//            assert(false);
+//    }
+//    return IndexList();
+//}
+
+//// -------------------
+//// SubreadLookupData
+//// -------------------
+
+//inline
+//void SubreadLookupData::ApplyOffsets(IndexResultBlocks& blocks) const
+//{
+//    for (IndexResultBlock& block : blocks)
+//        block.virtualOffset_ = fileOffset_.at(block.firstIndex_);
+//}
+
+//template<typename T>
+//inline IndexList SubreadLookupData::Indices(const SubreadField& field,
+//                                            const T& value,
+//                                            const CompareType& compareType) const
+//{
+//    switch(field) {
+//        case SubreadField::RG_ID:        return rgId_.LookupIndices(value, compareType);
+//        case SubreadField::Q_START:      return qStart_.LookupIndices(value, compareType);
+//        case SubreadField::Q_END:        return qEnd_.LookupIndices(value, compareType);
+//        case SubreadField::ZMW:          return holeNumber_.LookupIndices(value, compareType);
+//        case SubreadField::READ_QUALITY: return readQual_.LookupIndices(value, compareType);
+
+//        case SubreadField::VIRTUAL_OFFSET : // fall-through, not supported this way
+//        default:
+//            assert(false);
+//    }
+//    return IndexList();
+//}
+
+//template<typename T>
+//inline IndexList SubreadLookupData::IndicesMulti(const SubreadField& field,
+//                                                 const std::vector<T>& values) const
+//{
+//    IndexList result;
+//    for (auto value : values) {
+//        const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+//        result.reserve(result.size() + valueIndices.size());
+//        for (auto i : valueIndices)
+//            result.push_back(i);
+//    }
+//    return result;
+//}
+
+//// -------------------
+//// MappedLookupData
+//// -------------------
+
+//template<typename T>
+//inline IndexList MappedLookupData::Indices(const MappedField& field,
+//                                           const T& value,
+//                                           const CompareType& compareType) const
+//{
+//    switch(field) {
+//        case MappedField::T_ID:        return tId_.LookupIndices(value, compareType);
+//        case MappedField::T_START:     return tStart_.LookupIndices(value, compareType);
+//        case MappedField::T_END:       return tEnd_.LookupIndices(value, compareType);
+//        case MappedField::A_START:     return aStart_.LookupIndices(value, compareType);
+//        case MappedField::A_END:       return aEnd_.LookupIndices(value, compareType);
+//        case MappedField::N_M:         return nM_.LookupIndices(value, compareType);
+//        case MappedField::N_MM:        return nM_.LookupIndices(value, compareType);
+//        case MappedField::MAP_QUALITY: return mapQV_.LookupIndices(value, compareType);
+
+//        // MappedField::STRAND has its own specialization
+
+//        default:
+//            assert(false);
+//    }
+//    return IndexList();
+//}
+
+//template<>
+//inline IndexList MappedLookupData::Indices(const MappedField& field,
+//                                           const Strand& strand,
+//                                           const CompareType& compareType) const
+//{
+//    assert(field == MappedField::STRAND);
+
+//    if (compareType == CompareType::EQUAL) {
+//        if (strand == Strand::FORWARD)
+//            return forwardStrand_;
+//        else
+//            return reverseStrand_;
+//    } else if (compareType == CompareType::NOT_EQUAL) {
+//        if (strand == Strand::FORWARD)
+//            return reverseStrand_;
+//        else
+//            return forwardStrand_;
+//    }
+
+//    // only EQUAL/NOT_EQUAL supported
+//    assert(false);
+//    return IndexList();
+//}
+
+//template<typename T>
+//inline IndexList MappedLookupData::IndicesMulti(const MappedField& field,
+//                                                const std::vector<T>& values) const
+//{
+//    IndexList result;
+//    for (auto value : values) {
+//        const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+//        result.reserve(result.size() + valueIndices.size());
+//        for (auto i : valueIndices)
+//            result.push_back(i);
+//    }
+//    return result;
+//}
+
+
+//// ---------------------
+//// ReferenceLookupData
+//// ---------------------
+
+//inline IndexRange ReferenceLookupData::Indices(const int32_t tId) const
+//{
+//    auto found = references_.find(tId);
+//    if (found == references_.cend())
+//        return IndexRange(nullIndex(), nullIndex());
+//    return found->second;
+//}
+
+//// -------------------
+//// BarcodeLookupData
+//// -------------------
+
+//template<typename T>
+//inline IndexList BarcodeLookupData::Indices(const BarcodeField& field,
+//                                            const T& value,
+//                                            const CompareType& compareType) const
+//{
+//    switch(field) {
+//        case BarcodeField::BC_LEFT:      return bcLeft_.LookupIndices(value, compareType);
+//        case BarcodeField::BC_RIGHT:     return bcRight_.LookupIndices(value, compareType);
+//        case BarcodeField::BC_QUALITY:   return bcQual_.LookupIndices(value, compareType);
+//        case BarcodeField::CONTEXT_FLAG: return ctxtFlag_.LookupIndices(value, compareType);
+//        default:
+//            assert(false);
+//    }
+//    return IndexList();
+//}
+
+//template<typename T>
+//inline IndexList BarcodeLookupData::IndicesMulti(const BarcodeField& field,
+//                                                 const std::vector<T>& values) const
+//{
+//    IndexList result;
+//    for (auto value : values) {
+//        const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+//        result.reserve(result.size() + valueIndices.size());
+//        for (auto i : valueIndices)
+//            result.push_back(i);
+//    }
+//    return result;
+//}
+
+
+//// -----------------
+//// PbiIndexPrivate
+//// -----------------
+
+//inline bool PbiIndexPrivate::HasSection(const PbiFile::Section flag) const
+//{ return (sections_ & flag) != 0; }
+
+//inline void PbiIndexPrivate::SetSection(const PbiFile::Section flag, bool ok)
+//{ if (ok) sections_ |= flag; else sections_ &= ~flag; }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::Indices(const SubreadField& field,
+//                         const T& value,
+//                         const CompareType& compareType) const
+//{ return subreadData_.Indices(field, value, compareType); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::Indices(const MappedField& field,
+//                         const T& value,
+//                         const CompareType& compareType) const
+//{ return mappedData_.Indices(field, value, compareType); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::Indices(const BarcodeField& field,
+//                         const T& value,
+//                         const CompareType& compareType) const
+//{ return barcodeData_.Indices(field, value, compareType); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::IndicesMulti(const SubreadField& field,
+//                              const T& value) const
+//{ return subreadData_.IndicesMulti(field, value); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::IndicesMulti(const MappedField& field,
+//                              const T& value) const
+//{ return mappedData_.IndicesMulti(field, value); }
+
+//template<typename T>
+//inline IndexList
+//PbiIndexPrivate::IndicesMulti(const BarcodeField& field,
+//                              const T& value) const
+//{ return barcodeData_.IndicesMulti(field, value); }
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::Lookup(const SubreadField& field,
+//                        const T& value,
+//                        const CompareType& compareType) const
+//{ return MergeBlocksWithOffsets(subreadData_.Indices(field, value, compareType)); }
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::Lookup(const MappedField& field,
+//                        const T& value,
+//                        const CompareType& compareType) const
+//{
+//    if (!HasSection(PbiFile::MAPPED))
+//        return IndexResultBlocks();
+//    return MergeBlocksWithOffsets(mappedData_.Indices(field, value, compareType));
+//}
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::Lookup(const BarcodeField& field,
+//                        const T& value,
+//                        const CompareType& compareType) const
+//{
+//    if (!HasSection(PbiFile::BARCODE))
+//        return IndexResultBlocks();
+//    return MergeBlocksWithOffsets(barcodeData_.Indices(field, value, compareType));
+//}
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::LookupMulti(const SubreadField& field,
+//                             const std::vector<T>& values) const
+//{ return MergeBlocksWithOffsets(subreadData_.IndicesMulti(field, values)); }
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::LookupMulti(const MappedField& field,
+//                             const std::vector<T>& values) const
+//{ return MergeBlocksWithOffsets(mappedData_.IndicesMulti(field, values)); }
+
+//template<typename T>
+//inline IndexResultBlocks
+//PbiIndexPrivate::LookupMulti(const BarcodeField& field,
+//                             const std::vector<T>& values) const
+//{ return MergeBlocksWithOffsets(barcodeData_.IndicesMulti(field, values)); }
+
+//inline IndexResultBlocks
+//PbiIndexPrivate::LookupReference(const int32_t tId) const
+//{
+//    if (!HasSection(PbiFile::REFERENCE))
+//        return IndexResultBlocks();
+//    const IndexRange& indexRange = referenceData_.Indices(tId);
+//    if (indexRange.first == nullIndex() && indexRange.second == nullIndex())
+//        return IndexResultBlocks();
+//    const size_t numReads = indexRange.second - indexRange.first;
+//    IndexResultBlocks blocks(1, IndexResultBlock(indexRange.first, numReads));
+//    subreadData_.ApplyOffsets(blocks);
+//    return blocks;
+//}
+
+//inline IndexResultBlocks
+//PbiIndexPrivate::MergeBlocksWithOffsets(const IndexList& indices) const
+//{
+//    IndexResultBlocks blocks = mergedIndexBlocks(indices);
+//    subreadData_.ApplyOffsets(blocks);
+//    return blocks;
+//}
+
+//} // namespace internal
+
+//template<typename FieldType, typename ValueType>
+//inline IndexRequestBase<FieldType, ValueType>::IndexRequestBase(const FieldType field,
+//                                                                const ValueType& value,
+//                                                                const CompareType compareType)
+//    : field_(field)
+//    , value_(value)
+//    , compareType_(compareType)
+//{ }
+
+//template<typename FieldType, typename ValueType>
+//inline IndexMultiRequestBase<FieldType, ValueType>::IndexMultiRequestBase(const FieldType field,
+//                                                                          const std::vector<ValueType>& values)
+//    : field_(field)
+//    , values_(values)
+//{ }
+
+//template<SubreadField field, typename ValueType>
+//inline SubreadIndexRequest<field, ValueType>::SubreadIndexRequest(const ValueType& value,
+//                                                                  const CompareType& compareType)
+//    : IndexRequestBase<SubreadField, ValueType>(field, value, compareType)
+//{ }
+
+//template<SubreadField field, typename ValueType>
+//inline SubreadIndexMultiRequest<field, ValueType>::SubreadIndexMultiRequest(const std::vector<ValueType>& values)
+//    : IndexMultiRequestBase<SubreadField, ValueType>(field, values)
+//{ }
+
+//template<MappedField field, typename ValueType>
+//inline MappedIndexRequest<field, ValueType>::MappedIndexRequest(const ValueType& value,
+//                                                                const CompareType& compareType)
+//    : IndexRequestBase<MappedField, ValueType>(field, value, compareType)
+//{ }
+
+//template<MappedField field, typename ValueType>
+//inline MappedIndexMultiRequest<field, ValueType>::MappedIndexMultiRequest(const std::vector<ValueType>& values)
+//    : IndexMultiRequestBase<MappedField, ValueType>(field, values)
+//{ }
+
+//template<BarcodeField field, typename ValueType>
+//inline BarcodeIndexRequest<field, ValueType>::BarcodeIndexRequest(const ValueType& value,
+//                                                                  const CompareType& compareType)
+//    : IndexRequestBase<BarcodeField, ValueType>(field, value, compareType)
+//{ }
+
+//template<BarcodeField field, typename ValueType>
+//inline BarcodeIndexMultiRequest<field, ValueType>::BarcodeIndexMultiRequest(const std::vector<ValueType>& values)
+//    : IndexMultiRequestBase<BarcodeField, ValueType>(field, values)
+//{ }
+
+//template <typename FieldType, typename ValueType>
+//inline IndexList
+//PbiIndex::RawIndices(const IndexRequestBase<FieldType, ValueType>& request) const
+//{ return d_->Indices(request.field_, request.value_, request.compareType_); }
+
+//template <typename FieldType, typename ValueType>
+//inline IndexList
+//PbiIndex::RawIndices(const IndexMultiRequestBase<FieldType, ValueType>& request) const
+//{ return d_->Indices(request.field_, request.values_); }
+
+//template <typename FieldType, typename ValueType>
+//inline IndexResultBlocks
+//PbiIndex::Lookup(const IndexRequestBase<FieldType, ValueType>& request) const
+//{ return d_->Lookup(request.field_, request.value_, request.compareType_); }
+
+//template <typename FieldType, typename ValueType>
+//inline IndexResultBlocks
+//PbiIndex::Lookup(const IndexMultiRequestBase<FieldType, ValueType>& request) const
+//{ return d_->LookupMulti(request.field_, request.values_); }
+
+//inline IndexResultBlocks PbiIndex::LookupReference(const int32_t tId) const
+//{ return d_->LookupReference(tId); }
+
+//} // namespace BAM
+//} // namespace PacBio
+
+//#endif // PACBIOINDEX_P_H
diff --git a/include/pbbam/internal/PbiIndex_p.inl b/include/pbbam/internal/PbiIndex_p.inl
new file mode 100644
index 0000000..41dc831
--- /dev/null
+++ b/include/pbbam/internal/PbiIndex_p.inl
@@ -0,0 +1,927 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/PbiFile.h"
+#include "pbbam/PbiIndex.h"
+#include "pbbam/PbiRawData.h"
+
+#include <algorithm>
+#include <map>
+#include <memory>
+#include <unordered_map>
+#include <utility>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// --------------------------
+// Ordered Lookup Container (e.g. map)
+// --------------------------
+
+template<typename T>
+class OrderedLookup
+{
+public:
+    typedef T         KeyType;
+    typedef IndexList ValueType;
+    typedef std::map<KeyType, ValueType> ContainerType;
+    typedef typename ContainerType::const_iterator IterType;
+
+public:
+    OrderedLookup(void);
+    OrderedLookup(size_t n);
+    OrderedLookup(const ContainerType& data);
+    OrderedLookup(ContainerType&& data);
+    OrderedLookup(const std::vector<T>& rawData);
+    OrderedLookup(std::vector<T>&& rawData);
+
+public:
+    bool operator==(const OrderedLookup<T>& other) const;
+    bool operator!=(const OrderedLookup<T>& other) const;
+
+public:
+    IndexList LookupIndices(const KeyType& key,
+                            const CompareType& compare) const;
+
+private:
+    IndexList LookupInclusiveRange(const IterType& begin,
+                                   const IterType& end) const;
+
+    IndexList LookupExclusiveRange(const IterType& begin,
+                                   const IterType& end,
+                                   const KeyType& key) const;
+
+private:
+    ContainerType data_;
+};
+
+// --------------------------
+// Unordered Lookup Container (e.g. hash)
+// --------------------------
+
+template<typename T>
+class UnorderedLookup
+{
+public:
+    typedef T         KeyType;
+    typedef IndexList ValueType;
+    typedef std::unordered_map<KeyType, ValueType> ContainerType;
+
+public:
+    UnorderedLookup(void);
+    UnorderedLookup(size_t n);
+    UnorderedLookup(const ContainerType& data);
+    UnorderedLookup(ContainerType&& data);
+    UnorderedLookup(const std::vector<T>& rawData);
+    UnorderedLookup(std::vector<T>&& rawData);
+
+public:
+    bool operator==(const UnorderedLookup<T>& other) const;
+    bool operator!=(const UnorderedLookup<T>& other) const;
+
+public:
+    IndexList LookupIndices(const KeyType& key,
+                            const CompareType& compare) const;
+
+private:
+    template<typename Compare>
+    IndexList LookupHelper(const KeyType& key, const Compare& cmp) const;
+
+private:
+    ContainerType data_;
+};
+
+// ----------------
+// Subread Data
+// ----------------
+
+struct SubreadLookupData
+{
+    // ctors
+    SubreadLookupData(void);
+    SubreadLookupData(const PbiRawSubreadData& rawData);
+//    SubreadLookupData(PbiRawSubreadData&& rawData);
+
+    // add offset data to index result blocks
+    void ApplyOffsets(IndexResultBlocks& blocks) const;
+
+    template<typename T>
+    IndexList Indices(const SubreadField& field,
+                      const T& value,
+                      const CompareType& compareType) const;
+
+    template<typename T>
+    IndexList IndicesMulti(const SubreadField& field,
+                           const std::vector<T>& values) const;
+
+    // map ordering doesn't make sense, optimize for direct lookup
+    UnorderedLookup<int32_t> rgId_;
+
+    // numeric comparisons make sense, keep key ordering preserved
+    OrderedLookup<int32_t>  qStart_;
+    OrderedLookup<int32_t>  qEnd_;
+    OrderedLookup<int32_t>  holeNumber_;
+    OrderedLookup<uint16_t> readQual_;
+
+    // offsets
+    std::vector<int64_t> fileOffset_;
+};
+
+// -----------------
+// Mapped Data
+// -----------------
+
+struct MappedLookupData
+{
+    // ctors
+    MappedLookupData(void);
+    MappedLookupData(const PbiRawMappedData& rawData);
+//    MappedLookupData(PbiRawMappedData&& rawData);
+
+    template<typename T>
+    IndexList Indices(const MappedField& field,
+                      const T& value,
+                      const CompareType& compareType) const;
+
+    template<typename T>
+    IndexList IndicesMulti(const MappedField& field,
+                           const std::vector<T>& values) const;
+
+    // numeric comparisons make sense, keep key ordering preserved
+    OrderedLookup<int32_t>  tId_;
+    OrderedLookup<uint32_t> tStart_;
+    OrderedLookup<uint32_t> tEnd_;
+    OrderedLookup<uint32_t> aStart_;
+    OrderedLookup<uint32_t> aEnd_;
+    OrderedLookup<uint32_t> nM_;
+    OrderedLookup<uint32_t> nMM_;
+    OrderedLookup<uint8_t>  mapQV_;
+
+    // generated, not stored in PBI
+    OrderedLookup<uint32_t> nIns_;
+    OrderedLookup<uint32_t> nDel_;
+
+    // no need for map overhead, just store direct indices
+    IndexList reverseStrand_;
+    IndexList forwardStrand_;
+};
+
+// ------------------
+// Reference Data
+// ------------------
+
+struct ReferenceLookupData
+{
+    // ctors
+    ReferenceLookupData(void);
+    ReferenceLookupData(const PbiRawReferenceData& rawData);
+//    ReferenceLookupData(PbiRawReferenceData&& rawData);
+
+    IndexRange Indices(const int32_t tId) const;
+
+    // references_[tId] = (begin, end) indices
+    // into SubreadLookupData::fileOffset_
+    std::unordered_map<int32_t, IndexRange> references_;
+};
+
+// ---------------
+// Barcode Data
+// ---------------
+
+struct BarcodeLookupData
+{
+    // ctors
+    BarcodeLookupData(void);
+    BarcodeLookupData(const PbiRawBarcodeData& rawData);
+//    BarcodeLookupData(PbiRawBarcodeData&& rawData);
+
+    template<typename T>
+    IndexList Indices(const BarcodeField& field,
+                      const T& value,
+                      const CompareType& compareType) const;
+
+    template<typename T>
+    IndexList IndicesMulti(const BarcodeField& field,
+                           const std::vector<T>& values) const;
+
+    // numeric comparisons make sense, keep key ordering preserved
+    OrderedLookup<uint16_t> bcLeft_;
+    OrderedLookup<uint16_t> bcRight_;
+    OrderedLookup<uint8_t>  bcQual_;
+
+    // see if this works, or if can use unordered, 'direct' query
+    OrderedLookup<uint8_t> ctxtFlag_;
+};
+
+// --------------------------
+// Pbi Lookup Aggregate
+// --------------------------
+
+class PbiIndexPrivate
+{
+public:
+    PbiIndexPrivate(void);
+    PbiIndexPrivate(const PbiRawData& rawIndex);
+    PbiIndexPrivate(PbiRawData&& rawIndex);
+
+    std::unique_ptr<PbiIndexPrivate> DeepCopy(void) const;
+
+public:
+    bool HasSection(const PbiFile::Section flag) const;
+    void SetSection(const PbiFile::Section flag, bool ok = true);
+
+public:
+
+    template<typename T>
+    IndexList Indices(const SubreadField& field,
+                      const T& value,
+                      const CompareType& compareType) const;
+
+    template<typename T>
+    IndexList Indices(const MappedField& field,
+                      const T& value,
+                      const CompareType& compareType) const;
+
+    template<typename T>
+    IndexList Indices(const BarcodeField& field,
+                      const T& value,
+                      const CompareType& compareType) const;
+
+    template<typename T>
+    IndexList IndicesMulti(const SubreadField& field,
+                           const T& value) const;
+
+    template<typename T>
+    IndexList IndicesMulti(const MappedField& field,
+                           const T& value) const;
+
+    template<typename T>
+    IndexList IndicesMulti(const BarcodeField& field,
+                           const T& value) const;
+
+    template<typename T>
+    IndexResultBlocks Lookup(const SubreadField& field,
+                             const T& value,
+                             const CompareType& compareType) const;
+
+    template<typename T>
+    IndexResultBlocks Lookup(const MappedField& field,
+                             const T& value,
+                             const CompareType& compareType) const;
+
+    template<typename T>
+    IndexResultBlocks Lookup(const BarcodeField& field,
+                             const T& value,
+                             const CompareType& compareType) const;
+
+    template<typename T>
+    IndexResultBlocks LookupMulti(const SubreadField& field,
+                                  const std::vector<T>& values) const;
+
+    template<typename T>
+    IndexResultBlocks LookupMulti(const MappedField& field,
+                                  const std::vector<T>& values) const;
+
+    template<typename T>
+    IndexResultBlocks LookupMulti(const BarcodeField& field,
+                                  const std::vector<T>& values) const;
+
+    IndexResultBlocks LookupReference(const int32_t tId) const;
+
+private:
+    IndexResultBlocks MergeBlocksWithOffsets(const IndexList& indices) const;
+
+public:
+    PbiFile::VersionEnum version_;
+    PbiFile::Sections sections_;
+    uint32_t numReads_;
+
+    // lookup structures
+    SubreadLookupData   subreadData_;
+    MappedLookupData    mappedData_;
+    ReferenceLookupData referenceData_;
+    BarcodeLookupData   barcodeData_;
+
+private:
+    // not-implemented - ensure no copy
+    PbiIndexPrivate(const PbiIndexPrivate& other);
+    PbiIndexPrivate& operator=(const PbiIndexPrivate& other);
+};
+
+// ----------------
+// helper methods
+// ----------------
+
+inline IndexResultBlocks mergedIndexBlocks(IndexList&& indices)
+{
+    if (indices.empty())
+        return IndexResultBlocks();
+    std::sort(indices.begin(), indices.end());
+
+    IndexResultBlocks result;
+    result.push_back(IndexResultBlock(indices.at(0), 1));
+    const size_t numIndices = indices.size();
+    for (size_t i = 1; i < numIndices; ++i) {
+        if (indices.at(i) == indices.at(i-1)+1)
+            ++result.back().numReads_;
+        else
+            result.push_back(IndexResultBlock(indices.at(i), 1));
+    }
+    return result;
+}
+
+inline IndexResultBlocks mergedIndexBlocks(const IndexList& indices)
+{
+    IndexList copy = indices;
+    return mergedIndexBlocks(std::move(copy));
+}
+
+inline size_t nullIndex(void)
+{ return static_cast<size_t>(-1); }
+
+inline
+void pushBackIndices(IndexList& result,
+                     const IndexList& toAppend)
+{
+    result.reserve(result.size() + toAppend.size());
+    for (auto element : toAppend)
+        result.push_back(element);
+}
+
+// -----------------
+// OrderedLookup
+// -----------------
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(void) { }
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(size_t n)
+{ data_.reserve(n); }
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(const ContainerType& data)
+    : data_(data)
+{ }
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(ContainerType&& data)
+    : data_(std::move(data))
+{ }
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(const std::vector<T>& rawData)
+{
+    const size_t numElements = rawData.size();
+    for (size_t i = 0; i < numElements; ++i)
+        data_[ rawData.at(i) ].push_back(i);
+}
+
+template<typename T>
+inline OrderedLookup<T>::OrderedLookup(std::vector<T>&& rawData)
+{
+    const size_t numElements = rawData.size();
+    for (size_t i = 0; i < numElements; ++i)
+        data_[ rawData.at(i) ].push_back(i);
+}
+
+template<typename T>
+inline bool OrderedLookup<T>::operator==(const OrderedLookup<T>& other) const
+{ return data_ == other.data_; }
+
+template<typename T>
+inline bool OrderedLookup<T>::operator!=(const OrderedLookup<T>& other) const
+{ return !(*this == other); }
+
+template<typename T>
+inline IndexList
+OrderedLookup<T>::LookupInclusiveRange(const IterType& begin,
+                                       const IterType& end) const
+{
+    IndexList result;
+    for ( auto iter = begin; iter != end; ++iter )
+        pushBackIndices(result, iter->second);
+    std::sort(result.begin(), result.end());
+    return result;
+}
+
+template<typename T>
+inline IndexList
+OrderedLookup<T>::LookupExclusiveRange(const IterType& begin,
+                                       const IterType& end,
+                                       const KeyType& key) const
+{
+    IndexList result;
+    for ( auto iter = begin; iter != end; ++iter ) {
+        if (iter->first != key)
+            pushBackIndices(result, iter->second);
+    }
+    std::sort(result.begin(), result.end());
+    return result;
+}
+
+template<typename T>
+inline IndexList
+OrderedLookup<T>::LookupIndices(const OrderedLookup::KeyType& key,
+                                const CompareType& compare) const
+{
+    const IterType begin = data_.cbegin();
+    const IterType end   = data_.cend();
+    switch(compare)
+    {
+        case CompareType::EQUAL:
+        {
+            const auto found = data_.find(key);
+            if (found != end)
+                return found->second;
+            return IndexList();
+        }
+        case CompareType::LESS_THAN:          return LookupExclusiveRange(begin, data_.upper_bound(key), key);
+        case CompareType::LESS_THAN_EQUAL:    return LookupInclusiveRange(begin, data_.upper_bound(key));
+        case CompareType::GREATER_THAN:       return LookupExclusiveRange(data_.lower_bound(key), end, key);
+        case CompareType::GREATER_THAN_EQUAL: return LookupInclusiveRange(data_.lower_bound(key), end);
+        case CompareType::NOT_EQUAL:          return LookupExclusiveRange(begin, end, key);
+        default:
+            assert(false);
+    }
+    return IndexList();
+}
+
+// -----------------
+// UnorderedLookup
+// -----------------
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(void) { }
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(size_t n)
+{ data_.reserve(n); }
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(const ContainerType& data)
+    : data_(data)
+{ }
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(ContainerType&& data)
+    : data_(std::move(data))
+{ }
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(const std::vector<T> &rawData)
+{
+    const size_t numElements = rawData.size();
+    for (size_t i = 0; i < numElements; ++i)
+        data_[ rawData.at(i) ].push_back(i);
+}
+
+template<typename T>
+inline UnorderedLookup<T>::UnorderedLookup(std::vector<T>&& rawData)
+{
+    const size_t numElements = rawData.size();
+    for (size_t i = 0; i < numElements; ++i)
+        data_[ rawData.at(i) ].push_back(i);
+}
+
+template<typename T>
+inline bool UnorderedLookup<T>::operator==(const UnorderedLookup<T>& other) const
+{ return data_ == other.data_; }
+
+template<typename T>
+inline bool UnorderedLookup<T>::operator!=(const UnorderedLookup<T>& other) const
+{ return !(*this == other); }
+
+template<typename T>
+template<typename Compare>
+inline IndexList
+UnorderedLookup<T>::LookupHelper(const UnorderedLookup::KeyType& key,
+                                 const Compare& cmp) const
+{
+    auto iter = data_.cbegin();
+    const auto end = data_.cend();
+    IndexList result; // init with some avg size ??
+    for ( ; iter != end; ++iter ) {
+        const auto e = (iter->first);
+        if (cmp(e, key))
+            pushBackIndices(result, iter->second);
+    }
+    std::sort(result.begin(), result.end());
+    return result;
+}
+
+template<typename T>
+inline IndexList
+UnorderedLookup<T>::LookupIndices(const UnorderedLookup::KeyType& key,
+                                  const CompareType& compare) const
+{
+    switch (compare) {
+        case CompareType::EQUAL:
+        {
+            const auto found = data_.find(key);
+            if (found != data_.cend())
+                return found->second;
+            else
+                return IndexList();
+        }
+        case CompareType::LESS_THAN:          return LookupHelper(key, std::less<KeyType>());
+        case CompareType::LESS_THAN_EQUAL:    return LookupHelper(key, std::less_equal<KeyType>());
+        case CompareType::GREATER_THAN:       return LookupHelper(key, std::greater<KeyType>());
+        case CompareType::GREATER_THAN_EQUAL: return LookupHelper(key, std::greater_equal<KeyType>());
+        case CompareType::NOT_EQUAL:          return LookupHelper(key, std::not_equal_to<KeyType>());
+        default:
+            assert(false);
+    }
+    return IndexList();
+}
+
+// -------------------
+// SubreadLookupData
+// -------------------
+
+inline
+void SubreadLookupData::ApplyOffsets(IndexResultBlocks& blocks) const
+{
+    for (IndexResultBlock& block : blocks)
+        block.virtualOffset_ = fileOffset_.at(block.firstIndex_);
+}
+
+template<typename T>
+inline IndexList SubreadLookupData::Indices(const SubreadField& field,
+                                            const T& value,
+                                            const CompareType& compareType) const
+{
+    switch(field) {
+        case SubreadField::RG_ID:        return rgId_.LookupIndices(value, compareType);
+        case SubreadField::Q_START:      return qStart_.LookupIndices(value, compareType);
+        case SubreadField::Q_END:        return qEnd_.LookupIndices(value, compareType);
+        case SubreadField::ZMW:          return holeNumber_.LookupIndices(value, compareType);
+        case SubreadField::READ_QUALITY: return readQual_.LookupIndices(value, compareType);
+
+        case SubreadField::VIRTUAL_OFFSET : // fall-through, not supported this way
+        default:
+            assert(false);
+    }
+    return IndexList();
+}
+
+template<typename T>
+inline IndexList SubreadLookupData::IndicesMulti(const SubreadField& field,
+                                                 const std::vector<T>& values) const
+{
+    IndexList result;
+    for (auto value : values) {
+        const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+        result.reserve(result.size() + valueIndices.size());
+        for (auto i : valueIndices)
+            result.push_back(i);
+    }
+    return result;
+}
+
+// -------------------
+// MappedLookupData
+// -------------------
+
+template<typename T>
+inline IndexList MappedLookupData::Indices(const MappedField& field,
+                                           const T& value,
+                                           const CompareType& compareType) const
+{
+    switch(field) {
+        case MappedField::T_ID:        return tId_.LookupIndices(value, compareType);
+        case MappedField::T_START:     return tStart_.LookupIndices(value, compareType);
+        case MappedField::T_END:       return tEnd_.LookupIndices(value, compareType);
+        case MappedField::A_START:     return aStart_.LookupIndices(value, compareType);
+        case MappedField::A_END:       return aEnd_.LookupIndices(value, compareType);
+        case MappedField::N_M:         return nM_.LookupIndices(value, compareType);
+        case MappedField::N_MM:        return nM_.LookupIndices(value, compareType);
+        case MappedField::MAP_QUALITY: return mapQV_.LookupIndices(value, compareType);
+
+        // MappedField::STRAND has its own specialization
+
+        default:
+            assert(false);
+    }
+    return IndexList();
+}
+
+template<>
+inline IndexList MappedLookupData::Indices(const MappedField& field,
+                                           const Strand& strand,
+                                           const CompareType& compareType) const
+{
+    assert(field == MappedField::STRAND);
+
+    if (compareType == CompareType::EQUAL) {
+        if (strand == Strand::FORWARD)
+            return forwardStrand_;
+        else
+            return reverseStrand_;
+    } else if (compareType == CompareType::NOT_EQUAL) {
+        if (strand == Strand::FORWARD)
+            return reverseStrand_;
+        else
+            return forwardStrand_;
+    }
+
+    // only EQUAL/NOT_EQUAL supported
+    assert(false);
+    return IndexList();
+}
+
+template<typename T>
+inline IndexList MappedLookupData::IndicesMulti(const MappedField& field,
+                                                const std::vector<T>& values) const
+{
+    IndexList result;
+    for (auto value : values) {
+        const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+        result.reserve(result.size() + valueIndices.size());
+        for (auto i : valueIndices)
+            result.push_back(i);
+    }
+    return result;
+}
+
+
+// ---------------------
+// ReferenceLookupData
+// ---------------------
+
+inline IndexRange ReferenceLookupData::Indices(const int32_t tId) const
+{
+    auto found = references_.find(tId);
+    if (found == references_.cend())
+        return IndexRange(nullIndex(), nullIndex());
+    return found->second;
+}
+
+// -------------------
+// BarcodeLookupData
+// -------------------
+
+template<typename T>
+inline IndexList BarcodeLookupData::Indices(const BarcodeField& field,
+                                            const T& value,
+                                            const CompareType& compareType) const
+{
+    switch(field) {
+        case BarcodeField::BC_LEFT:      return bcLeft_.LookupIndices(value, compareType);
+        case BarcodeField::BC_RIGHT:     return bcRight_.LookupIndices(value, compareType);
+        case BarcodeField::BC_QUALITY:   return bcQual_.LookupIndices(value, compareType);
+        case BarcodeField::CONTEXT_FLAG: return ctxtFlag_.LookupIndices(value, compareType);
+        default:
+            assert(false);
+    }
+    return IndexList();
+}
+
+template<typename T>
+inline IndexList BarcodeLookupData::IndicesMulti(const BarcodeField& field,
+                                                 const std::vector<T>& values) const
+{
+    IndexList result;
+    for (auto value : values) {
+        const IndexList& valueIndices = Indices(field, value, CompareType::EQUAL);
+        result.reserve(result.size() + valueIndices.size());
+        for (auto i : valueIndices)
+            result.push_back(i);
+    }
+    return result;
+}
+
+
+// -----------------
+// PbiIndexPrivate
+// -----------------
+
+inline bool PbiIndexPrivate::HasSection(const PbiFile::Section flag) const
+{ return (sections_ & flag) != 0; }
+
+inline void PbiIndexPrivate::SetSection(const PbiFile::Section flag, bool ok)
+{ if (ok) sections_ |= flag; else sections_ &= ~flag; }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::Indices(const SubreadField& field,
+                         const T& value,
+                         const CompareType& compareType) const
+{ return subreadData_.Indices(field, value, compareType); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::Indices(const MappedField& field,
+                         const T& value,
+                         const CompareType& compareType) const
+{ return mappedData_.Indices(field, value, compareType); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::Indices(const BarcodeField& field,
+                         const T& value,
+                         const CompareType& compareType) const
+{ return barcodeData_.Indices(field, value, compareType); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::IndicesMulti(const SubreadField& field,
+                              const T& value) const
+{ return subreadData_.IndicesMulti(field, value); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::IndicesMulti(const MappedField& field,
+                              const T& value) const
+{ return mappedData_.IndicesMulti(field, value); }
+
+template<typename T>
+inline IndexList
+PbiIndexPrivate::IndicesMulti(const BarcodeField& field,
+                              const T& value) const
+{ return barcodeData_.IndicesMulti(field, value); }
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::Lookup(const SubreadField& field,
+                        const T& value,
+                        const CompareType& compareType) const
+{ return MergeBlocksWithOffsets(subreadData_.Indices(field, value, compareType)); }
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::Lookup(const MappedField& field,
+                        const T& value,
+                        const CompareType& compareType) const
+{
+    if (!HasSection(PbiFile::MAPPED))
+        return IndexResultBlocks();
+    return MergeBlocksWithOffsets(mappedData_.Indices(field, value, compareType));
+}
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::Lookup(const BarcodeField& field,
+                        const T& value,
+                        const CompareType& compareType) const
+{
+    if (!HasSection(PbiFile::BARCODE))
+        return IndexResultBlocks();
+    return MergeBlocksWithOffsets(barcodeData_.Indices(field, value, compareType));
+}
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::LookupMulti(const SubreadField& field,
+                             const std::vector<T>& values) const
+{ return MergeBlocksWithOffsets(subreadData_.IndicesMulti(field, values)); }
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::LookupMulti(const MappedField& field,
+                             const std::vector<T>& values) const
+{ return MergeBlocksWithOffsets(mappedData_.IndicesMulti(field, values)); }
+
+template<typename T>
+inline IndexResultBlocks
+PbiIndexPrivate::LookupMulti(const BarcodeField& field,
+                             const std::vector<T>& values) const
+{ return MergeBlocksWithOffsets(barcodeData_.IndicesMulti(field, values)); }
+
+inline IndexResultBlocks
+PbiIndexPrivate::LookupReference(const int32_t tId) const
+{
+    if (!HasSection(PbiFile::REFERENCE))
+        return IndexResultBlocks();
+    const IndexRange& indexRange = referenceData_.Indices(tId);
+    if (indexRange.first == nullIndex() && indexRange.second == nullIndex())
+        return IndexResultBlocks();
+    const size_t numReads = indexRange.second - indexRange.first;
+    IndexResultBlocks blocks(1, IndexResultBlock(indexRange.first, numReads));
+    subreadData_.ApplyOffsets(blocks);
+    return blocks;
+}
+
+inline IndexResultBlocks
+PbiIndexPrivate::MergeBlocksWithOffsets(const IndexList& indices) const
+{
+    IndexResultBlocks blocks = mergedIndexBlocks(indices);
+    subreadData_.ApplyOffsets(blocks);
+    return blocks;
+}
+
+} // namespace internal
+
+template<typename FieldType, typename ValueType>
+inline IndexRequestBase<FieldType, ValueType>::IndexRequestBase(const FieldType field,
+                                                                const ValueType& value,
+                                                                const CompareType compareType)
+    : field_(field)
+    , value_(value)
+    , compareType_(compareType)
+{ }
+
+template<typename FieldType, typename ValueType>
+inline IndexMultiRequestBase<FieldType, ValueType>::IndexMultiRequestBase(const FieldType field,
+                                                                          const std::vector<ValueType>& values)
+    : field_(field)
+    , values_(values)
+{ }
+
+template<SubreadField field, typename ValueType>
+inline SubreadIndexRequest<field, ValueType>::SubreadIndexRequest(const ValueType& value,
+                                                                  const CompareType& compareType)
+    : IndexRequestBase<SubreadField, ValueType>(field, value, compareType)
+{ }
+
+template<SubreadField field, typename ValueType>
+inline SubreadIndexMultiRequest<field, ValueType>::SubreadIndexMultiRequest(const std::vector<ValueType>& values)
+    : IndexMultiRequestBase<SubreadField, ValueType>(field, values)
+{ }
+
+template<MappedField field, typename ValueType>
+inline MappedIndexRequest<field, ValueType>::MappedIndexRequest(const ValueType& value,
+                                                                const CompareType& compareType)
+    : IndexRequestBase<MappedField, ValueType>(field, value, compareType)
+{ }
+
+template<MappedField field, typename ValueType>
+inline MappedIndexMultiRequest<field, ValueType>::MappedIndexMultiRequest(const std::vector<ValueType>& values)
+    : IndexMultiRequestBase<MappedField, ValueType>(field, values)
+{ }
+
+template<BarcodeField field, typename ValueType>
+inline BarcodeIndexRequest<field, ValueType>::BarcodeIndexRequest(const ValueType& value,
+                                                                  const CompareType& compareType)
+    : IndexRequestBase<BarcodeField, ValueType>(field, value, compareType)
+{ }
+
+template<BarcodeField field, typename ValueType>
+inline BarcodeIndexMultiRequest<field, ValueType>::BarcodeIndexMultiRequest(const std::vector<ValueType>& values)
+    : IndexMultiRequestBase<BarcodeField, ValueType>(field, values)
+{ }
+
+template <typename FieldType, typename ValueType>
+inline IndexList
+PbiIndex::RawIndices(const IndexRequestBase<FieldType, ValueType>& request) const
+{ return d_->Indices(request.field_, request.value_, request.compareType_); }
+
+template <typename FieldType, typename ValueType>
+inline IndexList
+PbiIndex::RawIndices(const IndexMultiRequestBase<FieldType, ValueType>& request) const
+{ return d_->Indices(request.field_, request.values_); }
+
+template <typename FieldType, typename ValueType>
+inline IndexResultBlocks
+PbiIndex::Lookup(const IndexRequestBase<FieldType, ValueType>& request) const
+{ return d_->Lookup(request.field_, request.value_, request.compareType_); }
+
+template <typename FieldType, typename ValueType>
+inline IndexResultBlocks
+PbiIndex::Lookup(const IndexMultiRequestBase<FieldType, ValueType>& request) const
+{ return d_->LookupMulti(request.field_, request.values_); }
+
+inline IndexResultBlocks PbiIndex::LookupReference(const int32_t tId) const
+{ return d_->LookupReference(tId); }
+
+} // namespace BAM
+} // namespace PacBio
+
diff --git a/include/pbbam/internal/QueryBase.h b/include/pbbam/internal/QueryBase.h
new file mode 100644
index 0000000..7c16f87
--- /dev/null
+++ b/include/pbbam/internal/QueryBase.h
@@ -0,0 +1,218 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef QUERYBASE2_H
+#define QUERYBASE2_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/DataSet.h"
+#include "pbbam/internal/FilterEngine.h"
+#include "pbbam/internal/IBamFileIterator.h"
+#include "pbbam/internal/IMergeStrategy.h"
+#include <memory>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+class QueryBase;
+
+template<typename T>
+class QueryIteratorBase
+{
+protected:
+    QueryIteratorBase(void);
+    QueryIteratorBase(QueryBase<T>& query);
+
+public:
+    virtual ~QueryIteratorBase(void) { }
+
+protected:
+    void ReadNext(void);
+
+public:
+    bool operator==(const QueryIteratorBase<T>& other) const
+    { return query_ == other.query_; }
+
+    bool operator!=(const QueryIteratorBase<T>& other) const
+    { return !(*this == other); }
+
+protected:
+    QueryBase<T>* query_;
+    T record_;
+};
+
+template<typename T>
+class QueryIterator : public QueryIteratorBase<T>
+{
+public:
+    QueryIterator(void) : QueryIteratorBase<T>() { }
+    QueryIterator(QueryBase<T>& query)
+        : QueryIteratorBase<T>(query)
+    { }
+
+    T& operator*(void) { return QueryIteratorBase<T>::record_; }
+    T* operator->(void) { return &(operator*()); }
+
+    QueryIterator<T>& operator++(void)
+    { QueryIteratorBase<T>::ReadNext(); return *this; }
+
+    QueryIterator<T> operator++(int)
+    {
+        QueryIterator<T> result(*this);
+        ++(*this);
+        return result;
+    }
+};
+
+template<typename T>
+class QueryConstIterator : public QueryIteratorBase<T>
+{
+public:
+    QueryConstIterator(void) : QueryIteratorBase<T>() { }
+    QueryConstIterator(const QueryBase<T>& query)
+        : QueryIteratorBase<T>(const_cast<QueryBase<T>&>(query))
+    { }
+
+    const T& operator*(void) const { return QueryIteratorBase<T>::record_; }
+    const T* operator->(void) const { return &(operator*()); }
+
+    QueryConstIterator<T>& operator++(void)
+    { QueryIteratorBase<T>::ReadNext(); return *this; }
+
+    QueryConstIterator<T> operator++(int)
+    {
+        QueryConstIterator<T> result(*this);
+        ++(*this);
+        return result;
+    }
+};
+
+template<typename T>
+class QueryBase {
+
+public:
+    typedef QueryIterator<T>      iterator;
+    typedef QueryConstIterator<T> const_iterator;
+
+    typedef typename IBamFileIteratorBase<T>::Ptr FileIterPtr;
+
+protected:
+    QueryBase(const DataSet& dataset);
+public:
+    virtual ~QueryBase(void) { }
+
+    QueryConstIterator<T> begin(void) const  { return QueryConstIterator<T>(*this); }
+    QueryConstIterator<T> cbegin(void) const { return QueryConstIterator<T>(*this); }
+    QueryIterator<T> begin(void) { return QueryIterator<T>(*this); }
+
+    QueryConstIterator<T> end(void) const { return QueryConstIterator<T>(); }
+    QueryConstIterator<T> cend(void) const { return QueryConstIterator<T>(); }
+    QueryIterator<T> end(void) { return QueryIterator<T>(); }
+
+public:
+    bool GetNext(T& r);
+
+    std::vector<BamFile> GetBamFiles(void) const
+    { return dataset_.ExternalResources().BamFiles(); }
+
+public:
+    std::vector<FileIterPtr> CreateIterators(void)
+    {
+        const std::vector<BamFile>& bamFiles = dataset_.ExternalResources().BamFiles();
+        std::vector<FileIterPtr> result;
+        result.reserve(bamFiles.size());
+        for (const BamFile& bamFile : bamFiles)
+            result.push_back(CreateIterator(bamFile));
+        return result;
+    }
+
+protected:
+    virtual FileIterPtr CreateIterator(const BamFile& bamFile) = 0;
+
+protected:
+    const DataSet dataset_;
+    std::unique_ptr<IMergeStrategyBase<T> > mergeStrategy_;
+    FilterEngine filterEngine_;
+};
+
+typedef QueryBase<BamRecord>               IQuery;
+typedef QueryBase<std::vector<BamRecord> > IGroupQuery;
+
+template<typename T>
+inline QueryIteratorBase<T>::QueryIteratorBase(void)
+    : query_(nullptr)
+{ }
+
+template<typename T>
+inline QueryIteratorBase<T>::QueryIteratorBase(QueryBase<T> &query)
+    : query_(&query)
+{ ReadNext(); }
+
+template<typename T>
+inline QueryBase<T>::QueryBase(const DataSet& dataset)
+    : dataset_(dataset)
+    , mergeStrategy_(nullptr)
+{ }
+
+template<typename T>
+inline bool QueryBase<T>::GetNext(T& r)
+{
+    while (mergeStrategy_->GetNext(r)) {
+        if (filterEngine_.Accepts(r))
+            return true;
+    }
+    return false;
+}
+
+template<typename T>
+inline void QueryIteratorBase<T>::ReadNext(void)
+{
+    assert(query_);
+    if (!query_->GetNext(record_))
+        query_ = nullptr;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // QUERYBASE2_H
diff --git a/include/pbbam/internal/SequentialMergeStrategy.h b/include/pbbam/internal/SequentialMergeStrategy.h
new file mode 100644
index 0000000..cf8e591
--- /dev/null
+++ b/include/pbbam/internal/SequentialMergeStrategy.h
@@ -0,0 +1,79 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef SEQUENTIALMERGESTRATEGY_H
+#define SEQUENTIALMERGESTRATEGY_H
+
+#include "pbbam/internal/IMergeStrategy.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class SequentialMergeStrategy : public IMergeStrategy
+{
+public:
+    SequentialMergeStrategy(const std::vector<FileIterPtr>& iters);
+    bool GetNext(BamRecord& r);
+private:
+    std::vector<FileIterPtr> iters_;
+};
+
+inline SequentialMergeStrategy::SequentialMergeStrategy(const std::vector<FileIterPtr>& iters)
+    : IMergeStrategy()
+    , iters_(iters)
+{ }
+
+inline bool SequentialMergeStrategy::GetNext(BamRecord& r)
+{
+    if (iters_.empty())
+        return false;
+
+    FileIterPtr iter = iters_.front();
+    if (iter->GetNext(r))
+        return true;
+    else {
+        iters_.erase(iters_.begin());
+        return GetNext(r);
+    }
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // SEQUENCTIALMERGESTRATEGY_H
diff --git a/include/pbbam/internal/Tag.inl b/include/pbbam/internal/Tag.inl
new file mode 100644
index 0000000..cf9f60a
--- /dev/null
+++ b/include/pbbam/internal/Tag.inl
@@ -0,0 +1,324 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/Tag.h"
+#include <boost/numeric/conversion/cast.hpp>
+#include <iostream>
+
+#ifndef TAG_INL
+#define TAG_INL
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+inline bool InAsciiRange(const T& x)
+{ return (x >=33 && x <= 127); }
+
+struct AsciiConvertVisitor : public boost::static_visitor<char>
+{
+    // only valid for numeric types - maybe even more restrictive?
+    char operator() (const int8_t& x) const   { return Helper(x); }
+    char operator() (const uint8_t& x) const  { return Helper(x); }
+    char operator() (const int16_t& x) const  { return Helper(x); }
+    char operator() (const uint16_t& x) const { return Helper(x); }
+    char operator() (const int32_t& x) const  { return Helper(x); }
+    char operator() (const uint32_t& x) const { return Helper(x); }
+
+    // anything else always throws
+    template<typename T>
+    char operator()(const T&) const
+    { throw std::runtime_error("conversion not supported"); return 0; }
+
+private:
+    template<typename T>
+    char Helper(const T& x) const
+    {
+        if (!InAsciiRange(x))
+            throw std::runtime_error("not valid ASCII");
+        return static_cast<char>(x);
+    }
+};
+
+template<typename DesiredType>
+struct NumericConvertVisitor : public boost::static_visitor<DesiredType>
+{
+    // only valid for integral types
+    DesiredType operator() (const int8_t& x) const   { return boost::numeric_cast<DesiredType>(x); }
+    DesiredType operator() (const uint8_t& x) const  { return boost::numeric_cast<DesiredType>(x); }
+    DesiredType operator() (const int16_t& x) const  { return boost::numeric_cast<DesiredType>(x); }
+    DesiredType operator() (const uint16_t& x) const { return boost::numeric_cast<DesiredType>(x); }
+    DesiredType operator() (const int32_t& x) const  { return boost::numeric_cast<DesiredType>(x); }
+    DesiredType operator() (const uint32_t& x) const { return boost::numeric_cast<DesiredType>(x); }
+
+    // anything else always throws
+    template<typename T> DesiredType operator()(const T& t) const
+    {
+        const std::string from = typeid(t).name();
+        const std::string to   = typeid(DesiredType).name();
+        const std::string msg = std::string("conversion not supported: ") + from + " -> " + to;
+        throw std::runtime_error(msg);
+        return 0;
+    }
+};
+
+typedef NumericConvertVisitor<int8_t>   ToInt8ConvertVisitor;
+typedef NumericConvertVisitor<uint8_t>  ToUInt8ConvertVisitor;
+typedef NumericConvertVisitor<int16_t>  ToInt16ConvertVisitor;
+typedef NumericConvertVisitor<uint16_t> ToUInt16ConvertVisitor;
+typedef NumericConvertVisitor<int32_t>  ToInt32ConvertVisitor;
+typedef NumericConvertVisitor<uint32_t> ToUInt32ConvertVisitor;
+
+struct IsEqualVisitor : public boost::static_visitor<bool>
+{
+    template <typename T, typename U>
+    bool operator() (const T&, const U&) const
+    {
+        // maybe allow conversions down the road?
+        // but for now, just fail if types are different
+        return false;
+    }
+
+    bool operator()(const boost::blank&, const boost::blank&) const
+    { return true; }
+
+    template <typename T>
+    bool operator() (const T& lhs, const T& rhs) const
+    { return lhs == rhs; }
+};
+
+struct TypenameVisitor : public boost::static_visitor<std::string>
+{
+    std::string operator() (const boost::blank&) const     { return "none"; }
+    std::string operator() (const int8_t&) const           { return "int8_t"; }
+    std::string operator() (const uint8_t&) const          { return "uint8_t"; }
+    std::string operator() (const int16_t&) const          { return "int16_t"; }
+    std::string operator() (const uint16_t&) const         { return "uint16_t"; }
+    std::string operator() (const int32_t&) const          { return "int32_t"; }
+    std::string operator() (const uint32_t&) const         { return "uint32_t"; }
+    std::string operator() (const float&) const            { return "float"; }
+    std::string operator() (const std::string&) const      { return "string"; }
+    std::string operator() (const std::vector<int8_t>&) const   { return "vector<int8_t>"; }
+    std::string operator() (const std::vector<uint8_t>&) const  { return "vector<uint8_t>"; }
+    std::string operator() (const std::vector<int16_t>&) const  { return "vector<int16_t>"; }
+    std::string operator() (const std::vector<uint16_t>&) const { return "vector<uint16_t>"; }
+    std::string operator() (const std::vector<int32_t>&) const  { return "vector<int32_t>"; }
+    std::string operator() (const std::vector<uint32_t>&) const { return "vector<uint32_t>"; }
+    std::string operator() (const std::vector<float>&) const    { return "vector<float>"; }
+};
+
+} // namespace internal
+
+inline bool Tag::operator== (const Tag& other) const
+{
+    return boost::apply_visitor(internal::IsEqualVisitor(), data_, other.data_) &&
+           (modifier_ == other.modifier_) ;
+}
+
+inline bool Tag::operator!= (const Tag& other) const
+{ return !(*this == other); }
+
+inline bool Tag::HasModifier(const TagModifier m) const
+{
+    // we just allow one at a time (for now at least)
+    return modifier_ == m;
+}
+
+inline bool Tag::IsNull(void) const
+{ return Type() == TagDataType::INVALID; }
+
+inline bool Tag::IsInt8(void) const
+{ return Type() == TagDataType::INT8; }
+
+inline bool Tag::IsUInt8(void) const
+{ return Type() == TagDataType::UINT8; }
+
+inline bool Tag::IsInt16(void) const
+{ return Type() == TagDataType::INT16; }
+
+inline bool Tag::IsUInt16(void) const
+{ return Type() == TagDataType::UINT16; }
+
+inline bool Tag::IsInt32(void) const
+{ return Type() == TagDataType::INT32; }
+
+inline bool Tag::IsUInt32(void) const
+{ return Type() == TagDataType::UINT32; }
+
+inline bool Tag::IsFloat(void) const
+{ return Type() == TagDataType::FLOAT; }
+
+inline bool Tag::IsString(void) const
+{ return Type() == TagDataType::STRING; }
+
+inline bool Tag::IsHexString(void) const
+{ return IsString() && modifier_ == TagModifier::HEX_STRING; }
+
+inline bool Tag::IsInt8Array(void) const
+{ return Type() == TagDataType::INT8_ARRAY; }
+
+inline bool Tag::IsUInt8Array(void) const
+{ return Type() == TagDataType::UINT8_ARRAY; }
+
+inline bool Tag::IsInt16Array(void) const
+{ return Type() == TagDataType::INT16_ARRAY; }
+
+inline bool Tag::IsUInt16Array(void) const
+{ return Type() == TagDataType::UINT16_ARRAY; }
+
+inline bool Tag::IsInt32Array(void) const
+{ return Type() == TagDataType::INT32_ARRAY; }
+
+inline bool Tag::IsUInt32Array(void) const
+{ return Type() == TagDataType::UINT32_ARRAY; }
+
+inline bool Tag::IsFloatArray(void) const
+{ return Type() == TagDataType::FLOAT_ARRAY; }
+
+inline bool Tag::IsSignedInt(void) const
+{ return IsInt8() || IsInt16() || IsInt32(); }
+
+inline bool Tag::IsUnsignedInt(void) const
+{ return IsUInt8() || IsUInt16() || IsUInt32(); }
+
+inline bool Tag::IsIntegral(void) const
+{ return IsSignedInt() || IsUnsignedInt(); }
+
+inline bool Tag::IsNumeric(void) const
+{ return IsIntegral() || IsFloat(); }
+
+inline bool Tag::IsSignedArray(void) const
+{ return IsInt8Array() || IsInt16Array() || IsInt32Array(); }
+
+inline bool Tag::IsUnsignedArray(void) const
+{ return IsUInt8Array() || IsUInt16Array() || IsUInt32Array(); }
+
+inline bool Tag::IsIntegralArray(void) const
+{ return IsSignedArray() || IsUnsignedArray(); }
+
+inline bool Tag::IsArray(void) const
+{ return IsIntegralArray() || IsFloatArray(); }
+
+inline TagModifier Tag::Modifier(void) const
+{ return modifier_; }
+
+inline Tag& Tag::Modifier(const TagModifier m)
+{ modifier_ = m; return *this; }
+
+inline char Tag::ToAscii(void) const
+{ return boost::apply_visitor(internal::AsciiConvertVisitor(), data_); }
+
+inline int8_t Tag::ToInt8(void) const
+{
+    if (IsInt8())
+        return boost::get<int8_t>(data_);
+    return boost::apply_visitor(internal::ToInt8ConvertVisitor(), data_);
+}
+
+inline uint8_t Tag::ToUInt8(void) const
+{
+    if (IsUInt8())
+        return boost::get<uint8_t>(data_);
+    return boost::apply_visitor(internal::ToUInt8ConvertVisitor(), data_);
+}
+
+inline int16_t Tag::ToInt16(void) const
+{
+    if (IsInt16())
+        return boost::get<int16_t>(data_);
+    return boost::apply_visitor(internal::ToInt16ConvertVisitor(), data_);
+}
+
+inline uint16_t Tag::ToUInt16(void) const
+{
+    if (IsUInt16())
+        return boost::get<uint16_t>(data_);
+    return boost::apply_visitor(internal::ToUInt16ConvertVisitor(), data_);
+}
+
+inline int32_t Tag::ToInt32(void) const
+{
+//    if (IsInt32())
+//        return boost::get<int32_t>(data_);
+    return boost::apply_visitor(internal::ToInt32ConvertVisitor(), data_);
+}
+
+inline uint32_t Tag::ToUInt32(void) const
+{
+    if (IsUInt32())
+        return boost::get<uint32_t>(data_);
+    return boost::apply_visitor(internal::ToUInt32ConvertVisitor(), data_);
+}
+
+inline float Tag::ToFloat(void) const
+{ return boost::get<float>(data_); }
+
+inline std::string Tag::ToString(void) const
+{ return boost::get<std::string>(data_); }
+
+inline std::vector<int8_t> Tag::ToInt8Array(void) const
+{ return boost::get< std::vector<int8_t> >(data_); }
+
+inline std::vector<uint8_t> Tag::ToUInt8Array(void) const
+{ return boost::get< std::vector<uint8_t> >(data_); }
+
+inline std::vector<int16_t> Tag::ToInt16Array(void) const
+{ return boost::get< std::vector<int16_t> >(data_); }
+
+inline std::vector<uint16_t> Tag::ToUInt16Array(void) const
+{ return boost::get< std::vector<uint16_t> >(data_); }
+
+inline std::vector<int32_t> Tag::ToInt32Array(void) const
+{ return boost::get< std::vector<int32_t> >(data_); }
+
+inline std::vector<uint32_t> Tag::ToUInt32Array(void) const
+{ return boost::get< std::vector<uint32_t> >(data_); }
+
+inline std::vector<float> Tag::ToFloatArray(void) const
+{ return boost::get< std::vector<float> >(data_); }
+
+inline TagDataType Tag::Type(void) const
+{ return TagDataType(data_.which()  ); }
+
+inline std::string Tag::Typename(void) const
+{ return boost::apply_visitor(internal::TypenameVisitor(), data_); }
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // TAG_INL
diff --git a/include/pbbam/virtual/VirtualPolymeraseBamRecord.h b/include/pbbam/virtual/VirtualPolymeraseBamRecord.h
new file mode 100644
index 0000000..86f3ef8
--- /dev/null
+++ b/include/pbbam/virtual/VirtualPolymeraseBamRecord.h
@@ -0,0 +1,136 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Armin Töpfer
+
+#ifndef POLYMERASEBAMRECORD_H
+#define POLYMERASEBAMRECORD_H
+
+#include <vector>
+#include <sstream>
+
+#include "pbbam/BamHeader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/Config.h"
+#include "pbbam/virtual/VirtualRegion.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+
+namespace PacBio {
+namespace BAM {
+
+/// This class represents a polymerase read stitched on the fly
+/// from subreads|hqregion+scraps.
+class VirtualPolymeraseBamRecord : public BamRecord
+{
+public:
+    VirtualPolymeraseBamRecord(std::vector<BamRecord>&& unorderedSources,
+                               const BamHeader& header);
+
+    VirtualPolymeraseBamRecord() = delete;
+    // Move constructor
+    VirtualPolymeraseBamRecord(VirtualPolymeraseBamRecord&&) = default;
+    // Copy constructor
+    VirtualPolymeraseBamRecord(const VirtualPolymeraseBamRecord&) = delete;
+    // Move assignment operator
+    VirtualPolymeraseBamRecord& operator=(VirtualPolymeraseBamRecord&&) = default;
+    // Copy assignment operator
+    VirtualPolymeraseBamRecord& operator=(const VirtualPolymeraseBamRecord&) = delete;
+    // Destructor
+    virtual ~VirtualPolymeraseBamRecord() = default;
+
+public:
+    /// Provides bool if a given VirtualRegionType has been annotated
+    bool HasVirtualRegionType(const VirtualRegionType type) const
+    { return virtualRegionsMap_.find(type) != virtualRegionsMap_.end(); }
+
+    /// Provides annotations of the polymerase read for a given VirtualRegionType
+    std::vector<VirtualRegion> VirtualRegionsTable(const VirtualRegionType type) const
+    { return virtualRegionsMap_.at(type); }
+
+    /// Provides all annotations of the polymerase read as a map
+    std::map<VirtualRegionType, std::vector<VirtualRegion>> VirtualRegionsMap() const
+    { return virtualRegionsMap_; }
+
+public: // New BamRecord functionality.
+    Frames IPDV1Frames(Orientation orientation = Orientation::NATIVE) const;
+
+private:
+    std::vector<BamRecord> sources_;
+    std::map<VirtualRegionType, std::vector<VirtualRegion>> virtualRegionsMap_;
+
+private:
+    void StitchSources();
+
+    /// \brief Appends content of src vector to dst vector using move semantics.
+    /// \param[in] src Input vector that will be empty after execution
+    /// \param[in,out] dest Output vector that will be appended to
+    template <typename T>
+    inline void MoveAppend(std::vector<T>& src, std::vector<T>& dst) noexcept
+    {
+        if (dst.empty())
+        {
+            dst = std::move(src);
+        }
+        else
+        {
+            dst.reserve(dst.size() + src.size());
+            std::move(src.begin(), src.end(), std::back_inserter(dst));
+            src.clear();
+        }
+    }
+
+    /// \brief Appends content of src vector to dst vector using move semantics.
+    /// \param[in] src Input vector via perfect forwarding
+    /// \param[in,out] dest Output vector that will be appended to
+    template <typename T>
+    inline void MoveAppend(std::vector<T>&& src, std::vector<T>& dst) noexcept
+    {
+        if (dst.empty())
+        {
+            dst = std::move(src);
+        }
+        else
+        {
+            dst.reserve(dst.size() + src.size());
+            std::move(src.begin(), src.end(), std::back_inserter(dst));
+            src.clear();
+        }
+    }
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // POLYMERASEBAMRECORD_H
diff --git a/include/pbbam/virtual/VirtualPolymeraseReader.h b/include/pbbam/virtual/VirtualPolymeraseReader.h
new file mode 100644
index 0000000..e166482
--- /dev/null
+++ b/include/pbbam/virtual/VirtualPolymeraseReader.h
@@ -0,0 +1,105 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Armin Töpfer
+
+#ifndef VIRTUALPOLYMERASEREADER_H
+#define VIRTUALPOLYMERASEREADER_H
+
+#include <memory>
+
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/Config.h"
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/virtual/VirtualPolymeraseBamRecord.h"
+
+namespace PacBio {
+namespace BAM {
+
+class VirtualPolymeraseReader
+{
+public:
+	/// Constructor takes two input bam file paths.
+	/// \param[in] primaryBamFilePath hqregion.bam or subreads.bam file path
+	/// \param[in] scrapsBamFilePath scraps.bam file path
+    VirtualPolymeraseReader(const std::string& primaryBamFilePath,
+                            const std::string& scrapsBamFilePath);
+
+    VirtualPolymeraseReader() = delete;
+    // Move constructor
+    VirtualPolymeraseReader(VirtualPolymeraseReader&&) = delete;
+    // Copy constructor
+    VirtualPolymeraseReader(const VirtualPolymeraseReader&) = delete;
+    // Move assignment operator
+    VirtualPolymeraseReader& operator=(VirtualPolymeraseReader&&) = delete;
+    // Copy assignment operator
+    VirtualPolymeraseReader& operator=(const VirtualPolymeraseReader&) = delete;
+    // Destructor
+    ~VirtualPolymeraseReader() = default;
+
+public:
+	/// Provides the next stitched polymerase read
+	VirtualPolymeraseBamRecord Next();
+
+	/// Provides the next set of reads that belong to one ZMW.
+	/// Enables stitching records in a distinct thread.
+	std::vector<BamRecord> NextRaw();
+
+	/// Returns true if more ZMWs are available for reading.
+	bool HasNext();
+
+	BamHeader PrimaryHeader();
+	BamHeader ScrapsHeader();
+
+private:
+	const std::string                primaryBamFilePath_;
+	const std::string                scrapsBamFilePath_;
+
+	std::unique_ptr<BamFile>         primaryBamFile_;
+	std::unique_ptr<BamFile>         scrapsBamFile_;
+    std::unique_ptr<EntireFileQuery> primaryQuery_;
+    std::unique_ptr<EntireFileQuery> scrapsQuery_;
+
+    EntireFileQuery::iterator              primaryIt_;
+    EntireFileQuery::iterator              scrapsIt_;
+
+	std::unique_ptr<BamHeader>       polyHeader_;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // VIRTUALPOLYMERASEREADER_H
diff --git a/include/pbbam/virtual/VirtualRegion.h b/include/pbbam/virtual/VirtualRegion.h
new file mode 100644
index 0000000..69c16df
--- /dev/null
+++ b/include/pbbam/virtual/VirtualRegion.h
@@ -0,0 +1,103 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Armin Töpfer
+
+#ifndef VIRTUALREGION_H
+#define VIRTUALREGION_H
+
+#include "pbbam/Config.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+#include "pbbam/LocalContextFlags.h"
+
+namespace PacBio {
+namespace BAM {
+/// Represents annotation of a polymerase region.
+struct VirtualRegion
+{
+public:
+    VirtualRegionType type;
+    int beginPos;
+    int endPos;
+    LocalContextFlags cxTag = LocalContextFlags::NO_LOCAL_CONTEXT;
+    int barcodeLeft = -1;
+    int barcodeRight = -1;
+
+public:
+    VirtualRegion(const VirtualRegionType type, 
+                  const int beginPos,
+                  const int endPos)
+        : type(type)
+        , beginPos(beginPos)
+        , endPos(endPos), cxTag()
+    {}
+    VirtualRegion(const VirtualRegionType type, 
+                  const int beginPos,
+                  const int endPos, 
+                  const LocalContextFlags cxTag, 
+                  const int barcodeLeft,
+                  const int barcodeRight)
+        : type(type)
+        , beginPos(beginPos)
+        , endPos(endPos)
+        , cxTag(cxTag)
+        , barcodeLeft(barcodeLeft)
+        , barcodeRight(barcodeRight)
+    {}
+    VirtualRegion() = default;
+    // Move constructor
+    VirtualRegion(VirtualRegion&&) = default;
+    // Copy constructor
+    VirtualRegion(const VirtualRegion&) = default;
+    // Move assignment operator
+    VirtualRegion& operator=(VirtualRegion&&) = default;
+    // Copy assignment operator
+    VirtualRegion& operator=(const VirtualRegion&) = delete;
+    // Destructor
+    ~VirtualRegion() = default;
+
+public:
+    bool operator==(const VirtualRegion &v1) const
+    {
+        return (v1.type == this->type &&
+                v1.beginPos == this->beginPos &&
+                v1.endPos == this->endPos);
+    }
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // VIRTUALREGION_H
diff --git a/include/pbbam/virtual/VirtualRegionType.h b/include/pbbam/virtual/VirtualRegionType.h
new file mode 100644
index 0000000..6b917bf
--- /dev/null
+++ b/include/pbbam/virtual/VirtualRegionType.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef REGIONTYPE_H
+#define REGIONTYPE_H
+
+#include "pbbam/Config.h"
+
+namespace PacBio {
+namespace BAM {
+/// Type of annotated region.
+enum class VirtualRegionType : char
+{
+	ADAPTER        = 'A',
+	BARCODE        = 'B',
+	SUBREAD        = 'S',
+	HQREGION       = 'H',
+	LQREGION       = 'L'  // Outside the HQ region
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // REGIONTYPE_H
diff --git a/include/pbbam/virtual/VirtualRegionTypeMap.h b/include/pbbam/virtual/VirtualRegionTypeMap.h
new file mode 100644
index 0000000..105696c
--- /dev/null
+++ b/include/pbbam/virtual/VirtualRegionTypeMap.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef VIRTUALREGIONTYPEMAP_H
+#define VIRTUALREGIONTYPEMAP_H
+
+#include <map>
+
+#include "pbbam/Config.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+
+namespace PacBio {
+namespace BAM {
+/// Allows mapping of char 'A', 'B', 'H', and 'L' to the respective enum keys.
+class VirtualRegionTypeMap
+{
+public:
+	static std::map<char, VirtualRegionType> ParseChar;
+};
+
+} // namespace BAM
+} // namespace PacBio
+
+#endif // VIRTUALREGIONTYPEMAP_H
diff --git a/src/Accuracy.cpp b/src/Accuracy.cpp
new file mode 100644
index 0000000..0c8114a
--- /dev/null
+++ b/src/Accuracy.cpp
@@ -0,0 +1,43 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/Accuracy.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+const int Accuracy::MIN = 0;
+const int Accuracy::MAX = 1000;
diff --git a/src/AlignmentPrinter.cpp b/src/AlignmentPrinter.cpp
new file mode 100644
index 0000000..6692021
--- /dev/null
+++ b/src/AlignmentPrinter.cpp
@@ -0,0 +1,148 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Armin Töpfer
+
+#include <cmath>
+#include <iostream>
+#include <iomanip>  
+#include <stdexcept>
+#include <sstream>
+
+#include "pbbam/AlignmentPrinter.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+std::string AlignmentPrinter::Print(const BamRecord& record,
+                                    const Orientation orientation)
+{
+
+	std::string seq = record.Sequence(orientation, true, true);
+	std::string ref = ifr_->ReferenceSubsequence(record, orientation, true, true);
+
+	if (seq.size() != ref.size())
+        throw std::runtime_error("Sequence and reference parts are of different size");
+
+	int seqLength = 0;
+	float matches = 0;
+	std::string pretty;
+    Position refCoord = record.ReferenceStart();
+    Position seqCoord = record.QueryStart();
+
+	for (size_t i = 0; i < seq.size();)
+	{
+		std::string refCoordStr = std::to_string(refCoord);
+		std::string seqCoordStr = std::to_string(seqCoord);
+
+		size_t maxCoordLength = std::max(refCoordStr.size(), seqCoordStr.size());
+		while (refCoordStr.size() < maxCoordLength)
+			refCoordStr = " "+refCoordStr;
+		while (seqCoordStr.size() < maxCoordLength)
+			seqCoordStr = " "+seqCoordStr;
+
+		std::string seqWrap = seqCoordStr + " : ";
+		std::string refWrap = refCoordStr + " : ";
+		std::string prettyWrap(maxCoordLength+3, ' ');
+		prettyWrap.reserve(seq.size());
+		for (int j = 0; i < seq.size() && j < 40; ++i, ++j)
+		{
+			refWrap +=  ref[i];
+
+			if (seq[i] == ref[i])
+			{
+				++matches;
+				if (refCoord == 0 || refCoord % 10)
+					prettyWrap += '|'; 
+				else
+				{
+					prettyWrap += "\033[1m\x1b[31m";
+					prettyWrap += '|'; 
+					prettyWrap += "\033[0m\x1b[39;49m";
+				}
+				seqWrap += seq[i];
+			}
+			else if (seq[i] == '-' || ref[i] == '-')
+			{
+				prettyWrap +=  ' ';
+				seqWrap += seq[i];
+			}
+			else
+			{
+				prettyWrap +=  '.';
+				seqWrap += "\033[1m\x1b[31m";
+				seqWrap += seq[i];
+				seqWrap += "\033[0m\x1b[39;49m";
+			}
+			if (seq[i] != '-')
+			{
+				++seqLength;
+				++seqCoord;
+			}
+			if (ref[i] != '-')
+			{
+				++refCoord;
+			}
+		}
+
+		refCoordStr = std::to_string(refCoord);
+		seqCoordStr = std::to_string(seqCoord);
+
+		maxCoordLength = std::max(refCoordStr.size(), seqCoordStr.size());
+		while (refCoordStr.size() < maxCoordLength)
+			refCoordStr = " "+refCoordStr;
+		while (seqCoordStr.size() < maxCoordLength)
+			seqCoordStr = " "+seqCoordStr;
+
+		seqWrap += " : " + seqCoordStr;
+		refWrap += " : " + refCoordStr;
+
+		pretty += refWrap + '\n' + prettyWrap + '\n' + seqWrap + "\n\n";
+	}
+	float similarity = matches/seq.size();
+
+	std::stringstream output;
+
+	output << "Read        : " << record.FullName() << std::endl;
+	output << "Reference   : " << record.ReferenceName() << std::endl;
+	output << std::endl;
+	output << "Read-length : " << seqLength << std::endl;
+	output << "Concordance : " << std::setprecision(3) << (similarity);
+	output << std::endl;
+	output << std::endl;
+	output << pretty;
+
+    return output.str();
+}
diff --git a/src/AssertUtils.cpp b/src/AssertUtils.cpp
new file mode 100644
index 0000000..42f4ea8
--- /dev/null
+++ b/src/AssertUtils.cpp
@@ -0,0 +1,90 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "AssertUtils.h"
+#include <cstdarg>
+#include <cstdio>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static inline
+void message_out(FILE* stream,
+                 const char* format,
+                 const char* msg)
+{
+    fprintf(stream, format, msg);
+    fprintf(stream, "\n");
+    fflush(stream);
+}
+
+void printInfo(const char* msg, ...) {
+
+    va_list ap;
+    va_start(ap, msg);
+
+    char buffer[256] = {'\0' };
+    buffer[255] = '\0';
+    if (msg)
+        vsnprintf(buffer, 255, msg, ap);
+    va_end(ap);
+
+    message_out(stdout, "%s", buffer);
+}
+
+void printError(const char* msg, ...) {
+
+    va_list ap;
+    va_start(ap, msg);
+
+    char buffer[256] = {'\0' };
+    buffer[255] = '\0';
+    if (msg)
+        vsnprintf(buffer, 255, msg, ap);
+    va_end(ap);
+
+    message_out(stderr, "%s", buffer);
+}
+
+void printFailedAssert(const char* msg) {
+    printError("ASSERT FAILED: %s", msg);
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
diff --git a/src/AssertUtils.h b/src/AssertUtils.h
new file mode 100644
index 0000000..d098964
--- /dev/null
+++ b/src/AssertUtils.h
@@ -0,0 +1,93 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef ASSERTUTILS_H
+#define ASSERTUTILS_H
+
+// ---------------------------------------------------
+// This file contains dev/debugging helper utilities
+// ---------------------------------------------------
+
+#ifndef PBBAM_UNUSED
+#  define PBBAM_UNUSED(x) (void)x;
+#endif
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+inline void pbbam_noop(void) { }
+
+// a la fprintf(...). Auto-adds a newline
+void printError(const char* msg, ...);
+void printInfo(const char* msg, ...);
+void printFailedAssert(const char* msg);
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+//
+// This assert construct below allows us to report failures as well as take some
+// fallback action (return, break, continue, etc) so as not to crash at runtime.
+// In other words, it's basically a 'weak' assert with customized information &
+// failure response.
+//
+// PB_VERIFY(cond)           if condition fails, print message
+// PB_ASSERT(cond, action)   if condition fails, print message & perform action
+// PB_ASSERT_OR_BREAK        overload of ASSERT where action is 'break'
+// PB_ASSERT_OR_CONTINUE     overload of ASSERT where action is 'continue'
+// PB_ASSERT_OR_RETURN       overload of ASSERT where action is 'return'
+// PB_ASSERT_OR_RETURN_VALUE overload of ASSERT where action is 'return <value>'
+// PB_ASSERT_UNREACHABLE     overload of ASSERT(false) where action is a no-op. Used as a visual marker for
+//                        unreachable code-paths (e.g. invalid values in a switch statement)
+//
+#define PB_ASSERT_STRINGIFY2(x) #x
+#define PB_ASSERT_STRINGIFY(x) PB_ASSERT_STRINGIFY2(x)
+#define PB_ASSERT_STRING(cond) ::PacBio::BAM::internal::printFailedAssert( \
+    "\"" cond"\" in file " __FILE__ ", line " PB_ASSERT_STRINGIFY(__LINE__))
+
+#define PB_VERIFY(cond)             if (cond) {} else { PB_ASSERT_STRING(#cond);         } do {} while (0)
+#define PB_ASSERT(cond, action)     if (cond) {} else { PB_ASSERT_STRING(#cond); action; } do {} while (0)
+#define PB_ASSERT_OR_BREAK(cond)    PB_ASSERT(cond, break)
+#define PB_ASSERT_OR_CONTINUE(cond) PB_ASSERT(cond, continue)
+#define PB_ASSERT_OR_RETURN(cond)   PB_ASSERT(cond, return)
+#define PB_ASSERT_OR_RETURN_VALUE(cond, value) PB_ASSERT(cond, return value)
+
+#define PB_ASSERT_UNREACHABLE PB_ASSERT(false, ::PacBio::BAM::internal::pbbam_noop())
+
+#endif // ASSERTUTILS_H
diff --git a/src/BamFile.cpp b/src/BamFile.cpp
new file mode 100644
index 0000000..f75bc9d
--- /dev/null
+++ b/src/BamFile.cpp
@@ -0,0 +1,174 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamFile.h"
+#include "pbbam/PbiFile.h"
+#include "FileUtils.h"
+#include "MemoryUtils.h"
+#include <htslib/sam.h>
+#include <memory>
+#include <sys/stat.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class BamFilePrivate
+{
+public:
+    BamFilePrivate(const string& fn)
+        : filename_(fn)
+    {
+        // update verbosity
+        hts_verbose = PacBio::BAM::HtslibVerbosity;
+
+        // attempt open
+        std::unique_ptr<samFile, internal::HtslibFileDeleter> f(sam_open(filename_.c_str(), "rb"));
+        if (!f)
+            throw std::runtime_error("could not open file");
+        if (f->format.format != bam)
+            throw std::runtime_error("expected BAM, unknown format");
+
+        // attempt fetch header
+        std::unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> hdr(sam_hdr_read(f.get()));
+        header_ = internal::BamHeaderMemory::FromRawData(hdr.get());
+    }
+
+public:
+    std::string filename_;
+    BamHeader header_;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+// ------------------------
+// BamFile implementation
+// ------------------------
+
+BamFile::BamFile(const std::string& filename)
+    : d_(new internal::BamFilePrivate(filename))
+{ }
+
+BamFile::BamFile(const BamFile& other)
+    : d_(other.d_)
+{ }
+
+BamFile::BamFile(BamFile&& other)
+    : d_(std::move(other.d_))
+{ }
+
+BamFile& BamFile::operator=(const BamFile& other)
+{ d_ = other.d_; return *this; }
+
+BamFile& BamFile::operator=(BamFile&& other)
+{ d_ = std::move(other.d_); return *this; }
+
+BamFile::~BamFile(void) { }
+
+void BamFile::EnsurePacBioIndexExists(void) const
+{
+    if (!PacBioIndexExists())
+        PbiFile::CreateFrom(*this);
+}
+
+void BamFile::EnsureStandardIndexExists(void) const
+{
+    if (!StandardIndexExists()) {
+        if (bam_index_build(d_->filename_.c_str(), 0) != 0)
+            throw std::runtime_error("could not build BAI index");
+    }
+}
+
+std::string BamFile::Filename(void) const
+{ return d_->filename_; }
+
+bool BamFile::HasReference(const std::string& name) const
+{ return d_->header_.HasSequence(name); }
+
+const BamHeader& BamFile::Header(void) const
+{ return d_->header_; }
+
+bool BamFile::IsPacBioBAM(void) const
+{ return !d_->header_.PacBioBamVersion().empty(); }
+
+bool BamFile::PacBioIndexExists(void) const
+{
+    const string pbiFn = PacBioIndexFilename();
+    if (internal::FileUtils::Exists(pbiFn)) {
+        const time_t bamTimestamp = internal::FileUtils::LastModified(Filename());
+        const time_t pbiTimestamp = internal::FileUtils::LastModified(pbiFn);
+        if (bamTimestamp <= pbiTimestamp)
+            return true;
+    }
+    return false;
+}
+
+std::string BamFile::PacBioIndexFilename(void) const
+{ return d_->filename_ + ".pbi"; }
+
+int BamFile::ReferenceId(const std::string& name) const
+{ return d_->header_.SequenceId(name); }
+
+uint32_t BamFile::ReferenceLength(const std::string& name) const
+{ return ReferenceLength(ReferenceId(name)); }
+
+uint32_t BamFile::ReferenceLength(const int id) const
+{ return std::stoul(d_->header_.SequenceLength(id)); }
+
+std::string BamFile::ReferenceName(const int id) const
+{ return d_->header_.SequenceName(id); }
+
+bool BamFile::StandardIndexExists(void) const
+{
+    const string bamFn = Filename();
+    const string baiFn = StandardIndexFilename();
+    if (internal::FileUtils::Exists(baiFn)) {
+        const time_t bamTimestamp = internal::FileUtils::LastModified(bamFn);
+        const time_t baiTimestamp = internal::FileUtils::LastModified(baiFn);
+        if (bamTimestamp <= baiTimestamp)
+            return true;
+    }
+    return false;
+}
+
+std::string BamFile::StandardIndexFilename(void) const
+{ return d_->filename_ + ".bai"; }
diff --git a/src/BamHeader.cpp b/src/BamHeader.cpp
new file mode 100644
index 0000000..7caa62d
--- /dev/null
+++ b/src/BamHeader.cpp
@@ -0,0 +1,400 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamHeader.h"
+#include "SequenceUtils.h"
+#include <htslib/hts.h>
+#include <sstream>
+#include <set>
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static const string prefix_HD = string("@HD");
+static const string prefix_SQ = string("@SQ");
+static const string prefix_RG = string("@RG");
+static const string prefix_PG = string("@PG");
+static const string prefix_CO = string("@CO");
+
+static const string token_VN = string("VN");
+static const string token_SO = string("SO");
+static const string token_pb = string("pb");
+
+static const string current_version = string("3.0b7");
+
+class BamHeaderPrivate
+{
+public:
+    std::string version_;
+    std::string pacbioBamVersion_;
+    std::string sortOrder_;
+    std::map<std::string, std::string> headerLineCustom_;
+
+    std::map<std::string, ReadGroupInfo> readGroups_; // id => read group info
+    std::map<std::string, ProgramInfo> programs_;     // id => program info
+    std::vector<std::string> comments_;
+
+    // we need to preserve insertion order, use lookup for access by name
+    std::vector<SequenceInfo> sequences_;
+    std::map<std::string, int32_t> sequenceIdLookup_;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+BamHeader::BamHeader(void)
+    : d_(new internal::BamHeaderPrivate)
+{ }
+
+BamHeader::BamHeader(const string& samHeaderText)
+    : d_(new internal::BamHeaderPrivate)
+{
+    istringstream s(samHeaderText);
+    string line("");
+    string firstToken;
+    while (getline(s, line)) {
+
+        // skip if line is not long enough to contain true values
+        if (line.length() < 5)
+            continue;
+
+        // determine token at beginning of line
+        firstToken = line.substr(0,3);
+
+        if (firstToken == internal::prefix_HD) {
+
+            // pop off '@HD\t', then split HD lines into tokens
+            const vector<string>& tokens = internal::Split(line.substr(4), '\t');
+            for (const string& token : tokens) {
+                const string& tokenTag   = token.substr(0,2);
+                const string& tokenValue = token.substr(3);
+
+                // set header contents
+                if      (tokenTag == internal::token_VN) Version(tokenValue);
+                else if (tokenTag == internal::token_SO) SortOrder(tokenValue);
+                else if (tokenTag == internal::token_pb) PacBioBamVersion(tokenValue);
+            }
+
+            // check for required tags
+            if (Version().empty())
+                Version(string(hts_version()));
+        }
+
+        else if (firstToken == internal::prefix_SQ)
+            AddSequence(SequenceInfo::FromSam(line));
+
+        else if (firstToken == internal::prefix_RG)
+            AddReadGroup(ReadGroupInfo::FromSam(line));
+
+        else if (firstToken == internal::prefix_PG)
+            AddProgram(ProgramInfo::FromSam(line));
+
+        else if (firstToken == internal::prefix_CO)
+            AddComment(line.substr(4));
+    }
+}
+
+BamHeader::BamHeader(const BamHeader& other)
+    : d_(other.d_)
+{ }
+
+BamHeader::BamHeader(BamHeader&& other)
+    : d_(std::move(other.d_))
+{ }
+
+BamHeader& BamHeader::operator=(const BamHeader& other)
+{ d_ = other.d_; return *this; }
+
+BamHeader& BamHeader::operator=(BamHeader&& other)
+{ d_ = std::move(other.d_); return *this; }
+
+BamHeader::~BamHeader(void) { }
+
+BamHeader& BamHeader::AddComment(const std::string& comment)
+{ d_->comments_.push_back(comment); return *this; }
+
+BamHeader& BamHeader::AddProgram(const ProgramInfo& pg)
+{ d_->programs_[pg.Id()] = pg; return *this; }
+
+BamHeader& BamHeader::AddReadGroup(const ReadGroupInfo& readGroup)
+{ d_->readGroups_[readGroup.Id()] = readGroup; return *this; }
+
+BamHeader& BamHeader::AddSequence(const SequenceInfo& sequence)
+{
+    d_->sequences_.push_back(sequence);
+    d_->sequenceIdLookup_[sequence.Name()] = d_->sequences_.size() - 1;
+    return *this;
+}
+
+BamHeader& BamHeader::ClearComments(void)
+{ d_->comments_.clear(); return* this; }
+
+BamHeader& BamHeader::ClearPrograms(void)
+{ d_->programs_.clear(); return *this; }
+
+BamHeader& BamHeader::ClearReadGroups(void)
+{ d_->readGroups_.clear(); return *this; }
+
+BamHeader& BamHeader::ClearSequences(void)
+{
+    d_->sequenceIdLookup_.clear();
+    d_->sequences_.clear();
+    return *this;
+}
+
+std::vector<std::string> BamHeader::Comments(void) const
+{ return d_->comments_; }
+
+BamHeader& BamHeader::Comments(const std::vector<std::string>& comments)
+{ d_->comments_ = comments; return *this; }
+
+BamHeader BamHeader::DeepCopy(void) const
+{
+    BamHeader result;
+    result.d_->version_ = d_->version_;
+    result.d_->pacbioBamVersion_ = d_->pacbioBamVersion_;
+    result.d_->sortOrder_ = d_->sortOrder_;
+    result.d_->headerLineCustom_ = d_->headerLineCustom_;
+    result.d_->readGroups_ = d_->readGroups_;
+    result.d_->programs_ = d_->programs_;
+    result.d_->comments_ = d_->comments_;
+    result.d_->sequences_ = d_->sequences_;
+    result.d_->sequenceIdLookup_ = d_->sequenceIdLookup_;
+    return result;
+}
+
+bool BamHeader::HasProgram(const std::string& id) const
+{ return d_->programs_.find(id) != d_->programs_.cend(); }
+
+bool BamHeader::HasReadGroup(const std::string& id) const
+{ return d_->readGroups_.find(id) != d_->readGroups_.cend(); }
+
+bool BamHeader::HasSequence(const std::string& name) const
+{ return d_->sequenceIdLookup_.find(name) != d_->sequenceIdLookup_.cend(); }
+
+std::string BamHeader::PacBioBamVersion(void) const
+{ return d_->pacbioBamVersion_; }
+
+BamHeader& BamHeader::PacBioBamVersion(const std::string& version)
+{ d_->pacbioBamVersion_ = version; return *this; }
+
+ProgramInfo BamHeader::Program(const std::string& id) const
+{
+    const auto iter = d_->programs_.find(id);
+    if (iter == d_->programs_.cend())
+        throw std::runtime_error("program ID not found");
+    return iter->second;
+}
+
+vector<string> BamHeader::ProgramIds(void) const
+{
+    vector<string> result;
+    result.reserve(d_->programs_.size());
+    const auto end = d_->programs_.cend();
+    auto iter = d_->programs_.cbegin();
+    for ( ; iter != end; ++iter )
+        result.push_back(iter->first);
+    return result;
+}
+
+vector<ProgramInfo> BamHeader::Programs(void) const
+{
+    vector<ProgramInfo> result;
+    result.reserve(d_->programs_.size());
+    const auto end = d_->programs_.cend();
+    auto iter = d_->programs_.cbegin();
+    for ( ; iter != end; ++iter )
+        result.push_back(iter->second);
+    return result;
+}
+
+BamHeader& BamHeader::Programs(const vector<ProgramInfo>& programs)
+{
+    d_->programs_.clear();
+    for (const ProgramInfo& pg : programs)
+        d_->programs_[pg.Id()] = pg;
+    return *this;
+}
+
+ReadGroupInfo BamHeader::ReadGroup(const std::string& id) const
+{
+    const auto iter = d_->readGroups_.find(id);
+    if (iter == d_->readGroups_.cend())
+        throw std::runtime_error("read group ID not found");
+    return iter->second;
+}
+
+vector<string> BamHeader::ReadGroupIds(void) const
+{
+    vector<string> result;
+    result.reserve(d_->readGroups_.size());
+    const auto end = d_->readGroups_.cend();
+    auto iter = d_->readGroups_.cbegin();
+    for ( ; iter != end; ++iter )
+        result.push_back(iter->first);
+    return result;
+}
+
+vector<ReadGroupInfo> BamHeader::ReadGroups(void) const
+{
+    vector<ReadGroupInfo> result;
+    result.reserve(d_->readGroups_.size());
+    const auto end = d_->readGroups_.cend();
+    auto iter = d_->readGroups_.cbegin();
+    for ( ; iter != end; ++iter )
+        result.push_back(iter->second);
+    return result;
+}
+
+BamHeader& BamHeader::ReadGroups(const vector<ReadGroupInfo>& readGroups)
+{
+    d_->readGroups_.clear();
+    for (const ReadGroupInfo& rg : readGroups)
+        d_->readGroups_[rg.Id()] = rg;
+    return *this;
+}
+
+SequenceInfo BamHeader::Sequence(const int32_t id) const
+{
+    // throws out of range
+    return d_->sequences_.at(id);
+}
+
+SequenceInfo BamHeader::Sequence(const std::string& name) const
+{
+    const auto iter = d_->sequenceIdLookup_.find(name);
+    if (iter == d_->sequenceIdLookup_.cend())
+        return SequenceInfo();
+    const int index = iter->second;
+    assert(index >= 0 && (size_t)index < d_->sequences_.size());
+    return d_->sequences_.at(index);
+}
+
+int32_t BamHeader::SequenceId(const std::string& name) const
+{
+    const auto iter = d_->sequenceIdLookup_.find(name);
+    if (iter == d_->sequenceIdLookup_.cend())
+        throw std::runtime_error("sequence not found");
+    return iter->second;
+}
+
+std::string BamHeader::SequenceLength(const int32_t id) const
+{ return Sequence(id).Length(); }
+
+std::string BamHeader::SequenceName(const int32_t id) const
+{ return Sequence(id).Name(); }
+
+vector<string> BamHeader::SequenceNames(void) const
+{
+    vector<string> result;
+    result.reserve(d_->sequences_.size());
+    const auto end = d_->sequences_.cend();
+    auto iter = d_->sequences_.cbegin();
+    for ( ; iter != end; ++iter )
+        result.push_back(iter->Name());
+    return result;
+}
+
+std::vector<SequenceInfo> BamHeader::Sequences(void) const
+{ return d_->sequences_; }
+
+BamHeader& BamHeader::Sequences(const vector<SequenceInfo>& sequences)
+{
+    d_->sequences_.clear();
+    for (const SequenceInfo& seq : sequences)
+        AddSequence(seq);
+    return *this;
+}
+
+std::string BamHeader::SortOrder(void) const
+{ return d_->sortOrder_; }
+
+BamHeader& BamHeader::SortOrder(const std::string& order)
+{ d_->sortOrder_ = order; return *this; }
+
+string BamHeader::ToSam(void) const
+{
+    // clear out stream
+    stringstream out("");
+
+    // @HD
+    const string& outputVersion   = (d_->version_.empty()   ? string(hts_version()) : d_->version_);
+    const string& outputSortOrder = (d_->sortOrder_.empty() ? string("unknown") : d_->sortOrder_);
+    const string& outputPbBamVersion = (d_->pacbioBamVersion_.empty() ? internal::current_version : d_->pacbioBamVersion_);
+
+    out << internal::prefix_HD
+        << internal::MakeSamTag(internal::token_VN, outputVersion)
+        << internal::MakeSamTag(internal::token_SO, outputSortOrder)
+        << internal::MakeSamTag(internal::token_pb, outputPbBamVersion)
+        << endl;
+
+//    if (!d_->pacbioBamVersion_.empty())
+//        out << internal::MakeSamTag(internal::token_pb, d_->pacbioBamVersion_);
+//     out << endl;
+
+    // @SQ
+    for (const SequenceInfo& seq : d_->sequences_)
+        out << seq.ToSam() << endl;
+
+    // @RG
+    for (const auto& rgIter : d_->readGroups_)
+        out << rgIter.second.ToSam() << endl;
+
+    // @PG
+    for (const auto& progIter : d_->programs_)
+        out  << progIter.second.ToSam() << endl;
+
+    // @CO
+    for (const string& comment : d_->comments_)
+        out << internal::prefix_CO << '\t' << comment << endl;
+
+    // return result
+    return out.str();
+}
+
+std::string BamHeader::Version(void) const
+{ return d_->version_; }
+
+BamHeader& BamHeader::Version(const std::string& version)
+{ d_->version_ = version; return *this; }
+
diff --git a/src/BamRecord.cpp b/src/BamRecord.cpp
new file mode 100644
index 0000000..11387ae
--- /dev/null
+++ b/src/BamRecord.cpp
@@ -0,0 +1,1785 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamRecord.h"
+#include "pbbam/virtual/VirtualRegionTypeMap.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include "SequenceUtils.h"
+#include <htslib/sam.h>
+
+#include <iostream>
+#include <stdexcept>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// BAM record tag names
+static const string tagName_readAccuracy            = "rq";
+static const string tagName_holeNumber              = "zm";
+static const string tagName_numPasses               = "np";
+static const string tagName_contextFlags            = "cx";
+static const string tagName_snr                     = "sn";
+static const string tagName_deletionQV              = "dq";
+static const string tagName_deletionTag             = "dt";
+static const string tagName_insertionQV             = "iq";
+static const string tagName_ipd                     = "ip";
+static const string tagName_mergeQV                 = "mq";
+static const string tagName_pulseWidth              = "pw";
+static const string tagName_readGroup               = "RG";
+static const string tagName_queryStart              = "qs";
+static const string tagName_queryEnd                = "qe";
+static const string tagName_substitutionQV          = "sq";
+static const string tagName_substitutionTag         = "st";
+static const string tagName_pkmean                  = "pa";
+static const string tagName_pkmid                   = "pm";
+static const string tagName_pre_pulse_frames        = "pd";
+static const string tagName_pulse_call_width        = "px";
+static const string tagName_labelQV                 = "pq";
+static const string tagName_alternative_labelQV     = "pv";
+static const string tagName_alternative_labelTag    = "pt";
+static const string tagName_pulse_call              = "pc";
+static const string tagName_scrap_type              = "sc";
+static const string tagName_barcodes                = "bc";
+static const string tagName_pulseMergeQV            = "pg";
+
+// faux (helper) tag names
+static const string tagName_QUAL = "QUAL";
+static const string tagName_SEQ  = "SEQ";
+
+// record type names
+static const string recordTypeName_Polymerase = "POLYMERASE";
+static const string recordTypeName_HqRegion   = "HQREGION";
+static const string recordTypeName_Subread    = "SUBREAD";
+static const string recordTypeName_CCS        = "CCS";
+static const string recordTypeName_Scrap      = "SCRAP";
+static const string recordTypeName_Unknown    = "UNKNOWN";
+
+static
+int32_t HoleNumberFromName(const string& fullName)
+{
+    const vector<string> mainTokens = std::move(Split(fullName, '/'));
+    if (mainTokens.size() != 3)
+        throw std::runtime_error("malformed record name");
+    return stoi(mainTokens.at(1));
+}
+
+static
+Position QueryEndFromName(const string& fullName)
+{
+    const vector<string> mainTokens = std::move(Split(fullName, '/'));
+    if (mainTokens.size() != 3)
+        throw std::runtime_error("malformed record name");
+    const vector<string> queryTokens = std::move(Split(mainTokens.at(2), '_'));
+    if (queryTokens.size() != 2)
+        throw std::runtime_error("malformed record name");
+    return stoi(queryTokens.at(1));
+}
+
+static
+Position QueryStartFromName(const string& fullName)
+{
+    const vector<string> mainTokens = std::move(Split(fullName, '/'));
+    if (mainTokens.size() != 3)
+        throw std::runtime_error("malformed record name");
+    const vector<string> queryTokens = std::move(Split(mainTokens.at(2), '_'));
+    if (queryTokens.size() != 2)
+        throw std::runtime_error("malformed record name");
+    return stoi(queryTokens.at(0));
+}
+
+static
+BamRecordImpl* CreateOrEdit(const string& tagName,
+                            const Tag& value,
+                            BamRecordImpl* impl)
+{
+    if (impl->HasTag(tagName))
+        impl->EditTag(tagName, value);
+    else
+        impl->AddTag(tagName, value);
+    return impl;
+}
+
+static
+int32_t AlignedEndOffset(const Cigar& cigar,
+                         const int seqLength)
+{
+    int32_t endOffset = seqLength;
+
+    if (!cigar.empty()) {
+        Cigar::const_reverse_iterator cigarIter = cigar.crbegin();
+        Cigar::const_reverse_iterator cigarEnd  = cigar.crend();
+        for (; cigarIter != cigarEnd; ++cigarIter) {
+            const CigarOperation& op = (*cigarIter);
+            if (op.Type() == CigarOperationType::HARD_CLIP) {
+                if (endOffset != 0 && endOffset != seqLength)
+                    return -1;
+            }
+            else if (op.Type() == CigarOperationType::SOFT_CLIP)
+                endOffset -= op.Length();
+            else
+                break;
+        }
+    }
+
+    if (endOffset == 0)
+        endOffset = seqLength;
+    return endOffset;
+}
+
+static
+int32_t AlignedStartOffset(const Cigar& cigar,
+                           const int seqLength)
+{
+    int32_t startOffset = 0;
+
+    if (!cigar.empty()) {
+        Cigar::const_iterator cigarIter = cigar.cbegin();
+        Cigar::const_iterator cigarEnd  = cigar.cend();
+        for (; cigarIter != cigarEnd; ++cigarIter) {
+            const CigarOperation& op = (*cigarIter);
+            if (op.Type() == CigarOperationType::HARD_CLIP) {
+                if (startOffset != 0 && startOffset != seqLength)
+                    return -1;
+            }
+            else if (op.Type() == CigarOperationType::SOFT_CLIP)
+                startOffset += op.Length();
+            else
+                break;
+        }
+    }
+    return startOffset;
+}
+
+template<typename T>
+T Clip(const T& input,
+       const size_t pos,
+       const size_t len)
+{
+    return T(input.cbegin() + pos,
+             input.cbegin() + pos + len);
+}
+
+static
+void MaybeClipAndGapifyBases(const BamRecordImpl& impl,
+                             const bool aligned,
+                             const bool exciseSoftClips,
+                             string& seq)
+{
+    if (impl.IsMapped() && (aligned || exciseSoftClips)) {
+
+        size_t seqIndex = 0;
+        const Cigar& cigar = impl.CigarData();
+        Cigar::const_iterator cigarIter = cigar.cbegin();
+        Cigar::const_iterator cigarEnd  = cigar.cend();
+        for (; cigarIter != cigarEnd; ++cigarIter) {
+            const CigarOperation& op = (*cigarIter);
+            const CigarOperationType& type = op.Type();
+
+            // do nothing for hard clips
+            if (type != CigarOperationType::HARD_CLIP) {
+                const size_t opLength = op.Length();
+
+                // maybe remove soft clips
+                if (type == CigarOperationType::SOFT_CLIP && exciseSoftClips)
+                    seq.erase(seqIndex, opLength);
+
+                // for non-clipping operations
+                else {
+
+                    // maybe add gaps/padding
+                    if (aligned) {
+                        if (type == CigarOperationType::DELETION) {
+                            seq.reserve(seq.size() + opLength);
+                            seq.insert(seqIndex, opLength, '-');
+                        }
+                        else if (type == CigarOperationType::PADDING) {
+                            seq.reserve(seq.size() + opLength);
+                            seq.insert(seqIndex, opLength, '*');
+                        }
+                    }
+
+                    // update index
+                    seqIndex += opLength;
+                }
+            }
+        }
+    }
+}
+
+static
+void MaybeClipAndGapifyFrames(const BamRecordImpl& impl,
+                              const bool aligned,
+                              const bool exciseSoftClips,
+                              Frames& frames)
+{
+    if (impl.IsMapped() && (aligned || exciseSoftClips)) {
+
+        vector<uint16_t> data = std::move(frames.Data()); // we're going to put it back
+        size_t frameIndex = 0;
+        const Cigar& cigar = impl.CigarData();
+        Cigar::const_iterator cigarIter = cigar.cbegin();
+        Cigar::const_iterator cigarEnd  = cigar.cend();
+        for (; cigarIter != cigarEnd; ++cigarIter) {
+            const CigarOperation& op = (*cigarIter);
+            const CigarOperationType& type = op.Type();
+
+            // do nothing for hard clips
+            if (type != CigarOperationType::HARD_CLIP) {
+                const size_t opLength = op.Length();
+
+                // maybe remove soft clips
+                if (type == CigarOperationType::SOFT_CLIP && exciseSoftClips)
+                    data.erase(data.begin() + frameIndex, data.begin() + frameIndex + opLength);
+
+                // for non-clipping operations
+                else {
+
+                    // maybe add gaps/padding
+                    if (aligned) {
+                        if (type == CigarOperationType::DELETION || type == CigarOperationType::PADDING) {
+                            data.reserve(data.size() + opLength);
+                            data.insert(data.begin() + frameIndex, opLength, 0);
+                        }
+                    }
+
+                    // update index
+                    frameIndex += opLength;
+                }
+            }
+        }
+        frames.Data(data);
+    }
+}
+
+static
+void MaybeClipAndGapifyQualities(const BamRecordImpl& impl,
+                                 const bool aligned,
+                                 const bool exciseSoftClips,
+                                 QualityValues& qualities)
+{
+    if (impl.IsMapped() && (aligned || exciseSoftClips)) {
+
+        size_t qualIndex = 0;
+        const Cigar& cigar = impl.CigarData();
+        Cigar::const_iterator cigarIter = cigar.cbegin();
+        Cigar::const_iterator cigarEnd  = cigar.cend();
+        for (; cigarIter != cigarEnd; ++cigarIter) {
+
+            const CigarOperation& op = (*cigarIter);
+            const CigarOperationType& type = op.Type();
+
+            // do nothing for hard clips
+            if (type != CigarOperationType::HARD_CLIP) {
+                const size_t opLength = op.Length();
+
+                // maybe remove soft clips
+                if (type == CigarOperationType::SOFT_CLIP && exciseSoftClips)
+                    qualities.erase(qualities.begin() + qualIndex, qualities.begin() + qualIndex + opLength);
+
+                // for non-clipping operations
+                else {
+
+                    // maybe add gaps/padding
+                    if (aligned) {
+                        if (type == CigarOperationType::DELETION || type == CigarOperationType::PADDING) {
+                            qualities.reserve(qualities.size() + opLength);
+                            qualities.insert(qualities.begin() + qualIndex, opLength, QualityValue(0));
+                        }
+                    }
+
+                    // update index
+                    qualIndex += opLength;
+                }
+            }
+        }
+    }
+}
+
+static inline
+void MaybeReverseFrames(const bool isReverseStrand,
+                        const Orientation orientation,
+                        std::vector<uint16_t>* data)
+{
+    const bool shouldReverse = isReverseStrand && orientation == Orientation::GENOMIC;
+    if (shouldReverse)
+        std::reverse(data->begin(), data->end());
+}
+
+static inline
+void MaybeReverseFrames(const bool isReverseStrand,
+                        const Orientation orientation,
+                        Frames& frames)
+{
+    const bool shouldReverse = isReverseStrand && orientation == Orientation::GENOMIC;
+    if (shouldReverse)
+        std::reverse(frames.begin(), frames.end());
+}
+
+static inline
+void MaybeReverseQuals(const bool isBamQual,
+                       const bool isReverseStrand,
+                       const Orientation orientation,
+                       QualityValues& quals)
+{
+    const bool shouldReverse = (isBamQual ? isReverseStrand && orientation == Orientation::NATIVE
+                                          : isReverseStrand && orientation == Orientation::GENOMIC);
+    if (shouldReverse)
+        std::reverse(quals.begin(), quals.end());
+}
+
+static inline
+void MaybeReverseComplementSeq(const bool isPulse,
+                               const bool isBamSeq,
+                               const bool isReverseStrand,
+                               const Orientation orientation,
+                               string& seq)
+{
+    const bool shouldReverse = (isBamSeq ? isReverseStrand && orientation == Orientation::NATIVE
+                                         : isReverseStrand && orientation == Orientation::GENOMIC);
+    if (shouldReverse)
+    {
+        if (isPulse)
+            internal::ReverseComplementCaseSens(seq);
+        else
+            internal::ReverseComplement(seq);
+    }
+}
+
+static
+RecordType NameToType(const string& name)
+{
+    if (name == recordTypeName_Subread)
+        return RecordType::SUBREAD;
+    if (name == recordTypeName_Polymerase)
+        return RecordType::POLYMERASE;
+    if (name == recordTypeName_HqRegion)
+        return RecordType::HQREGION;
+    if (name == recordTypeName_CCS)
+        return RecordType::CCS;
+    if (name == recordTypeName_Scrap)
+        return RecordType::SCRAP;
+    return RecordType::UNKNOWN;
+}
+
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+const float BamRecord::photonFactor = 10.0;
+
+BamRecord::BamRecord(void)
+    : alignedStart_(PacBio::BAM::UnmappedPosition)
+    , alignedEnd_(PacBio::BAM::UnmappedPosition)
+{ }
+
+BamRecord::BamRecord(const BamHeader& header)
+    : header_(header)
+    , alignedStart_(PacBio::BAM::UnmappedPosition)
+    , alignedEnd_(PacBio::BAM::UnmappedPosition)
+{ }
+
+BamRecord::BamRecord(const BamRecordImpl& impl)
+    : impl_(impl)
+    , alignedStart_(PacBio::BAM::UnmappedPosition)
+    , alignedEnd_(PacBio::BAM::UnmappedPosition)
+{ }
+
+BamRecord::BamRecord(BamRecordImpl&& impl)
+    : impl_(std::move(impl))
+    , alignedStart_(PacBio::BAM::UnmappedPosition)
+    , alignedEnd_(PacBio::BAM::UnmappedPosition)
+{ }
+
+BamRecord::BamRecord(const BamRecord& other)
+    : impl_(other.impl_)
+    , header_(other.header_)
+    , alignedStart_(other.alignedStart_)
+    , alignedEnd_(other.alignedEnd_)
+{ }
+
+BamRecord::BamRecord(BamRecord&& other)
+    : impl_(std::move(other.impl_))
+    , header_(std::move(other.header_))
+    , alignedStart_(std::move(other.alignedStart_))
+    , alignedEnd_(std::move(other.alignedEnd_))
+{ }
+
+BamRecord& BamRecord::operator=(const BamRecord& other)
+{
+    impl_ = other.impl_;
+    header_ = other.header_;
+    alignedStart_ = other.alignedStart_;
+    alignedEnd_ = other.alignedEnd_;
+    return *this;
+}
+
+BamRecord& BamRecord::operator=(BamRecord&& other)
+{
+    impl_ = std::move(other.impl_);
+    header_ = std::move(other.header_);
+    alignedStart_ = std::move(other.alignedStart_);
+    alignedEnd_ = std::move(other.alignedEnd_);
+    return *this;
+}
+
+BamRecord::~BamRecord(void) { }
+
+Position BamRecord::AlignedEnd(void) const
+{
+    if (alignedEnd_ == PacBio::BAM::UnmappedPosition)
+        CalculateAlignedPositions();
+    return alignedEnd_;
+}
+
+Position BamRecord::AlignedStart(void) const
+{
+    if (alignedStart_ == PacBio::BAM::UnmappedPosition)
+        CalculateAlignedPositions();
+    return alignedStart_;
+}
+
+Strand BamRecord::AlignedStrand(void) const
+{ return impl_.IsReverseStrand() ? Strand::REVERSE : Strand::FORWARD; }
+
+QualityValues BamRecord::AltLabelQV(Orientation orientation) const
+{
+    return FetchQualities(internal::tagName_alternative_labelQV,
+                          orientation);
+}
+
+BamRecord& BamRecord::AltLabelQV(const QualityValues& altLabelQVs)
+{
+    internal::CreateOrEdit(internal::tagName_alternative_labelQV,
+                           altLabelQVs.Fastq(), &impl_);
+    return *this;
+}
+
+std::string BamRecord::AltLabelTag(Orientation orientation) const
+{
+    return FetchBases(internal::tagName_alternative_labelTag,
+                      orientation);
+}
+
+BamRecord& BamRecord::AltLabelTag(const std::string& tags)
+{
+    internal::CreateOrEdit(internal::tagName_alternative_labelTag, tags, &impl_);
+    return *this;
+}
+
+std::pair<int,int> BamRecord::Barcodes(void) const
+{
+    const Tag& bc = impl_.TagValue(internal::tagName_barcodes);
+    if (bc.IsNull())
+        return std::make_pair(-1, -1);
+
+    if (!bc.IsUInt16Array())
+        throw std::runtime_error("Barcode tag bc is not of type uint16_t array.");
+
+    const auto bcArray = bc.ToUInt16Array();
+    if (bcArray.size() != 2)
+        throw std::runtime_error("Barcode array is not of size 2");
+
+    return std::make_pair(bcArray[0], bcArray[1]);
+}
+
+void BamRecord::CalculateAlignedPositions(void) const
+{
+    // reset
+    ResetCachedPositions();
+
+    // skip if unmapped, or has no queryStart/End
+    if (!impl_.IsMapped())
+        return;
+    const Position qStart = QueryStart();
+    const Position qEnd   = QueryEnd();
+    if (qStart == PacBio::BAM::UnmappedPosition || qEnd == PacBio::BAM::UnmappedPosition)
+        return;
+
+    // determine clipped end ranges
+    const Cigar& cigar     = impl_.CigarData();
+    const size_t seqLength = impl_.Sequence().size();
+    const int32_t startOffset = internal::AlignedStartOffset(cigar, seqLength);
+    const int32_t endOffset   = internal::AlignedEndOffset(cigar, seqLength);
+    if (endOffset == -1 || startOffset == -1)
+        return; // TODO: handle error more??
+
+    // store aligned positions (polymerase read coordinates)
+    if (impl_.IsReverseStrand()) {
+        alignedStart_ = qStart + (seqLength - endOffset);
+        alignedEnd_   = qEnd - startOffset;
+    }
+    else {
+        alignedStart_ = qStart + startOffset;
+        alignedEnd_   = qEnd - (seqLength - endOffset);
+    }
+}
+
+Cigar BamRecord::CigarData(void) const
+{ return impl_.CigarData(); }
+
+BamRecord& BamRecord::Clip(const ClipType clipType,
+                           const Position start,
+                           const Position end)
+{
+    // skip if no clip requested
+    if (clipType == ClipType::CLIP_NONE)
+        return *this;
+    const bool clipToQuery = (clipType == ClipType::CLIP_TO_QUERY);
+
+    // cache original coords
+    const Position origQStart = QueryStart();
+    const Position origQEnd   = QueryEnd();
+    const Position origAStart = AlignedStart();
+    const Position origAEnd   = AlignedEnd();
+
+    // only used on mapped records
+    Position origTStart;
+    Position origTEnd;
+    bool isForwardStrand = (AlignedStrand() == Strand::FORWARD);
+
+    // cache any add'l coords, skip out if clip not needed (or not possible)
+    if (clipToQuery) {
+        if (start <= origQStart && end >= origQEnd)
+            return *this;
+    } else {
+
+        assert(clipType == ClipType::CLIP_TO_REFERENCE);
+        if (!IsMapped())
+            return *this;
+
+        origTStart = ReferenceStart();
+        origTEnd   = ReferenceEnd();
+        if (start <= origTStart && end >= origTEnd)
+            return *this;
+
+        assert(origAStart >= origQStart);
+        assert(origAEnd   <= origQEnd);
+    }
+
+    // determine new offsets into data
+    size_t startOffset;
+    size_t endOffset;
+
+    if (clipToQuery) {
+        startOffset = start - origQStart;
+        endOffset   = origQEnd - end;
+    } else {
+
+        const size_t alignedStartOffset = (origAStart - origQStart);
+        const size_t alignedEndOffset = (origQEnd - origAEnd);
+        const size_t tStartDiff = start - origTStart;
+        const size_t tEndDiff   = origTEnd - end;
+
+        if (isForwardStrand) {
+            startOffset = alignedStartOffset + tStartDiff;
+            endOffset = alignedEndOffset + tEndDiff;
+        } else {
+            startOffset = alignedEndOffset + tStartDiff;
+            endOffset = alignedStartOffset + tEndDiff;
+        }
+    }
+
+    size_t queryPosRemovedFront = 0;
+    size_t queryPosRemovedBack  = 0;
+    size_t refPosRemovedFront   = 0;
+    size_t refPosRemovedBack    = 0;
+
+    // if mapped
+    if (IsMapped()) {
+
+        // update CIGAR - clip front ops, then clip back ops
+        Cigar cigar = std::move(impl_.CigarData());
+        size_t offsetRemaining = startOffset;
+        while (offsetRemaining > 0 && !cigar.empty()) {
+            CigarOperation& firstOp = cigar.front();
+            const CigarOperationType firstOpType = firstOp.Type();
+            const size_t firstOpLength = firstOp.Length();
+
+            const bool shouldUpdateQueryPos = ((bam_cigar_type(static_cast<int>(firstOpType)) & 0x1) != 0);
+            const bool shouldUpdateRefPos = ((bam_cigar_type(static_cast<int>(firstOpType)) & 0x2) != 0);
+
+            if (firstOpLength <= offsetRemaining) {
+
+                cigar.erase(cigar.begin());
+
+                if (shouldUpdateQueryPos)
+                    queryPosRemovedFront += firstOpLength;
+                if (shouldUpdateRefPos)
+                    refPosRemovedFront += firstOpLength;
+
+                offsetRemaining -= firstOpLength;
+
+            } else {
+
+                firstOp.Length(firstOpLength - offsetRemaining);
+
+                if (shouldUpdateQueryPos)
+                    queryPosRemovedFront += offsetRemaining;
+                if (shouldUpdateRefPos)
+                    refPosRemovedFront += offsetRemaining;
+
+                offsetRemaining = 0;
+            }
+        }
+
+        offsetRemaining = endOffset;
+        while (offsetRemaining > 0 && !cigar.empty()) {
+            CigarOperation& lastOp = cigar.back();
+            const CigarOperationType lastOpType = lastOp.Type();
+            const size_t lastOpLength = lastOp.Length();
+
+            const bool shouldUpdateQueryPos = ((bam_cigar_type(static_cast<int>(lastOpType)) & 0x1) != 0);
+            const bool shouldUpdateRefPos = ((bam_cigar_type(static_cast<int>(lastOpType)) & 0x2) != 0);
+
+            if (lastOpLength <= offsetRemaining) {
+                cigar.pop_back();
+
+                if (shouldUpdateQueryPos)
+                    queryPosRemovedBack += lastOpLength;
+                if (shouldUpdateRefPos)
+                    refPosRemovedBack += lastOpLength;
+
+                offsetRemaining -= lastOpLength;
+
+            } else {
+                lastOp.Length(lastOpLength - offsetRemaining);
+
+                if (shouldUpdateQueryPos)
+                    queryPosRemovedBack += offsetRemaining;
+                if (shouldUpdateRefPos)
+                    refPosRemovedBack += offsetRemaining;
+
+                offsetRemaining = 0;
+            }
+        }
+        impl_.CigarData(cigar);
+
+        // update aligned reference position
+        if (clipToQuery) {
+            const Position origPosition = impl_.Position();
+            impl_.Position(origPosition + refPosRemovedFront);
+        } else {
+            impl_.Position(start);
+        }
+    }
+
+    const string origSequence = std::move(Sequence(Orientation::GENOMIC));
+    const QualityValues origQualities = std::move(Qualities(Orientation::GENOMIC));
+
+    size_t clipIndex;
+    size_t clipLength;
+    if (clipToQuery) {
+        clipIndex = startOffset;
+        clipLength = (end - start);
+    } else {
+        const size_t origSeqLength = origSequence.length();
+        const size_t newSeqLength = (origSeqLength - queryPosRemovedBack) - queryPosRemovedFront;
+        clipIndex = queryPosRemovedFront;
+        clipLength = newSeqLength;
+    }
+
+    // clip seq, quals
+    const string sequence = std::move(internal::Clip(origSequence, clipIndex, clipLength));
+    const QualityValues qualities = std::move(internal::Clip(origQualities, clipIndex, clipLength));
+    impl_.SetSequenceAndQualities(sequence, qualities.Fastq());
+
+    // clip PacBio tags
+    QualityValues altLabelQV = AltLabelQV(Orientation::GENOMIC);
+    QualityValues labelQV = LabelQV(Orientation::GENOMIC);
+    QualityValues deletionQV = std::move(internal::Clip(DeletionQV(Orientation::GENOMIC), clipIndex, clipLength));
+    QualityValues insertionQV = std::move(internal::Clip(InsertionQV(Orientation::GENOMIC), clipIndex, clipLength));
+    QualityValues mergeQV = std::move(internal::Clip(MergeQV(Orientation::GENOMIC), clipIndex, clipLength));
+    QualityValues pulseMergeQV = std::move(PulseMergeQV(Orientation::GENOMIC));
+    QualityValues substitutionQV = std::move(internal::Clip(SubstitutionQV(Orientation::GENOMIC), clipIndex, clipLength));
+    Frames ipd = std::move(internal::Clip(IPD(Orientation::GENOMIC).Data(), clipIndex, clipLength));
+    Frames pulseWidth = std::move(internal::Clip(PulseWidth(Orientation::GENOMIC).Data(), clipIndex, clipLength));
+    string deletionTag = std::move(internal::Clip(DeletionTag(Orientation::GENOMIC), clipIndex, clipLength));
+    string substitutionTag = std::move(internal::Clip(SubstitutionTag(Orientation::GENOMIC), clipIndex, clipLength));
+    string altLabelTag = AltLabelTag(Orientation::GENOMIC);
+    string pulseCall = std::move(PulseCall(Orientation::GENOMIC));
+    std::vector<float> pkmean = std::move(Pkmean(Orientation::GENOMIC));
+    std::vector<float> pkmid = std::move(Pkmid(Orientation::GENOMIC));
+    Frames prePulseFrames = std::move(PrePulseFrames(Orientation::GENOMIC).Data());
+    Frames pulseCallWidth = std::move(PulseCallWidth(Orientation::GENOMIC).Data());
+
+    // restore native orientation
+    if (!isForwardStrand) {
+        internal::Reverse(altLabelQV);
+        internal::Reverse(labelQV);
+        internal::Reverse(deletionQV);
+        internal::Reverse(insertionQV);
+        internal::Reverse(mergeQV);
+        internal::Reverse(pulseMergeQV);
+        internal::Reverse(substitutionQV);
+        internal::Reverse(ipd);
+        internal::Reverse(pulseWidth);
+        internal::ReverseComplement(deletionTag);
+        internal::ReverseComplement(substitutionTag);
+        internal::ReverseComplement(altLabelTag);
+        internal::ReverseComplementCaseSens(pulseCall);
+        internal::Reverse(pkmean);
+        internal::Reverse(pkmid);
+        internal::Reverse(prePulseFrames);
+        internal::Reverse(pulseCallWidth);
+    }
+
+    // update BAM tags
+    TagCollection tags = impl_.Tags();
+    tags[internal::tagName_alternative_labelQV] = altLabelQV.Fastq();
+    tags[internal::tagName_labelQV]             = labelQV.Fastq();
+    tags[internal::tagName_deletionQV]          = deletionQV.Fastq();
+    tags[internal::tagName_insertionQV]         = insertionQV.Fastq();
+    tags[internal::tagName_mergeQV]             = mergeQV.Fastq();
+    tags[internal::tagName_pulseMergeQV]        = pulseMergeQV.Fastq();
+    tags[internal::tagName_substitutionQV]      = substitutionQV.Fastq();
+    tags[internal::tagName_ipd]                 = ipd.Data();
+    tags[internal::tagName_pulseWidth]          = pulseWidth.Data();
+    tags[internal::tagName_deletionTag]         = deletionTag;
+    tags[internal::tagName_substitutionTag]     = substitutionTag;
+    tags[internal::tagName_alternative_labelTag]= altLabelTag;
+    tags[internal::tagName_pulse_call]          = pulseCall;
+    tags[internal::tagName_pkmean]              = EncodePhotons(pkmean);
+    tags[internal::tagName_pkmid]               = EncodePhotons(pkmid);
+    tags[internal::tagName_pre_pulse_frames]    = prePulseFrames.Data();
+    tags[internal::tagName_pulse_call_width]    = pulseCallWidth.Data();
+    impl_.Tags(tags);
+
+    // update query start/end
+    if (clipToQuery) {
+        internal::CreateOrEdit(internal::tagName_queryStart, start, &impl_);
+        internal::CreateOrEdit(internal::tagName_queryEnd,   end,   &impl_);
+    } else {
+        if (isForwardStrand) {
+            const Position qStart = origQStart + queryPosRemovedFront;
+            const Position qEnd   = origQEnd   - queryPosRemovedBack;
+            internal::CreateOrEdit(internal::tagName_queryStart, qStart, &impl_);
+            internal::CreateOrEdit(internal::tagName_queryEnd,   qEnd,   &impl_);
+        } else {
+            const Position qStart = origQStart + queryPosRemovedBack;
+            const Position qEnd   = origQEnd   - queryPosRemovedFront;
+            internal::CreateOrEdit(internal::tagName_queryStart, qStart, &impl_);
+            internal::CreateOrEdit(internal::tagName_queryEnd,   qEnd,   &impl_);
+        }
+    }
+
+    // reset any cached aligned start/end
+    ResetCachedPositions();
+    return *this;
+}
+
+QualityValues BamRecord::DeletionQV(Orientation orientation,
+                                    bool aligned,
+                                    bool exciseSoftClips) const
+{
+    return FetchQualities(internal::tagName_deletionQV,
+                          orientation,
+                          aligned,
+                          exciseSoftClips);
+}
+
+BamRecord& BamRecord::DeletionQV(const QualityValues& deletionQVs)
+{
+    internal::CreateOrEdit(internal::tagName_deletionQV, deletionQVs.Fastq(), &impl_);
+    return *this;
+}
+
+
+string BamRecord::DeletionTag(Orientation orientation,
+                              bool aligned,
+                              bool exciseSoftClips) const
+{
+    return FetchBases(internal::tagName_deletionTag,
+                      orientation,
+                      aligned,
+                      exciseSoftClips);
+}
+
+BamRecord& BamRecord::DeletionTag(const std::string& tags)
+{
+    internal::CreateOrEdit(internal::tagName_deletionTag, tags, &impl_);
+    return *this;
+}
+
+std::vector<uint16_t>
+BamRecord::EncodePhotons(const std::vector<float>& data)
+{
+    std::vector<uint16_t> encoded;
+    encoded.reserve(data.size());
+    for (const auto& d : data)
+        encoded.emplace_back(d * photonFactor);
+    return encoded;
+}
+
+string BamRecord::FetchBasesRaw(const string& tagName) const
+{
+    const Tag& seqTag = impl_.TagValue(tagName);
+    string seq = seqTag.ToString();
+    return seq;
+}
+
+string BamRecord::FetchBases(const string& tagName,
+                             const Orientation orientation) const
+{
+    const bool isBamSeq = (tagName == internal::tagName_SEQ);
+    const bool isPulse = (tagName == internal::tagName_pulse_call);
+    string seq = FetchBasesRaw(tagName);
+
+    // rev-comp
+    internal::MaybeReverseComplementSeq(isPulse,
+                                        isBamSeq,
+                                        impl_.IsReverseStrand(),
+                                        orientation,
+                                        seq);
+    return seq;
+}
+
+string BamRecord::FetchBases(const string& tagName,
+                             const Orientation orientation,
+                             const bool aligned,
+                             const bool exciseSoftClips) const
+{
+    const bool isPulse = (tagName == internal::tagName_pulse_call);
+    const bool isBamSeq = (tagName == internal::tagName_SEQ);
+
+    // fetch SAM/BAM SEQ field
+    if (isBamSeq) {
+        string seq = std::move(impl_.Sequence());
+
+        // clip / gapify
+        internal::MaybeClipAndGapifyBases(impl_,
+                                          aligned,
+                                          exciseSoftClips,
+                                          seq);
+        // rev-comp
+        internal::MaybeReverseComplementSeq(isPulse,
+                                            isBamSeq,
+                                            impl_.IsReverseStrand(),
+                                            orientation,
+                                            seq);
+        return seq;
+    }
+
+    // other tags of 'bases' type
+    else {
+
+        string seq = FetchBasesRaw(tagName);
+
+        // rev-comp
+        internal::MaybeReverseComplementSeq(isPulse,
+                                            isBamSeq,
+                                            impl_.IsReverseStrand(),
+                                            orientation,
+                                            seq);
+        // clip / gapify
+        internal::MaybeClipAndGapifyBases(impl_,
+                                          aligned,
+                                          exciseSoftClips,
+                                          seq);
+        return seq;
+    }
+}
+
+Frames BamRecord::FetchFramesRaw(const string& tagName) const
+{
+    Frames frames;
+    const Tag& frameTag = impl_.TagValue(tagName);
+    if (frameTag.IsNull())
+        return frames;
+
+    // lossy frame codes
+    if (frameTag.IsUInt8Array()) {
+        const vector<uint8_t> codes = std::move(frameTag.ToUInt8Array());
+        frames = std::move(Frames::Decode(codes));
+    }
+
+    // lossless frame data
+    else {
+        assert(frameTag.IsUInt16Array());
+        const vector<uint16_t> losslessFrames = std::move(frameTag.ToUInt16Array());
+        frames.Data(std::move(losslessFrames));
+    }
+
+    return frames;
+}
+
+Frames BamRecord::FetchFrames(const string& tagName,
+                              const Orientation orientation) const
+{
+    Frames frames = FetchFramesRaw(tagName);
+
+    // reverse, if needed
+    internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+                                 orientation,
+                                 frames);
+
+    return frames;
+}
+
+Frames BamRecord::FetchFrames(const string& tagName,
+                              const Orientation orientation,
+                              const bool aligned,
+                              const bool exciseSoftClips) const
+{
+    Frames frames = FetchFramesRaw(tagName);
+
+    // reverse, if needed
+    internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+                                 orientation,
+                                 frames);
+
+    // clip / gapify
+    internal::MaybeClipAndGapifyFrames(impl_,
+                                      aligned,
+                                      exciseSoftClips,
+                                      frames);
+
+    return frames;
+}
+
+vector<float> BamRecord::FetchPhotons(const string& tagName,
+                                      const Orientation orientation) const
+{
+    const Tag& frameTag = impl_.TagValue(tagName);
+    if (frameTag.IsNull())
+        return vector<float>();
+
+    if(!frameTag.IsUInt16Array())
+        throw std::runtime_error("Photons are not a uint16_t array, tag " + tagName);
+    vector<uint16_t> data = std::move(frameTag.ToUInt16Array());
+
+    // reverse, if needed
+    internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+                                 orientation,
+                                 &data);
+
+    vector<float> photons;
+    photons.reserve(data.size());
+
+    for (const auto& d : data)
+        photons.emplace_back(d / photonFactor);
+
+    return photons;
+}
+
+QualityValues BamRecord::FetchQualitiesRaw(const string& tagName) const
+{
+    const Tag& qvsTag = impl_.TagValue(tagName);
+    return QualityValues::FromFastq(qvsTag.ToString());
+}
+
+QualityValues BamRecord::FetchQualities(const string& tagName,
+                                        const Orientation orientation) const
+{
+    const bool isBamQual = (tagName == internal::tagName_QUAL);
+    // fetch data
+    QualityValues quals = FetchQualitiesRaw(tagName);
+
+    // rev-comp
+    internal::MaybeReverseQuals(isBamQual,
+                                impl_.IsReverseStrand(),
+                                orientation,
+                                quals);
+
+    return quals;
+}
+
+QualityValues BamRecord::FetchQualities(const string& tagName,
+                                        const Orientation orientation,
+                                        const bool aligned,
+                                        const bool exciseSoftClips) const
+{
+    const bool isBamQual = (tagName == internal::tagName_QUAL);
+
+    // fetch SAM/BAM QUAL field
+    if (isBamQual) {
+
+        // fetch data
+        QualityValues quals = std::move(impl_.Qualities());
+
+        // clip / gapify
+        internal::MaybeClipAndGapifyQualities(impl_,
+                                              aligned,
+                                              exciseSoftClips,
+                                              quals);
+
+        // rev-comp
+        internal::MaybeReverseQuals(isBamQual,
+                                    impl_.IsReverseStrand(),
+                                    orientation,
+                                    quals);
+        return quals;
+    }
+
+    // other tags of 'qualities' type
+    else {
+
+        // fetch data
+        QualityValues quals = FetchQualitiesRaw(tagName);
+
+        // rev-comp
+        internal::MaybeReverseQuals(isBamQual,
+                                    impl_.IsReverseStrand(),
+                                    orientation,
+                                    quals);
+        // clip / gapify
+        internal::MaybeClipAndGapifyQualities(impl_,
+                                              aligned,
+                                              exciseSoftClips,
+                                              quals);
+        return quals;
+    }
+}
+
+string BamRecord::FullName(void) const
+{ return impl_.Name(); }
+
+bool BamRecord::HasAltLabelQV(void) const
+{ return impl_.HasTag(internal::tagName_alternative_labelQV); }
+
+bool BamRecord::HasAltLabelTag(void) const
+{ return impl_.HasTag(internal::tagName_alternative_labelTag); }
+
+bool BamRecord::HasBarcodes(void) const
+{ return impl_.HasTag(internal::tagName_barcodes); }
+
+bool BamRecord::HasLabelQV(void) const
+{ return impl_.HasTag(internal::tagName_labelQV); }
+
+bool BamRecord::HasDeletionQV(void) const
+{ return impl_.HasTag(internal::tagName_deletionQV); }
+
+bool BamRecord::HasDeletionTag(void) const
+{ return impl_.HasTag(internal::tagName_deletionTag); }
+
+bool BamRecord::HasHoleNumber(void) const
+{ return impl_.HasTag(internal::tagName_holeNumber)
+          && !impl_.TagValue(internal::tagName_holeNumber).IsNull();
+}
+
+bool BamRecord::HasInsertionQV(void) const
+{ return impl_.HasTag(internal::tagName_insertionQV); }
+
+bool BamRecord::HasPreBaseFrames(void) const
+{ return HasIPD(); }
+
+bool BamRecord::HasIPD(void) const
+{ return impl_.HasTag(internal::tagName_ipd); }
+
+bool BamRecord::HasLocalContextFlags(void) const
+{ return impl_.HasTag(internal::tagName_contextFlags); }
+
+bool BamRecord::HasMergeQV(void) const
+{ return impl_.HasTag(internal::tagName_mergeQV); }
+
+bool BamRecord::HasPulseMergeQV(void) const
+{ return impl_.HasTag(internal::tagName_pulseMergeQV); }
+
+bool BamRecord::HasPkmean(void) const
+{ return impl_.HasTag(internal::tagName_pkmean); }
+
+bool BamRecord::HasPkmid(void) const
+{ return impl_.HasTag(internal::tagName_pkmid); }
+
+bool BamRecord::HasPrePulseFrames(void) const
+{ return impl_.HasTag(internal::tagName_pre_pulse_frames); }
+
+bool BamRecord::HasPulseCall(void) const
+{ return impl_.HasTag(internal::tagName_pulse_call)
+          && !impl_.TagValue(internal::tagName_pulse_call).IsNull();
+}
+
+bool BamRecord::HasPulseCallWidth(void) const
+{ return impl_.HasTag(internal::tagName_pulse_call_width); }
+
+bool BamRecord::HasPulseWidth(void) const
+{ return impl_.HasTag(internal::tagName_pulseWidth); }
+
+bool BamRecord::HasQueryEnd(void) const
+{ return impl_.HasTag(internal::tagName_queryEnd); }
+
+bool BamRecord::HasQueryStart(void) const
+{ return impl_.HasTag(internal::tagName_queryStart); }
+
+bool BamRecord::HasReadAccuracy(void) const
+{ return impl_.HasTag(internal::tagName_readAccuracy)
+          && !impl_.TagValue(internal::tagName_readAccuracy).IsNull();
+}
+
+bool BamRecord::HasScrapType(void) const
+{ return impl_.HasTag(internal::tagName_scrap_type)
+          && !impl_.TagValue(internal::tagName_scrap_type).IsNull();
+}
+
+bool BamRecord::HasSignalToNoise(void) const
+{ return impl_.HasTag(internal::tagName_snr); }
+
+bool BamRecord::HasSubstitutionQV(void) const
+{ return impl_.HasTag(internal::tagName_substitutionQV); }
+
+bool BamRecord::HasSubstitutionTag(void) const
+{ return impl_.HasTag(internal::tagName_substitutionTag); }
+
+BamHeader BamRecord::Header(void) const
+{ return header_; }
+
+int32_t BamRecord::HoleNumber(void) const
+{
+    const Tag& holeNumber = impl_.TagValue(internal::tagName_holeNumber);
+    if (!holeNumber.IsNull())
+        return holeNumber.ToInt32();
+
+    // missing zm tag - try to pull from name
+    return internal::HoleNumberFromName(FullName());
+}
+
+BamRecord& BamRecord::HoleNumber(const int32_t holeNumber)
+{
+    internal::CreateOrEdit(internal::tagName_holeNumber,
+                           holeNumber,
+                           &impl_);
+    return *this;
+}
+
+BamRecordImpl& BamRecord::Impl(void)
+{ return impl_; }
+
+const BamRecordImpl& BamRecord::Impl(void) const
+{ return impl_; }
+
+QualityValues BamRecord::InsertionQV(Orientation orientation,
+                                     bool aligned,
+                                     bool exciseSoftClips) const
+{
+    return FetchQualities(internal::tagName_insertionQV,
+                          orientation,
+                          aligned,
+                          exciseSoftClips);
+}
+
+BamRecord& BamRecord::InsertionQV(const QualityValues& insertionQVs)
+{
+    internal::CreateOrEdit(internal::tagName_insertionQV, insertionQVs.Fastq(), &impl_);
+    return *this;
+}
+
+Frames BamRecord::IPD(Orientation orientation,
+                      bool aligned,
+                      bool exciseSoftClips) const
+{
+    return FetchFrames(internal::tagName_ipd,
+                       orientation,
+                       aligned,
+                       exciseSoftClips);
+}
+
+BamRecord& BamRecord::IPD(const Frames& frames,
+                          const FrameEncodingType encoding)
+{
+    if (encoding == FrameEncodingType::LOSSY)
+        internal::CreateOrEdit(internal::tagName_ipd, frames.Encode(), &impl_);
+    else
+        internal::CreateOrEdit(internal::tagName_ipd, frames.Data(), &impl_);
+    return *this;
+}
+
+Frames BamRecord::PreBaseFrames(Orientation orientation, 
+                                bool aligned,
+                                bool exciseSoftClips) const
+{ return IPD(orientation,aligned,exciseSoftClips); }
+
+BamRecord& BamRecord::PreBaseFrames(const Frames& frames,
+                                    const FrameEncodingType encoding)
+{ return IPD(frames, encoding); }
+
+Frames BamRecord::IPDRaw(Orientation orientation) const
+{
+    const auto tagName = internal::tagName_ipd;
+
+    Frames frames;
+    const Tag& frameTag = impl_.TagValue(tagName);
+    if (frameTag.IsNull())
+        return frames;
+
+    // lossy frame codes
+    if (frameTag.IsUInt8Array()) {
+        const vector<uint8_t> codes = std::move(frameTag.ToUInt8Array());
+        const vector<uint16_t> codes16(codes.begin(), codes.end());
+        frames.Data(std::move(codes16));
+    }
+
+    // lossless frame data
+    else {
+        assert(frameTag.IsUInt16Array());
+        const vector<uint16_t> losslessFrames = std::move(frameTag.ToUInt16Array());
+        frames.Data(std::move(losslessFrames));
+    }
+
+    // reverse, if needed
+    internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+                                 orientation,
+                                 frames);
+
+    return frames;
+}
+
+Frames BamRecord::PulseWidthRaw(Orientation orientation) const
+{
+    const auto tagName = internal::tagName_pulseWidth;
+
+    Frames frames;
+    const Tag& frameTag = impl_.TagValue(tagName);
+    if (frameTag.IsNull())
+        return frames;
+
+    // lossy frame codes
+    if (frameTag.IsUInt8Array()) {
+        const vector<uint8_t> codes = std::move(frameTag.ToUInt8Array());
+        const vector<uint16_t> codes16(codes.begin(), codes.end());
+        frames.Data(std::move(codes16));
+    }
+
+    // lossless frame data
+    else {
+        assert(frameTag.IsUInt16Array());
+        const vector<uint16_t> losslessFrames = std::move(frameTag.ToUInt16Array());
+        frames.Data(std::move(losslessFrames));
+    }
+
+    // reverse, if needed
+    internal::MaybeReverseFrames(impl_.IsReverseStrand(),
+                                 orientation,
+                                 frames);
+
+    return frames;
+}
+
+bool BamRecord::IsMapped(void) const
+{ return impl_.IsMapped(); }
+
+QualityValues BamRecord::LabelQV(Orientation orientation) const
+{
+    return FetchQualities(internal::tagName_labelQV,
+                          orientation);
+}
+
+BamRecord& BamRecord::LabelQV(const QualityValues& labelQVs)
+{
+    internal::CreateOrEdit(internal::tagName_labelQV, labelQVs.Fastq(), &impl_);
+    return *this;
+}
+
+LocalContextFlags BamRecord::LocalContextFlags(void) const
+{
+    const Tag& cxTag = impl_.TagValue(internal::tagName_contextFlags);
+    return static_cast<PacBio::BAM::LocalContextFlags>(cxTag.ToUInt8());
+}
+
+BamRecord& BamRecord::LocalContextFlags(const PacBio::BAM::LocalContextFlags flags)
+{
+    internal::CreateOrEdit(internal::tagName_contextFlags,
+                           static_cast<uint8_t>(flags),
+                           &impl_);
+    return *this;
+}
+
+BamRecord& BamRecord::Map(const int32_t referenceId,
+                          const Position refStart,
+                          const Strand strand,
+                          const Cigar& cigar,
+                          const uint8_t mappingQuality)
+{
+    impl_.Position(refStart);
+    impl_.ReferenceId(referenceId);
+    impl_.CigarData(cigar);
+    impl_.MapQuality(mappingQuality);
+    impl_.SetMapped(true);
+
+    if (strand == Strand::FORWARD)
+        impl_.SetReverseStrand(false);
+
+    else {
+        assert(strand == Strand::REVERSE);
+        impl_.SetReverseStrand(true);
+
+        // switch seq & qual
+        string sequence  = impl_.Sequence();
+        QualityValues qualities = impl_.Qualities();
+
+        internal::ReverseComplement(sequence);
+        internal::Reverse(qualities);
+
+        impl_.SetSequenceAndQualities(sequence, qualities.Fastq());
+    }
+
+    // reset any cached aligned start/end
+    alignedStart_ = PacBio::BAM::UnmappedPosition;
+    alignedEnd_ = PacBio::BAM::UnmappedPosition;
+
+    return *this;
+}
+
+uint8_t BamRecord::MapQuality(void) const
+{ return impl_.MapQuality(); }
+
+QualityValues BamRecord::MergeQV(Orientation orientation,
+                                 bool aligned,
+                                 bool exciseSoftClips) const
+{
+    return FetchQualities(internal::tagName_mergeQV,
+                          orientation,
+                          aligned,
+                          exciseSoftClips);
+}
+
+BamRecord& BamRecord::MergeQV(const QualityValues& mergeQVs)
+{
+    internal::CreateOrEdit(internal::tagName_mergeQV, mergeQVs.Fastq(), &impl_);
+    return *this;
+}
+
+QualityValues BamRecord::PulseMergeQV(Orientation orientation) const
+{
+    return FetchQualities(internal::tagName_pulseMergeQV, orientation);
+}
+
+BamRecord& BamRecord::PulseMergeQV(const QualityValues& mergeQVs)
+{
+    internal::CreateOrEdit(internal::tagName_pulseMergeQV, mergeQVs.Fastq(), &impl_);
+    return *this;
+}
+
+string BamRecord::MovieName(void) const
+{ return ReadGroup().MovieName(); }
+
+int32_t BamRecord::NumPasses(void) const
+{
+    const Tag& numPasses = impl_.TagValue(internal::tagName_numPasses);
+    return numPasses.ToInt32();
+}
+
+BamRecord& BamRecord::NumPasses(const int32_t numPasses)
+{
+    internal::CreateOrEdit(internal::tagName_numPasses, numPasses, &impl_);
+    return *this;
+}
+
+std::vector<float> BamRecord::Pkmean(Orientation orientation) const
+{
+    return FetchPhotons(internal::tagName_pkmean, orientation);
+}
+
+BamRecord& BamRecord::Pkmean(const std::vector<float>& photons)
+{
+    Pkmean(EncodePhotons(photons));
+    return *this;
+}
+
+BamRecord& BamRecord::Pkmean(const std::vector<uint16_t>& encodedPhotons)
+{
+    internal::CreateOrEdit(internal::tagName_pkmean, encodedPhotons, &impl_);
+    return *this;
+}
+
+std::vector<float> BamRecord::Pkmid(Orientation orientation) const
+{
+    return FetchPhotons(internal::tagName_pkmid, orientation);
+}
+
+BamRecord& BamRecord::Pkmid(const std::vector<float>& photons)
+{
+    Pkmid(EncodePhotons(photons));
+    return *this;
+}
+
+BamRecord& BamRecord::Pkmid(const std::vector<uint16_t>& encodedPhotons)
+{
+    internal::CreateOrEdit(internal::tagName_pkmid, encodedPhotons, &impl_);
+    return *this;
+}
+
+Frames BamRecord::PrePulseFrames(Orientation orientation) const
+{
+    return FetchFrames(internal::tagName_pre_pulse_frames, orientation);
+}
+
+BamRecord& BamRecord::PrePulseFrames(const Frames& frames,
+                                     const FrameEncodingType encoding)
+{
+    if (encoding == FrameEncodingType::LOSSY)
+        internal::CreateOrEdit(internal::tagName_pre_pulse_frames, frames.Encode(), &impl_);
+    else
+        internal::CreateOrEdit(internal::tagName_pre_pulse_frames, frames.Data(), &impl_);
+    return *this;
+}
+
+std::string BamRecord::PulseCall(Orientation orientation) const
+{
+    return FetchBases(internal::tagName_pulse_call, orientation);
+}
+
+BamRecord& BamRecord::PulseCall(const std::string& tags)
+{
+    internal::CreateOrEdit(internal::tagName_pulse_call, tags, &impl_);
+    return *this;
+}
+
+Frames BamRecord::PulseCallWidth(Orientation orientation) const
+{
+    return FetchFrames(internal::tagName_pulse_call_width, orientation);
+}
+
+BamRecord& BamRecord::PulseCallWidth(const Frames& frames,
+                                     const FrameEncodingType encoding)
+{
+    if (encoding == FrameEncodingType::LOSSY)
+        internal::CreateOrEdit(internal::tagName_pulse_call_width, frames.Encode(), &impl_);
+    else
+        internal::CreateOrEdit(internal::tagName_pulse_call_width, frames.Data(), &impl_);
+    return *this;
+}
+
+Frames BamRecord::PulseWidth(Orientation orientation,
+                             bool aligned,
+                             bool exciseSoftClips) const
+{
+    return FetchFrames(internal::tagName_pulseWidth,
+                       orientation,
+                       aligned,
+                       exciseSoftClips);
+}
+
+BamRecord& BamRecord::PulseWidth(const Frames& frames,
+                                 const FrameEncodingType encoding)
+{
+    if (encoding == FrameEncodingType::LOSSY)
+        internal::CreateOrEdit(internal::tagName_pulseWidth, frames.Encode(), &impl_);
+    else
+        internal::CreateOrEdit(internal::tagName_pulseWidth, frames.Data(), &impl_);
+    return *this;
+}
+
+QualityValues BamRecord::Qualities(Orientation orientation,
+                                   bool aligned,
+                                   bool exciseSoftClips) const
+{
+    return FetchQualities("QUAL",
+                          orientation,
+                          aligned,
+                          exciseSoftClips);
+}
+
+Position BamRecord::QueryEnd(void) const
+{
+    // try 'qe' tag
+    const Tag& qe = impl_.TagValue(internal::tagName_queryEnd);
+    if (!qe.IsNull())
+        return qe.ToInt32();
+
+    // tag missing, need to check movie name (fallback for non-PB BAMs, but ignore for CCS reads)
+    RecordType type;
+    try {
+        type = Type();
+    } catch (std::exception&) {
+        return Position(0);
+    }
+    if (type == RecordType::CCS)
+        throw std::runtime_error("no query end for CCS read type");
+
+    // PacBio BAM, non-CCS
+    try {
+        return internal::QueryEndFromName(FullName());
+    } catch (std::exception&) {
+        // return fallback position
+        return Position(0);
+    }
+}
+
+BamRecord& BamRecord::QueryEnd(const Position pos)
+{
+   internal::CreateOrEdit(internal::tagName_queryEnd,
+                          (int32_t)pos,
+                          &impl_);
+   UpdateName();
+   return *this;
+}
+
+Position BamRecord::QueryStart(void) const
+{
+    // try 'qs' tag
+    const Tag& qs = impl_.TagValue(internal::tagName_queryStart);
+    if (!qs.IsNull())
+        return qs.ToInt32();
+
+    // tag missing, need to check movie name (fallback for non-PB BAMs, but ignore for CCS reads)
+    RecordType type;
+    try {
+        type = Type();
+    } catch (std::exception&) {
+        return Position(0);
+    }
+    if (type == RecordType::CCS)
+        throw std::runtime_error("no query start for CCS read type");
+
+    // PacBio BAM, non-CCS
+    try {
+        return internal::QueryStartFromName(FullName());
+    } catch (std::exception&) {
+        // return fallback position
+        return Position(0);
+    }
+}
+
+BamRecord& BamRecord::QueryStart(const Position pos)
+{
+   internal::CreateOrEdit(internal::tagName_queryStart,
+                          (int32_t)pos,
+                          &impl_);
+   UpdateName();
+   return *this;
+}
+
+
+Accuracy BamRecord::ReadAccuracy(void) const
+{
+    const Tag& readAccuracy = impl_.TagValue(internal::tagName_readAccuracy);
+    return Accuracy(readAccuracy.ToInt32());
+}
+
+BamRecord& BamRecord::ReadAccuracy(const Accuracy& accuracy)
+{
+    internal::CreateOrEdit(internal::tagName_readAccuracy,
+                           static_cast<int32_t>(accuracy),
+                           &impl_);
+    return *this;
+}
+
+ReadGroupInfo BamRecord::ReadGroup(void) const
+{ return header_.ReadGroup(ReadGroupId()); }
+
+BamRecord& BamRecord::ReadGroup(const ReadGroupInfo& rg)
+{
+   internal::CreateOrEdit(internal::tagName_readGroup, rg.Id(), &impl_);
+   UpdateName();
+   return *this;
+}
+
+string BamRecord::ReadGroupId(void) const
+{
+    const Tag& rgTag = impl_.TagValue(internal::tagName_readGroup);
+    if (rgTag.IsNull())
+        return string();
+    return rgTag.ToString();
+}
+
+BamRecord& BamRecord::ReadGroupId(const std::string& id)
+{
+   internal::CreateOrEdit(internal::tagName_readGroup,
+                          id,
+                          &impl_);
+   UpdateName();
+   return *this;
+}
+
+Position BamRecord::ReferenceEnd(void) const
+{
+    if (!impl_.IsMapped())
+        return PacBio::BAM::UnmappedPosition;
+    PBBAM_SHARED_PTR<bam1_t> htsData = internal::BamRecordMemory::GetRawData(impl_);
+    if (!htsData)
+        return PacBio::BAM::UnmappedPosition;
+    return bam_endpos(htsData.get());
+}
+
+int32_t BamRecord::ReferenceId(void) const
+{ return impl_.ReferenceId(); }
+
+std::string BamRecord::ReferenceName(void) const
+{
+    if (IsMapped())
+        return Header().SequenceName(ReferenceId());
+    else
+        throw std::runtime_error("unmapped record has no associated reference name");
+}
+
+Position BamRecord::ReferenceStart(void) const
+{ return impl_.Position(); }
+
+void BamRecord::ResetCachedPositions(void) const
+{
+    alignedEnd_   = PacBio::BAM::UnmappedPosition;
+    alignedStart_ = PacBio::BAM::UnmappedPosition;
+}
+
+void BamRecord::ResetCachedPositions(void)
+{
+    alignedEnd_   = PacBio::BAM::UnmappedPosition;
+    alignedStart_ = PacBio::BAM::UnmappedPosition;
+}
+
+VirtualRegionType BamRecord::ScrapType(void) const
+{
+    const Tag& scTag = impl_.TagValue(internal::tagName_scrap_type);
+    return VirtualRegionTypeMap::ParseChar[scTag.ToUInt8()];
+}
+
+BamRecord& BamRecord::ScrapType(const VirtualRegionType type)
+{
+    internal::CreateOrEdit(internal::tagName_scrap_type,
+                           static_cast<uint8_t>(type), &impl_);
+    return *this;
+}
+
+BamRecord& BamRecord::ScrapType(const char type)
+{
+    internal::CreateOrEdit(internal::tagName_scrap_type, type, &impl_);
+    return *this;
+}
+
+std::string BamRecord::Sequence(const Orientation orientation,
+                                bool aligned,
+                                bool exciseSoftClips) const
+{
+    return FetchBases("SEQ",
+                      orientation,
+                      aligned,
+                      exciseSoftClips);
+}
+
+vector<float> BamRecord::SignalToNoise(void) const
+{
+    const Tag& snTag = impl_.TagValue(internal::tagName_snr);
+    return snTag.ToFloatArray();
+}
+
+BamRecord& BamRecord::SignalToNoise(const vector<float>& snr)
+{
+    internal::CreateOrEdit(internal::tagName_snr, snr, &impl_);
+    return *this;
+}
+
+QualityValues BamRecord::SubstitutionQV(Orientation orientation,
+                                        bool aligned,
+                                        bool exciseSoftClips) const
+{
+    return FetchQualities(internal::tagName_substitutionQV,
+                          orientation,
+                          aligned,
+                          exciseSoftClips);
+}
+
+BamRecord& BamRecord::SubstitutionQV(const QualityValues& substitutionQVs)
+{
+    internal::CreateOrEdit(internal::tagName_substitutionQV, substitutionQVs.Fastq(), &impl_);
+    return *this;
+}
+
+
+
+std::string BamRecord::SubstitutionTag(Orientation orientation,
+                                        bool aligned,
+                                        bool exciseSoftClips) const
+{
+    return FetchBases(internal::tagName_substitutionTag,
+                      orientation,
+                      aligned,
+                      exciseSoftClips);
+}
+
+BamRecord& BamRecord::SubstitutionTag(const std::string& tags)
+{
+    internal::CreateOrEdit(internal::tagName_substitutionTag, tags, &impl_);
+    return *this;
+}
+
+RecordType BamRecord::Type(void) const
+{
+    try {
+        const string& typeName = ReadGroup().ReadType();
+        return internal::NameToType(typeName);
+    } catch (std::exception&) {
+
+        // read group not found
+        // peek at name to see if we're CCS
+        if (FullName().find("ccs") != string::npos)
+            return RecordType::CCS;
+
+        // otherwise unknown
+        else
+            return RecordType::UNKNOWN;
+    }
+}
+
+void BamRecord::UpdateName()
+{
+    std::string newName;
+    newName.reserve(100);
+
+    newName += MovieName();
+    newName += "/";
+
+    if (HasHoleNumber())
+        newName += std::to_string(HoleNumber());
+    else
+        newName += "?";
+
+    newName += "/";
+
+    if (Type() == RecordType::CCS)
+        newName += "ccs";
+    else {
+        if (HasQueryStart())
+            newName += std::to_string(QueryStart());
+        else
+            newName += "?";
+
+        newName += '_';
+
+        if (HasQueryEnd())
+            newName += std::to_string(QueryEnd());
+        else
+            newName += "?";
+    }
+
+    impl_.Name(newName);
+}
diff --git a/src/BamRecordBuilder.cpp b/src/BamRecordBuilder.cpp
new file mode 100644
index 0000000..b37f7ba
--- /dev/null
+++ b/src/BamRecordBuilder.cpp
@@ -0,0 +1,393 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamRecordBuilder.h"
+#include "pbbam/BamTagCodec.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include <htslib/sam.h>
+#include <cstring>
+#include <memory>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+BamRecordBuilder::BamRecordBuilder(void)
+{
+    // ensure proper clean slate
+    Reset();
+
+    // initialize with some space for data
+    name_.reserve(256);
+    sequence_.reserve(2096);
+    qualities_.reserve(2096);
+    cigar_.reserve(256);
+}
+
+BamRecordBuilder::BamRecordBuilder(const BamHeader& header)
+    : header_(header)
+{
+    // ensure proper clean slate
+    Reset();
+
+    // initialize with some space for data
+    name_.reserve(256);
+    sequence_.reserve(2096);
+    qualities_.reserve(2096);
+    cigar_.reserve(256);
+}
+
+BamRecordBuilder::BamRecordBuilder(const BamRecord& prototype)
+    : header_(prototype.Header())
+{
+    Reset(prototype);
+}
+
+BamRecordBuilder::BamRecordBuilder(const BamRecordBuilder& other)
+    : core_(other.core_)
+    , name_(other.name_)
+    , sequence_(other.sequence_)
+    , qualities_(other.qualities_)
+    , cigar_(other.cigar_)
+    , tags_(other.tags_)
+{ }
+
+BamRecordBuilder::BamRecordBuilder(BamRecordBuilder&& other)
+    : core_(std::move(other.core_))
+    , name_(std::move(other.name_))
+    , sequence_(std::move(other.sequence_))
+    , qualities_(std::move(other.qualities_))
+    , cigar_(std::move(other.cigar_))
+    , tags_(std::move(other.tags_))
+{  }
+
+BamRecordBuilder& BamRecordBuilder::operator=(const BamRecordBuilder& other)
+{
+    core_ = other.core_;
+    name_ = other.name_;
+    sequence_  = other.sequence_;
+    qualities_ = other.qualities_;
+    cigar_ = other.cigar_;
+    tags_  = other.tags_;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::operator=(BamRecordBuilder&& other)
+{
+    core_ = std::move(other.core_);
+    name_ = std::move(other.name_);
+    sequence_  = std::move(other.sequence_);
+    qualities_ = std::move(other.qualities_);
+    cigar_ = std::move(other.cigar_);
+    tags_  = std::move(other.tags_);
+    return *this;
+}
+
+BamRecordBuilder::~BamRecordBuilder(void) { }
+
+BamRecord BamRecordBuilder::Build(void) const
+{
+    BamRecord result(header_);
+    BuildInPlace(result);
+    return result;
+}
+
+bool BamRecordBuilder::BuildInPlace(BamRecord& record) const
+{
+    // initialize with basic 'core data'
+    PBBAM_SHARED_PTR<bam1_t> recordRawData = internal::BamRecordMemory::GetRawData(record); /*   record.impl_.RawData().get();*/
+    PB_ASSERT_OR_RETURN_VALUE(recordRawData, false);
+    PB_ASSERT_OR_RETURN_VALUE(recordRawData->data, false);
+    recordRawData->core = core_;
+
+    // setup variable length data
+    const vector<uint8_t> encodedTags = std::move(BamTagCodec::Encode(tags_));
+
+    const size_t nameLength  = name_.size() + 1;
+    const size_t numCigarOps = cigar_.size();
+    const size_t cigarLength = numCigarOps * sizeof(uint32_t);
+    const size_t seqLength   = sequence_.size();
+    const size_t qualLength  = seqLength;
+    const size_t tagLength   = encodedTags.size();
+    const size_t dataLength  = nameLength + cigarLength + seqLength + qualLength + tagLength;
+
+    // realloc if necessary
+    uint8_t* varLengthDataBlock = recordRawData->data;
+    PB_ASSERT_OR_RETURN_VALUE(varLengthDataBlock, false);
+    size_t allocatedDataLength = recordRawData->m_data;
+    if (allocatedDataLength < dataLength) {
+        allocatedDataLength = dataLength;
+        kroundup32(allocatedDataLength);
+        varLengthDataBlock = (uint8_t*)realloc(varLengthDataBlock, allocatedDataLength);
+    }
+    recordRawData->data = varLengthDataBlock;
+    recordRawData->l_data = dataLength;
+    recordRawData->m_data = allocatedDataLength;
+
+    size_t index = 0;
+
+    // name
+    memcpy(&varLengthDataBlock[index], name_.c_str(), nameLength);
+    index += nameLength;
+
+    // cigar
+    if (cigarLength > 0) {
+        vector<uint32_t> encodedCigar(numCigarOps);
+        for (size_t i = 0; i < numCigarOps; ++i) {
+            const CigarOperation& op = cigar_.at(i);
+            encodedCigar[i] = op.Length() << BAM_CIGAR_SHIFT;
+            const uint8_t type = static_cast<uint8_t>(op.Type());
+            PB_ASSERT_OR_RETURN_VALUE(type >= 0 && type < 8, false);
+            encodedCigar[i] |= type;
+        }
+        memcpy(&varLengthDataBlock[index], &encodedCigar[0], cigarLength);
+        index += cigarLength;
+
+        // update bin after we've calculated cigar info
+        const int32_t endPosition = bam_cigar2rlen(recordRawData->core.n_cigar, &encodedCigar[0]);
+        recordRawData->core.bin = hts_reg2bin(core_.pos, endPosition, 14, 5);
+    }
+
+    // seq & qual
+    if (seqLength > 0) {
+
+        uint8_t* s = &varLengthDataBlock[index];
+        for (size_t i = 0; i < seqLength; ++i)
+            s[i>>1] |= ( seq_nt16_table[static_cast<int>(sequence_.at(i))] << ((~i&1)<<2) );
+        index += seqLength;
+
+        uint8_t* q = &varLengthDataBlock[index];
+        if (!qualities_.empty())
+            memset(q, 0xFF, seqLength);
+        else {
+            for (size_t i = 0; i < seqLength; ++i)
+                q[i] = qualities_.at(i) - 33;
+        }
+        index += seqLength;
+    }
+
+    // tags
+    if (tagLength > 0) {
+        PB_ASSERT_OR_RETURN_VALUE(!encodedTags.empty(), false);
+        memcpy(&varLengthDataBlock[index], &encodedTags[0], tagLength);
+        index += tagLength;
+    }
+
+    // sanity check
+    PB_ASSERT_OR_RETURN_VALUE(index == dataLength, false);
+    return true;
+}
+
+BamRecordBuilder& BamRecordBuilder::Cigar(const PacBio::BAM::Cigar& cigar)
+{
+    core_.n_cigar = cigar.size();
+    cigar_ = cigar;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::Cigar(PacBio::BAM::Cigar&& cigar)
+{
+    core_.n_cigar = cigar.size();
+    cigar_ = std::move(cigar);
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::Name(const std::string& name)
+{
+    core_.l_qname = name.size() + 1; // (NULL-term)
+    name_ = name;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::Name(std::string&& name)
+{
+    core_.l_qname = name.size() + 1; // (NULL-term)
+    name_ = std::move(name);
+    return *this;
+}
+
+void BamRecordBuilder::Reset(void)
+{
+    // zeroize fixed-length data
+    memset(&core_, 0, sizeof(bam1_core_t));
+    core_.l_qname = 1; // always has a NULL-term
+
+    // reset variable-length data
+    name_.clear();
+    sequence_.clear();
+    qualities_.clear();
+    cigar_.clear();
+    tags_.clear();
+}
+
+void BamRecordBuilder::Reset(const BamRecord& prototype)
+{
+    // ensure clean slate
+    Reset();
+    header_ = prototype.Header();
+
+    // reset core data
+    const PBBAM_SHARED_PTR<bam1_t> rawData = internal::BamRecordMemory::GetRawData(prototype); //  prototype.impl_.RawData().get();
+    PB_ASSERT_OR_RETURN(rawData);
+    core_ = rawData->core;
+
+    // reset variable-length data
+    const BamRecordImpl& impl = internal::BamRecordMemory::GetImpl(prototype);
+    name_ = impl.Name();
+    sequence_ = impl.Sequence();
+    qualities_ = impl.Qualities().Fastq();
+    cigar_ = impl.CigarData();
+    tags_ = impl.Tags();
+}
+
+void BamRecordBuilder::Reset(BamRecord&& prototype)
+{
+    // ensure clean slate
+    Reset();
+    header_ = std::move(prototype.Header());
+
+    // reset core data
+    const PBBAM_SHARED_PTR<bam1_t> rawData = internal::BamRecordMemory::GetRawData(prototype); //  prototype.impl_.RawData().get();
+    PB_ASSERT_OR_RETURN(rawData);
+    core_ = std::move(rawData->core);
+
+    // reset variable-length data
+    const BamRecordImpl& impl = internal::BamRecordMemory::GetImpl(prototype);
+    name_ = std::move(impl.Name());
+    sequence_ = std::move(impl.Sequence());
+    qualities_ = std::move(impl.Qualities().Fastq());
+    cigar_ = std::move(impl.CigarData());
+    tags_ = std::move(impl.Tags());
+}
+
+BamRecordBuilder& BamRecordBuilder::Sequence(const std::string& sequence)
+{
+    core_.l_qseq = sequence.size();
+    sequence_ = sequence;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::Sequence(std::string&& sequence)
+{
+    core_.l_qseq = sequence.size();
+    sequence_ = std::move(sequence);
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetDuplicate(bool ok)
+{
+    if (ok) core_.flag |=  BamRecordImpl::DUPLICATE;
+    else    core_.flag &= ~BamRecordImpl::DUPLICATE;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetFailedQC(bool ok)
+{
+    if (ok) core_.flag |=  BamRecordImpl::FAILED_QC;
+    else    core_.flag &= ~BamRecordImpl::FAILED_QC;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetFirstMate(bool ok)
+{
+    if (ok) core_.flag |=  BamRecordImpl::MATE_1;
+    else    core_.flag &= ~BamRecordImpl::MATE_1;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetMapped(bool ok)
+{
+    if (ok) core_.flag &= ~BamRecordImpl::UNMAPPED;
+    else    core_.flag |=  BamRecordImpl::UNMAPPED;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetMateMapped(bool ok)
+{
+    if (ok) core_.flag &= ~BamRecordImpl::MATE_UNMAPPED;
+    else    core_.flag |=  BamRecordImpl::MATE_UNMAPPED;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetMateReverseStrand(bool ok)
+{
+    if (ok) core_.flag |=  BamRecordImpl::MATE_REVERSE_STRAND;
+    else    core_.flag &= ~BamRecordImpl::MATE_REVERSE_STRAND;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetPaired(bool ok)
+{
+    if (ok) core_.flag |=  BamRecordImpl::PAIRED;
+    else    core_.flag &= ~BamRecordImpl::PAIRED;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetPrimaryAlignment(bool ok)
+{
+    if (ok) core_.flag &= ~BamRecordImpl::SECONDARY;
+    else    core_.flag |=  BamRecordImpl::SECONDARY;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetProperPair(bool ok)
+{
+    if (ok) core_.flag |=  BamRecordImpl::PROPER_PAIR;
+    else    core_.flag &= ~BamRecordImpl::PROPER_PAIR;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetReverseStrand(bool ok)
+{
+    if (ok) core_.flag |=  BamRecordImpl::REVERSE_STRAND;
+    else    core_.flag &= ~BamRecordImpl::REVERSE_STRAND;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetSecondMate(bool ok)
+{
+    if (ok) core_.flag |=  BamRecordImpl::MATE_2;
+    else    core_.flag &= ~BamRecordImpl::MATE_2;
+    return *this;
+}
+
+BamRecordBuilder& BamRecordBuilder::SetSupplementaryAlignment(bool ok)
+{
+    if (ok) core_.flag |=  BamRecordImpl::SUPPLEMENTARY;
+    else    core_.flag &= ~BamRecordImpl::SUPPLEMENTARY;
+    return *this;
+}
diff --git a/src/BamRecordImpl.cpp b/src/BamRecordImpl.cpp
new file mode 100644
index 0000000..46632b3
--- /dev/null
+++ b/src/BamRecordImpl.cpp
@@ -0,0 +1,426 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamRecordImpl.h"
+#include "pbbam/BamTagCodec.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include <algorithm>
+#include <iostream>
+#include <utility>
+#include <cstdlib>
+#include <cstring>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+BamRecordImpl::BamRecordImpl(void)
+    : d_(nullptr)
+{
+    InitializeData();
+}
+
+BamRecordImpl::BamRecordImpl(const BamRecordImpl& other)
+    : d_(bam_dup1(other.d_.get()), internal::HtslibRecordDeleter())
+{ }
+
+BamRecordImpl::BamRecordImpl(BamRecordImpl&& other)
+    : d_(nullptr)
+{
+    d_.swap(other.d_);
+    other.d_.reset();
+}
+
+BamRecordImpl& BamRecordImpl::operator=(const BamRecordImpl& other)
+{
+    if (this != & other) {
+        if (d_ == nullptr)
+            InitializeData();
+        bam_copy1(d_.get(), other.d_.get());
+    }
+    return *this;
+}
+
+BamRecordImpl& BamRecordImpl::operator=(BamRecordImpl&& other)
+{
+    if (this != & other) {
+        d_.swap(other.d_);
+        other.d_.reset();
+    }
+    return *this;
+}
+
+BamRecordImpl::~BamRecordImpl(void) { }
+
+bool BamRecordImpl::AddTag(const string& tagName, const Tag &value)
+{
+    if (tagName.size() != 2 || HasTag(tagName))
+        return false;
+
+    const vector<uint8_t> rawData = std::move(BamTagCodec::ToRawData(value));
+    if (rawData.empty())
+        return false;
+
+    bam_aux_append(d_.get(),
+                   tagName.c_str(),
+                   BamTagCodec::TagTypeCode(value),
+                   rawData.size(),
+                   const_cast<uint8_t*>(rawData.data()));
+
+    return true;
+}
+
+Cigar BamRecordImpl::CigarData(void) const
+{
+    Cigar result;
+    result.reserve(d_->core.n_cigar);
+    uint32_t* cigarData = bam_get_cigar(d_);
+    for (uint32_t i = 0; i < d_->core.n_cigar; ++i) {
+        const uint32_t length = bam_cigar_oplen(cigarData[i]);
+        const char type = bam_cigar_opchr(cigarData[i]);
+        result.push_back(CigarOperation(type, length));
+    }
+
+    return result;
+}
+
+BamRecordImpl& BamRecordImpl::CigarData(const Cigar& cigar)
+{
+    // determine change in memory needed
+    // diffNumBytes: pos -> growing, neg -> shrinking
+    const size_t numCigarOps = cigar.size();
+    const int diffNumCigars = numCigarOps - d_->core.n_cigar;
+    const int diffNumBytes  = diffNumCigars * sizeof(uint32_t);
+    const int oldLengthData = d_->l_data;
+    d_->l_data += diffNumBytes;
+    MaybeReallocData();
+
+    // shift trailing data (seq, qual, tags) as needed
+    const uint8_t* oldSequenceStart = bam_get_seq(d_);
+    const size_t trailingDataLength = oldLengthData - (oldSequenceStart - d_->data);
+    d_->core.n_cigar = numCigarOps;
+    uint8_t* newSequenceStart = bam_get_seq(d_);
+    memmove(newSequenceStart, oldSequenceStart, trailingDataLength);
+
+    // fill in new CIGAR data
+    uint32_t* cigarDataStart = bam_get_cigar(d_);
+    for (size_t i = 0; i < numCigarOps; ++i) {
+        const CigarOperation& cigarOp = cigar.at(i);
+        cigarDataStart[i] = bam_cigar_gen(cigarOp.Length(), static_cast<int>(cigarOp.Type()));
+    }
+
+    return *this;
+}
+
+BamRecordImpl& BamRecordImpl::CigarData(const std::string& cigarString)
+{
+    return CigarData(Cigar::FromStdString(cigarString));
+}
+
+bool BamRecordImpl::EditTag(const string& tagName, const Tag &newValue)
+{
+    return RemoveTag(tagName) && AddTag(tagName, newValue);
+}
+
+BamRecordImpl BamRecordImpl::FromRawData(const PBBAM_SHARED_PTR<bam1_t>& rawData)
+{
+    BamRecordImpl result;
+    bam_copy1(result.d_.get(), rawData.get());
+    return result;
+}
+
+bool BamRecordImpl::HasTag(const string& tagName) const
+{
+    if (tagName.size() != 2)
+        return false;
+    return bam_aux_get(d_.get(), tagName.c_str()) != 0;
+}
+
+void BamRecordImpl::InitializeData(void)
+{
+    d_.reset(bam_init1(), internal::HtslibRecordDeleter());
+    d_->data = (uint8_t*)(calloc(0x800, sizeof(uint8_t)));   // maybe make this value tune-able later?
+
+    // init unmapped
+    Position(PacBio::BAM::UnmappedPosition);
+    MatePosition(PacBio::BAM::UnmappedPosition);
+    ReferenceId(-1);
+    MateReferenceId(-1);
+    SetMapped(false);
+    MapQuality(255);
+
+    // initialized with NULL term for qname
+    d_->core.l_qname = 1;
+    d_->l_data = 1;
+    d_->m_data = 0x800;
+}
+
+void BamRecordImpl::MaybeReallocData(void)
+{
+    // about to grow data contents to l_data size, but m_data is our current max.
+    // so we may need to grow. if so, use kroundup to double to next power of 2
+    if (d_->m_data < d_->l_data) {
+        d_->m_data = d_->l_data;
+        kroundup32(d_->m_data);
+        d_->data = static_cast<uint8_t*>(realloc(d_->data, d_->m_data));
+    }
+}
+
+string BamRecordImpl::Name(void) const
+{
+    return string(bam_get_qname(d_));
+}
+
+BamRecordImpl& BamRecordImpl::Name(const std::string& name)
+{
+    // determine change in memory needed
+    // diffNumBytes: pos -> growing, neg -> shrinking
+    const size_t numChars = name.size() + 1; // +1 for NULL-term
+    const int diffNumBytes = numChars - d_->core.l_qname;
+    const int oldLengthData = d_->l_data;
+    d_->l_data += diffNumBytes;
+    MaybeReallocData();
+
+    // shift trailing data (cigar, seq, qual, tags) as needed
+    const uint32_t* oldCigarStart = bam_get_cigar(d_);
+    const size_t trailingDataLength = oldLengthData - ((uint8_t*)oldCigarStart - d_->data);
+    d_->core.l_qname = numChars;
+    uint32_t* newCigarStart = bam_get_cigar(d_);
+    memmove(newCigarStart, oldCigarStart, trailingDataLength);
+
+    // fill in new name
+    memcpy(d_->data, name.c_str(), numChars);
+    return *this;
+}
+
+QualityValues BamRecordImpl::Qualities(void) const
+{
+    if (d_->core.l_qseq == 0)
+        return QualityValues();
+
+    uint8_t* qualData = bam_get_qual(d_);
+    if (qualData[0] == 0xff)
+        return QualityValues();
+
+    const size_t numQuals = d_->core.l_qseq;
+    QualityValues result;
+    result.reserve(numQuals);
+    for (size_t i = 0; i < numQuals; ++i)
+        result.push_back(QualityValue(qualData[i]));
+    return result;
+
+//    string result;
+//    result.reserve(d_->core.l_qseq);
+//    for (int i = 0; i < d_->core.l_qseq; ++i)
+//        result.push_back(qualData[i] + 33);
+//    return result;
+}
+
+bool BamRecordImpl::RemoveTag(const string& tagName)
+{
+    if (tagName.size() != 2)
+        return false;
+    uint8_t* data = bam_aux_get(d_.get(), tagName.c_str());
+    if (data == 0)
+        return false;
+    return bam_aux_del(d_.get(), data) == 0;
+}
+
+string BamRecordImpl::Sequence(void) const
+{
+    string result;
+    result.reserve(d_->core.l_qseq);
+    static const string DnaLookup = string("=ACMGRSVTWYHKDBN");
+    const uint8_t* seqData = bam_get_seq(d_);
+    for (int i = 0; i < d_->core.l_qseq; ++i)
+        result.append(1, DnaLookup[bam_seqi(seqData, i)]);
+    return result;
+}
+
+BamRecordImpl& BamRecordImpl::SetSequenceAndQualities(const std::string& sequence,
+                                                      const std::string& qualities)
+{
+    // TODO: I'm ok with the assert for now, but how to handle at runtime?
+    if (!qualities.empty()) {
+        PB_ASSERT_OR_RETURN_VALUE(sequence.size() == qualities.size(), *this);
+    }
+
+    return SetSequenceAndQualitiesInternal(sequence.c_str(),
+                                           sequence.size(),
+                                           qualities.c_str(),
+                                           false);
+}
+
+BamRecordImpl& BamRecordImpl::SetSequenceAndQualities(const char* sequence,
+                                                      const size_t sequenceLength,
+                                                      const char* qualities)
+{
+    return SetSequenceAndQualitiesInternal(sequence,
+                                           sequenceLength,
+                                           qualities,
+                                           false);
+}
+
+BamRecordImpl& BamRecordImpl::SetPreencodedSequenceAndQualities(const char* encodedSequence,
+                                                                const size_t rawSequenceLength,
+                                                                const char* qualities)
+{
+    return SetSequenceAndQualitiesInternal(encodedSequence,
+                                           rawSequenceLength,
+                                           qualities,
+                                           true);
+}
+
+BamRecordImpl& BamRecordImpl::SetSequenceAndQualitiesInternal(const char* sequence,
+                                                              const size_t sequenceLength,
+                                                              const char* qualities,
+                                                              bool isPreencoded)
+{
+    // determine change in memory needed
+    // diffNumBytes: pos -> growing, neg -> shrinking
+    const int encodedSequenceLength = static_cast<int>((sequenceLength+1)/2);
+    const int oldSeqAndQualLength = static_cast<int>((d_->core.l_qseq+1)/2) + d_->core.l_qseq; // encoded seq + qual
+    const int newSeqAndQualLength = encodedSequenceLength + sequenceLength;                    // encoded seq + qual
+    const int diffNumBytes = newSeqAndQualLength - oldSeqAndQualLength;
+    const int oldLengthData = d_->l_data;
+    d_->l_data += diffNumBytes;
+    MaybeReallocData();
+
+    // shift trailing data (tags) as needed
+    const uint8_t* oldTagStart = bam_get_aux(d_);
+    const size_t trailingDataLength = oldLengthData - ((uint8_t*)oldTagStart - d_->data);
+    d_->core.l_qseq = sequenceLength;
+    uint8_t* newTagStart = bam_get_aux(d_);
+    memmove(newTagStart, oldTagStart, trailingDataLength);
+
+    // fill in new sequence
+    uint8_t* pEncodedSequence = bam_get_seq(d_);
+    if (isPreencoded) {
+        memcpy(pEncodedSequence, sequence, encodedSequenceLength);
+    } else {
+        memset(pEncodedSequence, 0, encodedSequenceLength);
+        for (size_t i = 0; i < sequenceLength; ++i)
+            pEncodedSequence[i>>1] |= seq_nt16_table[(int)sequence[i]] << ((~i&1)<<2);
+
+
+
+//        const char* pRawSequence = sequence;
+//        uint8_t nucleotideCode;
+//        bool useHighWord = true;
+//        for (size_t i = 0; i < sequenceLength; ++i) {
+//            switch (*pRawSequence) {
+//                case '=' : nucleotideCode = 0;  break;
+//                case 'A' : nucleotideCode = 1;  break;
+//                case 'C' : nucleotideCode = 2;  break;
+//                case 'M' : nucleotideCode = 3;  break;
+//                case 'G' : nucleotideCode = 4;  break;
+//                case 'R' : nucleotideCode = 5;  break;
+//                case 'S' : nucleotideCode = 6;  break;
+//                case 'V' : nucleotideCode = 7;  break;
+//                case 'T' : nucleotideCode = 8;  break;
+//                case 'W' : nucleotideCode = 9;  break;
+//                case 'Y' : nucleotideCode = 10; break;
+//                case 'H' : nucleotideCode = 11; break;
+//                case 'K' : nucleotideCode = 12; break;
+//                case 'D' : nucleotideCode = 13; break;
+//                case 'B' : nucleotideCode = 14; break;
+//                case 'N' : nucleotideCode = 15; break;
+//                default :
+//                    PB_ASSERT_UNREACHABLE; // graceful way to handle?
+//                    break;
+//            }
+
+//            // pack the nucleotide code
+//            if (useHighWord) {
+//                *pEncodedSequence = nucleotideCode << 4;
+//                useHighWord = false;
+//            } else {
+//                *pEncodedSequence |= nucleotideCode;
+//                ++pEncodedSequence;
+//                useHighWord = true;
+//            }
+//            ++pRawSequence;
+//        }
+    }
+
+    // fill in quality values
+    uint8_t* encodedQualities = bam_get_qual(d_);
+    if ( (qualities == 0 ) || (::strlen(qualities) == 0) )
+        memset(encodedQualities, 0xff, sequenceLength);
+    else {
+        for (size_t i = 0; i < sequenceLength; ++i)
+            encodedQualities[i] = qualities[i] - 33;  // FASTQ ASCII -> int conversion
+    }
+    return *this;
+}
+
+BamRecordImpl& BamRecordImpl::Tags(const TagCollection& tags)
+{
+    // convert tags to binary
+    const vector<uint8_t>& tagData = BamTagCodec::Encode(tags);
+    const size_t numBytes = tagData.size();
+    const uint8_t* data = tagData.data();
+
+    // determine change in memory needed
+    uint8_t* tagStart = bam_get_aux(d_);
+    const size_t oldNumBytes = d_->l_data - (tagStart - d_->data);
+    const int diffNumBytes = numBytes - oldNumBytes;
+    d_->l_data += diffNumBytes;
+    MaybeReallocData();
+    tagStart = bam_get_aux(d_);
+
+    // fill in new tag data
+    memcpy((void*)tagStart, data, numBytes);
+    return *this;
+}
+
+TagCollection BamRecordImpl::Tags(void) const
+{
+    const uint8_t* tagDataStart = bam_get_aux(d_);
+    const size_t numBytes = d_->l_data - (tagDataStart - d_->data);
+    return BamTagCodec::Decode(vector<uint8_t>(tagDataStart, tagDataStart+numBytes));
+}
+
+Tag BamRecordImpl::TagValue(const string& tagName) const
+{
+    if (tagName.size() != 2)
+        return Tag();
+    uint8_t* data = bam_aux_get(d_.get(), tagName.c_str());
+    if (data == 0)
+        return Tag();
+    return BamTagCodec::FromRawData(data);
+}
diff --git a/src/BamTagCodec.cpp b/src/BamTagCodec.cpp
new file mode 100644
index 0000000..522e41d
--- /dev/null
+++ b/src/BamTagCodec.cpp
@@ -0,0 +1,517 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamTagCodec.h"
+#include "AssertUtils.h"
+#include <htslib/kstring.h>
+#include <cstring>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+template<typename T>
+inline void appendBamValue(const T& value, kstring_t* str /*vector<uint8_t>& result*/)
+{
+    kputsn_((char*)&value, sizeof(value), str);
+//    const size_t initialResultSize = result.size();
+//    result.resize(initialResultSize + sizeof(T));
+//    memcpy((uint8_t*)&result[initialResultSize],
+//           (uint8_t*)&value,
+//           sizeof(T));
+}
+
+template<typename T>
+inline void appendBamMultiValue(const vector<T>& container, kstring_t* str /*vector<uint8_t>& result*/)
+{
+    const uint32_t n = container.size();
+    kputsn_(&n, sizeof(n), str);
+    kputsn_((char*)&container[0], n*sizeof(T), str);
+
+//    const size_t initialResultSize = result.size();
+//    const uint32_t numValues = container.size();
+//    result.resize(initialResultSize + 4 + numValues*sizeof(T));
+//    memcpy((uint8_t*)&result[initialResultSize], (uint32_t*)&numValues, sizeof(numValues));
+//    memcpy((uint8_t*)&result[initialResultSize + 4],
+//           (uint8_t*)&container[0],
+//            numValues*sizeof(T));
+}
+
+template<typename T>
+inline T readBamValue(const uint8_t* src, size_t& offset)
+{
+    T value;
+    memcpy(&value, &src[offset], sizeof(value));
+    offset += sizeof(value);
+    return value;
+}
+
+template<typename T>
+vector<T> readBamMultiValue(const uint8_t* src, size_t& offset)
+{
+    uint32_t numElements;
+    memcpy(&numElements, &src[offset], sizeof(uint32_t));
+    offset += 4;
+
+    vector<T> result;
+    result.reserve(numElements);
+    for (size_t i = 0; i < numElements; ++i) {
+        const T& value = readBamValue<T>(src, offset);
+        result.push_back(value);
+    }
+    return result;
+}
+
+TagCollection BamTagCodec::Decode(const vector<uint8_t>& data)
+{
+    TagCollection tags;
+
+    // NOTE: not completely safe - no real bounds-checking yet on input data
+
+    const uint8_t* pData  = data.data();
+    const size_t numBytes = data.size();
+    size_t i = 0;
+    while (i < numBytes) {
+
+        string tagName;
+        tagName.reserve(2);
+        tagName.append(1, pData[i++]);
+        tagName.append(1, pData[i++]);
+
+        const char tagType = static_cast<char>(pData[i++]);
+        switch (tagType) {
+            case 'A' :
+            case 'a' :
+            {
+                tags[tagName] = readBamValue<uint8_t>(pData, i);
+                tags[tagName].Modifier(TagModifier::ASCII_CHAR);
+                break;
+            }
+
+            case 'c' : tags[tagName] = readBamValue<int8_t>(pData, i);   break;
+            case 'C' : tags[tagName] = readBamValue<uint8_t>(pData, i);  break;
+            case 's' : tags[tagName] = readBamValue<int16_t>(pData, i);  break;
+            case 'S' : tags[tagName] = readBamValue<uint16_t>(pData, i); break;
+            case 'i' : tags[tagName] = readBamValue<int32_t>(pData, i);  break;
+            case 'I' : tags[tagName] = readBamValue<uint32_t>(pData, i); break;
+            case 'f' : tags[tagName] = readBamValue<float>(pData, i);    break;
+
+            case 'Z' :
+            case 'H' :
+            {
+                const size_t dataLength = strlen((const char*)&pData[i]);
+                string value;
+                value.resize(dataLength);
+                memcpy((char*)value.data(), &pData[i], dataLength);
+                tags[tagName] = value;
+                if (tagType == 'H')
+                    tags[tagName].Modifier(TagModifier::HEX_STRING);
+                i += dataLength + 1;
+                break;
+            }
+
+            case 'B' :
+            {
+                const char subTagType = pData[i++];
+                switch (subTagType) {
+
+                    case 'c' : tags[tagName] = readBamMultiValue<int8_t>(pData, i);   break;
+                    case 'C' : tags[tagName] = readBamMultiValue<uint8_t>(pData, i);  break;
+                    case 's' : tags[tagName] = readBamMultiValue<int16_t>(pData, i);  break;
+                    case 'S' : tags[tagName] = readBamMultiValue<uint16_t>(pData, i); break;
+                    case 'i' : tags[tagName] = readBamMultiValue<int32_t>(pData, i);  break;
+                    case 'I' : tags[tagName] = readBamMultiValue<uint32_t>(pData, i); break;
+                    case 'f' : tags[tagName] = readBamMultiValue<float>(pData, i);    break;
+
+                    // unknown subTagType
+                    default:
+                        PB_ASSERT_OR_RETURN_VALUE(false, TagCollection());
+                }
+                break;
+            }
+
+            // unknown tagType
+            default:
+                PB_ASSERT_OR_RETURN_VALUE(false, TagCollection());
+        }
+    }
+
+    return tags;
+}
+
+vector<uint8_t> BamTagCodec::Encode(const TagCollection& tags)
+{
+    kstring_t str = { 0, 0, NULL };
+
+    vector<uint8_t> result;
+
+    const auto tagEnd  = tags.cend();
+    for (auto tagIter = tags.cbegin(); tagIter != tagEnd; ++tagIter) {
+        const string& name = (*tagIter).first;
+        const Tag& tag = (*tagIter).second;
+        PB_ASSERT_OR_CONTINUE(name.size() == 2);
+        if (tag.IsNull())
+            continue;
+
+        // "<TAG>:"
+        kputsn_(name.c_str(), 2, &str);
+
+        // "<TYPE>:<DATA>" for printable, ASCII char
+        if (tag.HasModifier(TagModifier::ASCII_CHAR)) {
+            char c = tag.ToAscii();
+            if (c != '\0') {
+                kputc_('A', &str);
+                kputc_(c, &str);
+                continue;
+            }
+        }
+
+        // "<TYPE>:<DATA>" for all other data
+        switch ( tag.Type() ) {
+            case TagDataType::INT8   :
+            {
+                kputc_('c', &str);
+                appendBamValue(tag.ToInt8(), &str);
+                break;
+            }
+            case TagDataType::UINT8  :
+            {
+                kputc_('C', &str);
+                appendBamValue(tag.ToUInt8(), &str);
+                break;
+            }
+            case TagDataType::INT16  :
+            {
+                kputc_('s', &str);
+                appendBamValue(tag.ToInt16(), &str);
+                break;
+            }
+            case TagDataType::UINT16 :
+            {
+                kputc_('S', &str);
+                appendBamValue(tag.ToUInt16(), &str);
+                break;
+            }
+            case TagDataType::INT32  :
+            {
+                kputc_('i', &str);
+                appendBamValue(tag.ToInt32(), &str);
+                break;
+            }
+            case TagDataType::UINT32 :
+            {
+                kputc_('I', &str);
+                appendBamValue(tag.ToUInt32(), &str);
+                break;
+            }
+            case TagDataType::FLOAT :
+            {
+                kputc_('f', &str);
+                appendBamValue(tag.ToFloat(), &str);
+                break;
+            }
+
+            case TagDataType::STRING :
+            {
+                if (tag.HasModifier(TagModifier::HEX_STRING))
+                    kputc_('H', &str);
+                else
+                    kputc_('Z', &str);
+                const string& s = tag.ToString();
+                kputsn_(s.c_str(), s.size()+1, &str); // this adds the null-term
+                break;
+            }
+
+            case TagDataType::INT8_ARRAY   :
+            {
+                kputc_('B', &str);
+                kputc_('c', &str);
+                appendBamMultiValue(tag.ToInt8Array(), &str);
+                break;
+            }
+            case TagDataType::UINT8_ARRAY  :
+            {
+                kputc_('B', &str);
+                kputc_('C', &str);
+                appendBamMultiValue(tag.ToUInt8Array(), &str);
+                break;
+            }
+            case TagDataType::INT16_ARRAY  :
+            {
+                kputc_('B', &str);
+                kputc_('s', &str);
+                appendBamMultiValue(tag.ToInt16Array(), &str);
+                break;
+            }
+            case TagDataType::UINT16_ARRAY :
+            {
+                kputc_('B', &str);
+                kputc_('S', &str);
+                appendBamMultiValue(tag.ToUInt16Array(), &str);
+                break;
+            }
+            case TagDataType::INT32_ARRAY  :
+            {
+                kputc_('B', &str);
+                kputc_('i', &str);
+                appendBamMultiValue(tag.ToInt32Array(), &str);
+                break;
+            }
+            case TagDataType::UINT32_ARRAY :
+            {
+                kputc_('B', &str);
+                kputc_('I', &str);
+                appendBamMultiValue(tag.ToUInt32Array(), &str);
+                break;
+            }
+            case TagDataType::FLOAT_ARRAY :
+            {
+                kputc_('B', &str);
+                kputc_('f', &str);
+                appendBamMultiValue(tag.ToFloatArray(), &str);
+                break;
+            }
+
+            default :
+                free(str.s);
+                PB_ASSERT_OR_RETURN_VALUE(false, vector<uint8_t>());
+        }
+    }
+
+    result.resize(str.l);
+    memcpy((char*)&result[0], str.s, str.l);
+    free(str.s);
+    return result;
+}
+
+Tag BamTagCodec::FromRawData(uint8_t* rawData)
+{
+    size_t offset = 0;
+    const char tagType = static_cast<char>(*rawData++);
+    switch (tagType) {
+        case 'A' :
+        case 'a' :
+        {
+            Tag t = Tag(readBamValue<uint8_t>(rawData, offset));
+            t.Modifier(TagModifier::ASCII_CHAR);
+            return t;
+        }
+
+        case 'c' : return Tag(readBamValue<int8_t>(rawData, offset));
+        case 'C' : return Tag(readBamValue<uint8_t>(rawData, offset));
+        case 's' : return Tag(readBamValue<int16_t>(rawData, offset));
+        case 'S' : return Tag(readBamValue<uint16_t>(rawData, offset));
+        case 'i' : return Tag(readBamValue<int32_t>(rawData, offset));
+        case 'I' : return Tag(readBamValue<uint32_t>(rawData, offset));
+        case 'f' : return Tag(readBamValue<float>(rawData, offset));
+
+        case 'Z' :
+        case 'H' :
+        {
+            const size_t dataLength = strlen((const char*)&rawData[0]);
+            string value;
+            value.resize(dataLength);
+            memcpy( (char*)value.data(), &rawData[0], dataLength );
+            Tag t(value);
+            if (tagType == 'H')
+                t.Modifier(TagModifier::HEX_STRING);
+            return t;
+        }
+
+        case 'B' :
+        {
+            const char subTagType = *rawData++;
+            switch (subTagType) {
+
+                case 'c' : return Tag(readBamMultiValue<int8_t>(rawData, offset));
+                case 'C' : return Tag(readBamMultiValue<uint8_t>(rawData, offset));
+                case 's' : return Tag(readBamMultiValue<int16_t>(rawData, offset));
+                case 'S' : return Tag(readBamMultiValue<uint16_t>(rawData, offset));
+                case 'i' : return Tag(readBamMultiValue<int32_t>(rawData, offset));
+                case 'I' : return Tag(readBamMultiValue<uint32_t>(rawData, offset));
+                case 'f' : return Tag(readBamMultiValue<float>(rawData, offset));
+
+                // unknown subTagType
+                default:
+                    PB_ASSERT_OR_RETURN_VALUE(false, Tag());
+            }
+            break;
+        }
+
+        // unknown tagType
+        default:
+            PB_ASSERT_OR_RETURN_VALUE(false, Tag());
+    }
+}
+
+vector<uint8_t> BamTagCodec::ToRawData(const Tag& tag)
+{
+    kstring_t str = { 0, 0, NULL };
+
+    // "<TYPE>:<DATA>" for printable, ASCII char
+    if (tag.HasModifier(TagModifier::ASCII_CHAR)) {
+        char c = tag.ToAscii();
+        if (c != '\0') {
+            kputc_(c, &str);
+        }
+    }
+
+    // for all others
+    else {
+        switch ( tag.Type() ) {
+
+            // single, numeric values
+            case TagDataType::INT8   : appendBamValue(tag.ToInt8(), &str);   break;
+            case TagDataType::UINT8  : appendBamValue(tag.ToUInt8(), &str);  break;
+            case TagDataType::INT16  : appendBamValue(tag.ToInt16(), &str);  break;
+            case TagDataType::UINT16 : appendBamValue(tag.ToUInt16(), &str); break;
+            case TagDataType::INT32  : appendBamValue(tag.ToInt32(), &str);  break;
+            case TagDataType::UINT32 : appendBamValue(tag.ToUInt32(), &str); break;
+            case TagDataType::FLOAT  : appendBamValue(tag.ToFloat(), &str);  break;
+
+            // string (& hex-string) values
+            case TagDataType::STRING :
+            {
+                const string& s = tag.ToString();
+                kputsn_(s.c_str(), s.size()+1, &str); // this adds the null-term
+                break;
+            }
+
+            // array-type values
+            case TagDataType::INT8_ARRAY   :
+            {
+                kputc_('c', &str);
+                appendBamMultiValue(tag.ToInt8Array(), &str);
+                break;
+            }
+            case TagDataType::UINT8_ARRAY  :
+            {
+                kputc_('C', &str);
+                appendBamMultiValue(tag.ToUInt8Array(), &str);
+                break;
+            }
+            case TagDataType::INT16_ARRAY  :
+            {
+                kputc_('s', &str);
+                appendBamMultiValue(tag.ToInt16Array(), &str);
+                break;
+            }
+            case TagDataType::UINT16_ARRAY :
+            {
+                kputc_('S', &str);
+                appendBamMultiValue(tag.ToUInt16Array(), &str);
+                break;
+            }
+            case TagDataType::INT32_ARRAY  :
+            {
+                kputc_('i', &str);
+                appendBamMultiValue(tag.ToInt32Array(), &str);
+                break;
+            }
+            case TagDataType::UINT32_ARRAY :
+            {
+                kputc_('I', &str);
+                appendBamMultiValue(tag.ToUInt32Array(), &str);
+                break;
+            }
+            case TagDataType::FLOAT_ARRAY :
+            {
+                kputc_('f', &str);
+                appendBamMultiValue(tag.ToFloatArray(), &str);
+                break;
+            }
+
+            default :
+                free(str.s);
+                PB_ASSERT_OR_RETURN_VALUE(false, vector<uint8_t>());
+        }
+    }
+
+    vector<uint8_t> result;
+    result.resize(str.l);
+    memcpy((char*)&result[0], str.s, str.l);
+    free(str.s);
+    return result;
+}
+
+uint8_t BamTagCodec::TagTypeCode(const Tag &tag)
+{
+    if ( tag.HasModifier(TagModifier::ASCII_CHAR) ) {
+        int64_t value = 0;
+        switch ( tag.Type() ) {
+            case TagDataType::INT8   : value = static_cast<int64_t>(tag.ToInt8());   break;
+            case TagDataType::UINT8  : value = static_cast<int64_t>(tag.ToUInt8());  break;
+            case TagDataType::INT16  : value = static_cast<int64_t>(tag.ToInt16());  break;
+            case TagDataType::UINT16 : value = static_cast<int64_t>(tag.ToUInt16()); break;
+            case TagDataType::INT32  : value = static_cast<int64_t>(tag.ToInt32());  break;
+            case TagDataType::UINT32 : value = static_cast<int64_t>(tag.ToUInt32()); break;
+            default:
+                // non integers not
+                PB_ASSERT_OR_RETURN_VALUE(false, 0);
+        }
+        // printable range
+        PB_ASSERT_OR_RETURN_VALUE(value >= 33,  0);
+        PB_ASSERT_OR_RETURN_VALUE(value <= 126, 0);
+        return static_cast<uint8_t>('A');
+    }
+
+    switch ( tag.Type() ) {
+        case TagDataType::INT8   : return static_cast<uint8_t>('c');
+        case TagDataType::UINT8  : return static_cast<uint8_t>('C');
+        case TagDataType::INT16  : return static_cast<uint8_t>('s');
+        case TagDataType::UINT16 : return static_cast<uint8_t>('S');
+        case TagDataType::INT32  : return static_cast<uint8_t>('i');
+        case TagDataType::UINT32 : return static_cast<uint8_t>('I');
+        case TagDataType::FLOAT  : return static_cast<uint8_t>('f');
+
+        case TagDataType::STRING :
+        {
+            return tag.HasModifier(TagModifier::HEX_STRING) ? static_cast<uint8_t>('H')
+                                                            : static_cast<uint8_t>('Z');
+        }
+
+        case TagDataType::INT8_ARRAY   : // fall through
+        case TagDataType::UINT8_ARRAY  : // .
+        case TagDataType::INT16_ARRAY  : // .
+        case TagDataType::UINT16_ARRAY : // .
+        case TagDataType::INT32_ARRAY  : // .
+        case TagDataType::UINT32_ARRAY : // .
+        case TagDataType::FLOAT_ARRAY  : return static_cast<uint8_t>('B');
+
+        default:
+            PB_ASSERT_OR_RETURN_VALUE(false, 0);
+    }
+}
diff --git a/src/BamWriter.cpp b/src/BamWriter.cpp
new file mode 100644
index 0000000..0abd6e6
--- /dev/null
+++ b/src/BamWriter.cpp
@@ -0,0 +1,171 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/BamWriter.h"
+#include "pbbam/BamFile.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include <htslib/bgzf.h>
+#include <htslib/hfile.h>
+#include <htslib/hts.h>
+#include <thread>
+#include <iostream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class BamWriterPrivate
+{
+public:
+    BamWriterPrivate(void)
+        : file_(nullptr)
+        , header_(nullptr)
+    { }
+
+public:
+    void Open(const std::string& filename,
+              const PBBAM_SHARED_PTR<bam_hdr_t> rawHeader,
+              const BamWriter::CompressionLevel compressionLevel = BamWriter::DefaultCompression,
+              size_t numThreads = 4);
+    void Write(const PBBAM_SHARED_PTR<bam1_t>& rawRecord);
+    void Write(const PBBAM_SHARED_PTR<bam1_t>& rawRecord, int64_t* vOffset);
+
+public:
+    std::unique_ptr<samFile, internal::HtslibFileDeleter> file_;
+    PBBAM_SHARED_PTR<bam_hdr_t> header_;
+    std::string filename_;
+};
+
+void BamWriterPrivate::Open(const string& filename,
+                            const PBBAM_SHARED_PTR<bam_hdr_t> rawHeader,
+                            const BamWriter::CompressionLevel compressionLevel,
+                            size_t numThreads)
+{
+    // store filename
+    filename_ = filename;
+
+    // store header
+    header_ = rawHeader;
+    if (!header_)
+        throw std::runtime_error("null header");
+
+    // open file
+    const string& mode = string("wb") + to_string(static_cast<int>(compressionLevel));
+    file_.reset(sam_open(filename_.c_str(), mode.c_str()));
+    if (!file_)
+        throw std::runtime_error("could not open file for writing");
+
+    // if no explicit thread count given, attempt built-in check
+    if (numThreads == 0) {
+        numThreads = thread::hardware_concurrency();
+
+        // if still unknown, default to single-threaded
+        if (numThreads == 0)
+            numThreads = 1;
+    }
+
+    // if multithreading requested, enable it
+    if (numThreads > 1)
+        hts_set_threads(file_.get(), numThreads);
+
+    // write header
+    const int ret = sam_hdr_write(file_.get(), header_.get());
+    if (ret != 0)
+        throw std::runtime_error("could not write header");
+}
+
+void BamWriterPrivate::Write(const PBBAM_SHARED_PTR<bam1_t>& rawRecord)
+{
+    const int ret = sam_write1(file_.get(), header_.get(), rawRecord.get());
+    if (ret <= 0)
+        throw std::runtime_error("could not write record");
+}
+
+void BamWriterPrivate::Write(const PBBAM_SHARED_PTR<bam1_t>& rawRecord, int64_t* vOffset)
+{
+    BGZF* bgzf = file_.get()->fp.bgzf;
+    assert(bgzf);
+    assert(vOffset);
+
+    const off_t rawTell = htell(bgzf->fp);
+    const int length = bgzf->block_offset;
+
+    *vOffset = (rawTell << 16) | length ;
+    Write(rawRecord);
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+BamWriter::BamWriter(const std::string& filename,
+                     const BamHeader& header,
+                     const BamWriter::CompressionLevel compressionLevel,
+                     const size_t numThreads)
+    : d_(new internal::BamWriterPrivate)
+{
+     d_->Open(filename,
+              internal::BamHeaderMemory::MakeRawHeader(header),
+              compressionLevel,
+              numThreads);
+}
+
+BamWriter::~BamWriter(void)
+{
+    bgzf_flush(d_->file_.get()->fp.bgzf);
+}
+
+void BamWriter::TryFlush(void)
+{
+    // TODO: sanity checks on file_ & fp
+    const int ret = bgzf_flush(d_->file_.get()->fp.bgzf);
+    if (ret != 0)
+        throw std::runtime_error("could not flush output buffer contents");
+}
+
+void BamWriter::Write(const BamRecord& record)
+{ d_->Write(internal::BamRecordMemory::GetRawData(record)); }
+
+void BamWriter::Write(const BamRecord& record, int64_t* vOffset)
+{  d_->Write(internal::BamRecordMemory::GetRawData(record), vOffset); }
+
+void BamWriter::Write(const BamRecordImpl& recordImpl)
+{ d_->Write(internal::BamRecordMemory::GetRawData(recordImpl)); }
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..a7dfb2f
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,83 @@
+find_package(Threads)
+
+if(WIN32)
+  # Need winsock on windows
+  set(SOCKET_LIBRARIES "ws2_32")
+
+  # Limit the number of DLLs we will have to bundle
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc -static-libstdc++")
+  set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc -static-libstdc++")
+endif()
+
+# define PacBioBAM library dependencies
+set(PacBioBAM_DependencyIncludes
+    ${Boost_INCLUDE_DIRS}
+    ${HTSLIB_INCLUDE_DIRS}
+    ${ZLIB_INCLUDE_DIRS}
+)
+set(PacBioBAM_DependencyLibraries
+    ${HTSLIB_LIBRARIES}
+    ${ZLIB_LIBRARIES}
+    ${CMAKE_THREAD_LIBS_INIT}
+    ${SOCKET_LIBRARIES}
+)
+
+# set up library include dirs
+include_directories(SYSTEM
+    ${PacBioBAM_DependencyIncludes}
+)
+
+include_directories(
+    ${PacBioBAM_IncludeDir}
+)
+
+# grab library source files
+include(files.cmake)
+set(SOURCES
+    ${PacBioBAM_H}
+    ${PacBioBAM_CPP}
+)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PacBioBAM_CXX_FLAGS}")
+
+# define actual library
+add_definitions(-DPBBAM_LIBRARY)
+if(PacBioBAM_wrap_r)
+    # SWIG R does not support PBBAM_SHARED_PTR, but it does support boost::shared_ptr
+    # So force boost if we're wrapping for R.
+    add_definitions(-DPBBAM_USE_BOOST_SHARED_PTR)
+endif()
+
+add_library(pbbam ${SOURCES})
+set_target_properties(pbbam PROPERTIES
+    ARCHIVE_OUTPUT_DIRECTORY ${PacBioBAM_LibDir}
+    RUNTIME_OUTPUT_DIRECTORY ${PacBioBAM_LibDir}
+    LIBRARY_OUTPUT_DIRECTORY ${PacBioBAM_LibDir}
+)
+        
+# link dependency libs to pbbam 
+target_link_libraries(pbbam ${PacBioBAM_DependencyLibraries})
+target_include_directories(pbbam 
+    PUBLIC
+    ${PacBioBAM_IncludeDir} 
+    ${PacBioBAM_DependencyIncludes}
+)
+
+# define symbols for projects that use PacBioBAM
+set(PacBioBAM_INCLUDE_DIRS
+    ${PacBioBAM_IncludeDir} ${PacBioBAM_DependencyIncludes}
+    CACHE INTERNAL
+    "${PROJECT_NAME}: Include Directories"
+    FORCE
+)
+
+set(PacBioBAM_LIBRARIES
+    ${PacBioBAM_LibDir}/libpbbam${PB_LIB_SUFFIX} ${PacBioBAM_DependencyLibraries}
+    CACHE INTERNAL
+    "${PROJECT_NAME}: Libraries"
+    FORCE
+)
+
+if(${wrapping_swig})
+    # add SWIG directory
+    add_subdirectory(swig)
+endif()  # swig
diff --git a/src/Cigar.cpp b/src/Cigar.cpp
new file mode 100644
index 0000000..8c7efa7
--- /dev/null
+++ b/src/Cigar.cpp
@@ -0,0 +1,70 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/Cigar.h"
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+Cigar::Cigar(const string& cigarString)
+    : vector<CigarOperation>()
+{
+    size_t numberStart = 0;
+    const size_t numChars = cigarString.size();
+    for (size_t i = 0; i < numChars; ++i) {
+        const char c = cigarString.at(i);
+        if (!::isdigit(c)) {
+            const size_t distance = i - numberStart;
+            const uint32_t length = stoul(cigarString.substr(numberStart, distance));
+            push_back(CigarOperation(c, length));
+            numberStart = i+1;
+        }
+    }
+}
+
+string Cigar::ToStdString(void) const
+{
+    stringstream s;
+    const auto end  = this->cend();
+    for (auto iter = this->cbegin(); iter != end; ++iter) {
+        const CigarOperation& cigar = (*iter);
+        s << cigar.Length()
+          << cigar.Char();
+    }
+    return s.str();
+}
diff --git a/src/CigarOperation.cpp b/src/CigarOperation.cpp
new file mode 100644
index 0000000..50dc4c2
--- /dev/null
+++ b/src/CigarOperation.cpp
@@ -0,0 +1,76 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/CigarOperation.h"
+#include <htslib/sam.h>
+#include <array>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace internal {
+
+typedef array<CigarOperationType, 128> CigarLookup;
+
+static
+CigarLookup InitCigarLookup(void)
+{
+    CigarLookup cl;
+    cl.fill(CigarOperationType::UNKNOWN_OP);
+    cl['M'] = CigarOperationType::ALIGNMENT_MATCH;
+    cl['I'] = CigarOperationType::INSERTION;
+    cl['D'] = CigarOperationType::DELETION;
+    cl['N'] = CigarOperationType::REFERENCE_SKIP;
+    cl['S'] = CigarOperationType::SOFT_CLIP;
+    cl['H'] = CigarOperationType::HARD_CLIP;
+    cl['P'] = CigarOperationType::PADDING;
+    cl['='] = CigarOperationType::SEQUENCE_MATCH;
+    cl['X'] = CigarOperationType::SEQUENCE_MISMATCH;
+    return cl;
+}
+
+const static CigarLookup cigarLookup_ = InitCigarLookup();
+
+} // namespace internal
+
+CigarOperationType CigarOperation::CharToType(const char c)
+{   return (static_cast<uint8_t>(c) >= 128 ? CigarOperationType::UNKNOWN_OP
+                                           : internal::cigarLookup_[c] );
+}
+
+char CigarOperation::TypeToChar(const CigarOperationType type)
+{ return bam_cigar_opchr(static_cast<int>(type)); }
diff --git a/src/Config.cpp b/src/Config.cpp
new file mode 100644
index 0000000..677ad08
--- /dev/null
+++ b/src/Config.cpp
@@ -0,0 +1,48 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/Config.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+namespace PacBio {
+namespace BAM {
+
+int HtslibVerbosity = 0;
+
+} // namespace BAM
+} // namespace PacBio
diff --git a/src/DataSet.cpp b/src/DataSet.cpp
new file mode 100644
index 0000000..ee43e9f
--- /dev/null
+++ b/src/DataSet.cpp
@@ -0,0 +1,173 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSet.h"
+#include "pbbam/DataSetTypes.h"
+#include "pbbam/internal/DataSetBaseTypes.h"
+#include "DataSetIO.h"
+#include "TimeUtils.h"
+#include <unordered_map>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+DataSet::DataSet(void)
+    : d_(new DataSetBase)
+{
+    CreatedAt(internal::ToIso8601(internal::CurrentTime()));
+}
+
+DataSet::DataSet(const DataSet::TypeEnum type)
+    : d_(nullptr)
+{
+    switch(type) {
+        case DataSet::GENERIC             : d_.reset(new DataSetBase); break;
+        case DataSet::ALIGNMENT           : d_.reset(new AlignmentSet); break;
+        case DataSet::BARCODE             : d_.reset(new BarcodeSet); break;
+        case DataSet::CONSENSUS_ALIGNMENT : d_.reset(new ConsensusAlignmentSet); break;
+        case DataSet::CONSENSUS_READ      : d_.reset(new ConsensusReadSet); break;
+        case DataSet::CONTIG              : d_.reset(new ContigSet); break;
+        case DataSet::HDF_SUBREAD         : d_.reset(new HdfSubreadSet); break;
+        case DataSet::REFERENCE           : d_.reset(new ReferenceSet); break;
+        case DataSet::SUBREAD             : d_.reset(new SubreadSet); break;
+        default:
+            throw std::runtime_error("unsupported dataset type"); // unknown type
+    }
+
+    CreatedAt(internal::ToIso8601(internal::CurrentTime()));
+}
+
+DataSet::DataSet(const BamFile& bamFile)
+    : d_(internal::DataSetIO::FromUri(bamFile.Filename()))
+{
+    CreatedAt(internal::ToIso8601(internal::CurrentTime()));
+}
+
+DataSet::DataSet(const string& filename)
+    : d_(internal::DataSetIO::FromUri(filename))
+{ }
+
+DataSet::DataSet(const DataSet& other)
+{
+    DataSetBase* otherDataset = other.d_.get();
+    DataSetElement* copyDataset = new DataSetElement(*otherDataset);
+    d_.reset(static_cast<DataSetBase*>(copyDataset));
+}
+
+DataSet::DataSet(DataSet&& other)
+    : d_(std::move(other.d_))
+{
+    assert(other.d_.get() == nullptr);
+}
+
+DataSet& DataSet::operator=(const DataSet& other)
+{
+    DataSetBase* otherDataset = other.d_.get();
+    DataSetElement* copyDataset = new DataSetElement(*otherDataset);
+    d_.reset(static_cast<DataSetBase*>(copyDataset));
+    return *this;
+}
+
+DataSet& DataSet::operator=(DataSet&& other)
+{
+    d_ = std::move(other.d_);
+    return *this;
+}
+
+DataSet::~DataSet(void) { }
+
+DataSet& DataSet::operator+=(const DataSet& other)
+{
+    *d_.get() += *other.d_.get();
+    return *this;
+}
+
+DataSet DataSet::FromXml(const string& xml)
+{
+    DataSet result;
+    result.d_ = internal::DataSetIO::FromXmlString(xml);
+    if (result.CreatedAt().empty())
+        result.CreatedAt(internal::ToIso8601(internal::CurrentTime()));
+    return result;
+}
+
+const NamespaceRegistry& DataSet::Namespaces(void) const
+{ return d_->Namespaces(); }
+
+NamespaceRegistry& DataSet::Namespaces(void)
+{ return d_->Namespaces(); }
+
+DataSet::TypeEnum DataSet::NameToType(const string& typeName)
+{
+    static std::unordered_map<std::string, DataSet::TypeEnum> lookup;
+    if (lookup.empty()) {
+        lookup["DataSet"] = DataSet::GENERIC;
+        lookup["AlignmentSet"] = DataSet::ALIGNMENT;
+        lookup["BarcodeSet"] = DataSet::BARCODE;
+        lookup["ConsensusAlignmentSet"] = DataSet::CONSENSUS_ALIGNMENT;
+        lookup["ConsensusReadSet"] = DataSet::CONSENSUS_READ;
+        lookup["ContigSet"] = DataSet::CONTIG;
+        lookup["HdfSubreadSet"] = DataSet::HDF_SUBREAD;
+        lookup["ReferenceSet"] = DataSet::REFERENCE;
+        lookup["SubreadSet"] = DataSet::SUBREAD;
+    }
+    return lookup.at(typeName); // throws if unknown typename
+}
+
+void DataSet::Save(const std::string& outputFilename)
+{ internal::DataSetIO::ToFile(d_, outputFilename); }
+
+void DataSet::SaveToStream(ostream& out)
+{ internal::DataSetIO::ToStream(d_, out); }
+
+string DataSet::TypeToName(const DataSet::TypeEnum& type)
+{
+    switch(type) {
+        case DataSet::GENERIC             : return "DataSet";
+        case DataSet::ALIGNMENT           : return "AlignmentSet";
+        case DataSet::BARCODE             : return "BarcodeSet";
+        case DataSet::CONSENSUS_ALIGNMENT : return "ConsensusAlignmentSet";
+        case DataSet::CONSENSUS_READ      : return "ConsensusReadSet";
+        case DataSet::CONTIG              : return "ContigSet";
+        case DataSet::HDF_SUBREAD         : return "HdfSubreadSet";
+        case DataSet::REFERENCE           : return "ReferenceSet";
+        case DataSet::SUBREAD             : return "SubreadSet";
+        default:
+            throw std::runtime_error("unsupported dataset type"); // unknown type
+    }
+}
diff --git a/src/DataSetBaseTypes.cpp b/src/DataSetBaseTypes.cpp
new file mode 100644
index 0000000..cc133e3
--- /dev/null
+++ b/src/DataSetBaseTypes.cpp
@@ -0,0 +1,94 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSetTypes.h"
+#include "pbbam/internal/DataSetBaseTypes.h"
+#include "DataSetUtils.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// ----------------
+// BaseEntityType
+// ----------------
+
+BaseEntityType::BaseEntityType(const std::string& label, const XsdType& xsd)
+    : DataSetElement(label, xsd)
+{ }
+
+DEFINE_ACCESSORS(BaseEntityType, Extensions, Extensions)
+
+BaseEntityType& BaseEntityType::Extensions(const PacBio::BAM::Extensions& extensions)
+{ Extensions() = extensions; return *this; }
+
+// ----------------
+// DataEntityType
+// ----------------
+
+DataEntityType::DataEntityType(const std::string& label, const XsdType& xsd)
+    : BaseEntityType(label, xsd)
+{ }
+
+// -----------------
+// IndexedDataType
+// -----------------
+
+IndexedDataType::IndexedDataType(const std::string& label, const XsdType &xsd)
+    : InputOutputDataType(label, xsd)
+{ }
+
+DEFINE_ACCESSORS(IndexedDataType, FileIndices, FileIndices)
+
+IndexedDataType& IndexedDataType::FileIndices(const PacBio::BAM::FileIndices& indices)
+{ FileIndices() = indices; return *this; }
+
+// ---------------------
+// InputOutputDataType
+// ---------------------
+
+InputOutputDataType::InputOutputDataType(const std::string& label, const XsdType &xsd)
+    : StrictEntityType(label, xsd)
+{ }
+
+// ----------------
+// StrictEntityType
+// ----------------
+
+StrictEntityType::StrictEntityType(const std::string& label, const XsdType& xsd)
+    : BaseEntityType(label, xsd)
+{ }
diff --git a/src/DataSetElement.cpp b/src/DataSetElement.cpp
new file mode 100644
index 0000000..26c0bb6
--- /dev/null
+++ b/src/DataSetElement.cpp
@@ -0,0 +1,47 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/DataSetElement.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+
+const std::string& DataSetElement::SharedNullString(void)
+{
+    static const std::string empty = std::string("");
+    return empty;
+}
diff --git a/src/DataSetIO.cpp b/src/DataSetIO.cpp
new file mode 100644
index 0000000..d618210
--- /dev/null
+++ b/src/DataSetIO.cpp
@@ -0,0 +1,157 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "DataSetIO.h"
+#include "FofnReader.h"
+#include "StringUtils.h"
+#include "XmlReader.h"
+#include "XmlWriter.h"
+#include <boost/algorithm/string.hpp>
+#include <exception>
+#include <fstream>
+#include <iostream>
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+typedef std::shared_ptr<DataSetBase> DataSetPtr;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static
+unique_ptr<DataSetBase> FromXml(const string& xmlFn)
+{
+    ifstream in(xmlFn);
+    if (!in)
+        throw std::runtime_error("could not open XML file for reading");
+    return XmlReader::FromStream(in);
+}
+
+static
+unique_ptr<DataSetBase> FromBam(const string& bamFn)
+{
+    unique_ptr<DataSetBase> dataset(new SubreadSet);
+    ExternalResources& resources = dataset->ExternalResources();
+    resources.Add(ExternalResource(BamFile(bamFn)));
+    return dataset;
+}
+
+static
+unique_ptr<DataSetBase> FromFofn(const string& fofn)
+{
+    ifstream in(fofn);
+    if (!in)
+        throw std::runtime_error("could not open FOFN for reading");
+    const vector<string> filenames = std::move(FofnReader::Files(in));
+    return DataSetIO::FromUris(filenames);
+}
+
+static
+unique_ptr<DataSetBase> FromUri(const string& uri)
+{
+    // NOTE: this says URI, but we're not quite handling filenames as true URIs
+    //       basically just treating as a regular filename for now
+
+    // handle on extension
+    if (boost::algorithm::iends_with(uri, ".xml"))
+        return FromXml(uri);
+    else if (boost::algorithm::iends_with(uri, ".bam"))
+        return FromBam(uri);
+    else if (boost::algorithm::iends_with(uri, ".fofn"))
+        return FromFofn(uri);
+
+    // unknown filename extension
+    throw std::runtime_error("unsupported input file extension");
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+std::unique_ptr<DataSetBase> DataSetIO::FromUri(const std::string& uri)
+{
+    return FromUris(vector<string>(1, uri));
+}
+
+std::unique_ptr<DataSetBase> DataSetIO::FromUris(const std::vector<std::string>& uris)
+{
+    if (uris.empty())
+        throw std::runtime_error("empty input URI list"); // or just return empty, generic DataSet?
+
+    // create dataset(s) from URI(s)
+    vector< unique_ptr<DataSetBase> > datasets;
+    datasets.reserve(uris.size());
+    for ( const auto& uri : uris )
+        datasets.push_back(internal::FromUri(uri));
+    assert(!datasets.empty());
+
+    // if only 1, just return
+    if (datasets.size() == 1)
+        return std::unique_ptr<DataSetBase>(datasets.front().release());
+
+    // else merge
+    else {
+        unique_ptr<DataSetBase>& result = datasets.front();
+        for (size_t i = 1; i < datasets.size(); ++i)
+            *result += *datasets.at(i);
+        return unique_ptr<DataSetBase>(result.release());
+    }
+}
+
+std::unique_ptr<DataSetBase> DataSetIO::FromXmlString(const string& xml)
+{
+    if (xml.empty())
+        throw std::runtime_error("empty XML string");
+    stringstream s(xml);
+    return XmlReader::FromStream(s);
+}
+
+void DataSetIO::ToFile(const std::unique_ptr<DataSetBase>& dataset,
+                       const string& fn)
+{
+    ofstream out(fn);
+    if (!out)
+        throw std::runtime_error("could not open XML for writing");
+    XmlWriter::ToStream(dataset, out);
+}
+
+void DataSetIO::ToStream(const std::unique_ptr<DataSetBase>& dataset, ostream &out)
+{ XmlWriter::ToStream(dataset, out); }
diff --git a/src/DataSetIO.h b/src/DataSetIO.h
new file mode 100644
index 0000000..b03c23b
--- /dev/null
+++ b/src/DataSetIO.h
@@ -0,0 +1,73 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef DATASETIO_H
+#define DATASETIO_H
+
+#include "pbbam/DataSet.h"
+#include <iosfwd>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class DataSetIO
+{
+public:
+
+    // input
+    static std::unique_ptr<DataSetBase> FromUri(const std::string& uri);
+    static std::unique_ptr<DataSetBase> FromUris(const std::vector<std::string>& uris);
+
+    static std::unique_ptr<DataSetBase> FromXmlString(const std::string& xml);
+
+//    static DataSetBase FromUri(const std::string& uri);
+//    static DataSetBase FromUris(const std::vector<std::string>& uris);
+
+//    // output
+    static void ToFile(const std::unique_ptr<DataSetBase>& dataset, const std::string& fn);
+    static void ToStream(const std::unique_ptr<DataSetBase>& dataset, std::ostream& out);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // DATASETIO_H
diff --git a/src/DataSetTypes.cpp b/src/DataSetTypes.cpp
new file mode 100644
index 0000000..3144adc
--- /dev/null
+++ b/src/DataSetTypes.cpp
@@ -0,0 +1,440 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSetTypes.h"
+#include "pbbam/internal/DataSetBaseTypes.h"
+#include "DataSetUtils.h"
+#include <set>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// -------------------
+// AlignmentSet
+// -------------------
+
+AlignmentSet::AlignmentSet(void)
+    : DataSetBase("AlignmentSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// BarcodeSet
+// -------------------
+
+BarcodeSet::BarcodeSet(void)
+    : DataSetBase("BarcodeSet", XsdType::DATASETS)
+{ }
+
+// -----------------------
+// ConsensusAlignmentSet
+// -----------------------
+
+ConsensusAlignmentSet::ConsensusAlignmentSet(void)
+    : DataSetBase("ConsensusAlignmentSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// ConsensusReadSet
+// -------------------
+
+ConsensusReadSet::ConsensusReadSet(void)
+    : DataSetBase("ConsensusReadSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// ContigSet
+// -------------------
+
+ContigSet::ContigSet(void)
+    : DataSetBase("ContigSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// DataSetBase
+// -------------------
+
+DataSetBase::DataSetBase(void)
+    : StrictEntityType("DataSet", XsdType::DATASETS)
+{ }
+
+DataSetBase::DataSetBase(const string& label, const XsdType& xsd)
+    : StrictEntityType(label, xsd)
+{ }
+
+DEFINE_ACCESSORS(DataSetBase, ExternalResources, ExternalResources)
+
+DataSetBase& DataSetBase::ExternalResources(const PacBio::BAM::ExternalResources& resources)
+{ ExternalResources() = resources; return *this;  }
+
+DEFINE_ACCESSORS(DataSetBase, Filters, Filters)
+
+DataSetBase& DataSetBase::Filters(const PacBio::BAM::Filters& filters)
+{ Filters() = filters; return *this;  }
+
+DEFINE_ACCESSORS(DataSetBase, DataSetMetadata, Metadata)
+
+DataSetBase& DataSetBase::Metadata(const PacBio::BAM::DataSetMetadata& metadata)
+{ Metadata() = metadata; return *this; }
+
+const PacBio::BAM::SubDataSets& DataSetBase::SubDataSets(void) const
+{
+    try {
+        return Child<PacBio::BAM::SubDataSets>("DataSets");
+    } catch (std::exception&) {
+        return internal::NullObject<PacBio::BAM::SubDataSets>();
+    }
+}
+
+PacBio::BAM::SubDataSets& DataSetBase::SubDataSets(void)
+{
+    if (!HasChild("DataSets"))
+        AddChild(internal::NullObject<PacBio::BAM::SubDataSets>());
+    return Child<PacBio::BAM::SubDataSets>("DataSets");
+}
+
+DataSetBase& DataSetBase::SubDataSets(const PacBio::BAM::SubDataSets &subdatasets)
+{ SubDataSets() = subdatasets; return *this;  }
+
+DataSetBase* DataSetBase::DeepCopy(void) const
+{
+    DataSetElement* copyDataset = new DataSetElement(*this);
+    DataSetBase* result = static_cast<DataSetBase*>(copyDataset);
+    result->registry_ = registry_;
+    return result;
+}
+
+DataSetBase& DataSetBase::operator+=(const DataSetBase& other)
+{
+    // must be same dataset types (or 'other' must be generic)
+    if (other.QualifiedNameLabel() != QualifiedNameLabel() && other.LocalNameLabel() != "DataSet")
+        throw std::runtime_error("cannot merge incompatible dataset types");
+
+    // check filter match
+    // check object metadata
+    Metadata() += other.Metadata();
+    ExternalResources() += other.ExternalResources();
+    Filters() += other.Filters();
+    SubDataSets() += other;
+
+    return *this;
+}
+
+std::shared_ptr<DataSetBase> DataSetBase::Create(const string& typeName)
+{
+    if (typeName == string("DataSet"))       return make_shared<DataSetBase>();
+    if (typeName == string("SubreadSet"))    return make_shared<SubreadSet>();
+    if (typeName == string("AlignmentSet"))  return make_shared<AlignmentSet>();
+    if (typeName == string("BarcodeSet"))    return make_shared<BarcodeSet>();
+    if (typeName == string("ConsensusAlignmentSet")) return make_shared<ConsensusAlignmentSet>();
+    if (typeName == string("ConsensusReadSet"))      return make_shared<ConsensusReadSet>();
+    if (typeName == string("ContigSet"))     return make_shared<ContigSet>();
+    if (typeName == string("HdfSubreadSet")) return make_shared<HdfSubreadSet>();
+    if (typeName == string("ReferenceSet"))  return make_shared<ReferenceSet>();
+
+    // unknown typename
+    throw std::runtime_error("unsupported dataset type");
+}
+
+// -------------------
+// DataSetMetadata
+// -------------------
+
+DataSetMetadata::DataSetMetadata(const std::string& numRecords,
+                                 const std::string& totalLength)
+    : DataSetElement("DataSetMetadata", XsdType::DATASETS)
+{
+    NumRecords(numRecords);
+    TotalLength(totalLength);
+}
+
+DEFINE_ACCESSORS(DataSetMetadata, Provenance, Provenance)
+
+DataSetMetadata& DataSetMetadata::Provenance(const PacBio::BAM::Provenance& provenance)
+{ Provenance() = provenance; return *this; }
+
+DataSetMetadata& DataSetMetadata::operator+=(const DataSetMetadata& other)
+{
+    NumRecords() = NumRecords() + other.NumRecords();
+    TotalLength() = TotalLength() + other.TotalLength();
+    // merge add'l
+    return *this;
+}
+
+// -------------------
+// ExtensionElement
+// -------------------
+
+ExtensionElement::ExtensionElement(void)
+    : DataSetElement("ExtensionElement", XsdType::BASE_DATA_MODEL)
+{ }
+
+// -------------------
+// Extensions
+// -------------------
+
+Extensions::Extensions(void)
+    : DataSetListElement<ExtensionElement>("Extensions", XsdType::BASE_DATA_MODEL)
+{ }
+
+ExternalResource::ExternalResource(void)
+    : IndexedDataType("ExternalResource", XsdType::BASE_DATA_MODEL)
+{ }
+
+// -------------------
+// ExternalResource
+// -------------------
+
+ExternalResource::ExternalResource(const BamFile &bamFile)
+    : IndexedDataType("ExternalResource", XsdType::BASE_DATA_MODEL)
+{
+    MetaType("SubreadFile.SubreadBamFile");
+    ResourceId(bamFile.Filename());
+}
+
+ExternalResource::ExternalResource(const string& metatype, const string& filename)
+    : IndexedDataType("ExternalResource", XsdType::BASE_DATA_MODEL)
+{
+    MetaType(metatype);
+    ResourceId(filename);
+}
+
+BamFile ExternalResource::ToBamFile(void) const
+{ return BamFile(ResourceId()); }
+
+// -------------------
+// ExternalResources
+// -------------------
+
+ExternalResources::ExternalResources(void)
+    : DataSetListElement<ExternalResource>("ExternalResources", XsdType::BASE_DATA_MODEL)
+{ }
+
+ExternalResources& ExternalResources::operator+=(const ExternalResources& other)
+{
+    // only keep unique resource ids
+
+    set<std::string> myResourceIds;
+    for (size_t i = 0; i < Size(); ++i) {
+        const ExternalResource& resource = this->operator[](i);
+        myResourceIds.insert(resource.ResourceId());
+    }
+
+    vector<size_t> newResourceIndices;
+    const size_t numOtherResourceIds = other.Size();
+    for (size_t i = 0; i < numOtherResourceIds; ++i) {
+        const string& resourceId = other[i].ResourceId();
+        auto found = myResourceIds.find(resourceId);
+        if (found == myResourceIds.cend())
+            newResourceIndices.push_back(i);
+    }
+
+    for (size_t index : newResourceIndices)
+        Add(other[index]);
+
+    return *this;
+}
+
+void ExternalResources::Add(const ExternalResource& ext)
+{ AddChild(ext); }
+
+vector<BamFile> ExternalResources::BamFiles(void) const
+{
+    vector<BamFile> result;
+    const int numResources = Size();
+    result.reserve(numResources);
+    for( const ExternalResource& ext : *this ) {
+        result.push_back(ext.ToBamFile());
+    }
+    return result;
+}
+
+void ExternalResources::Remove(const ExternalResource& ext)
+{ RemoveChild(ext); }
+
+// -------------------
+// FileIndex
+// -------------------
+
+FileIndex::FileIndex(void)
+    : InputOutputDataType("FileIndex", XsdType::BASE_DATA_MODEL)
+{ }
+
+// -------------------
+// FileIndices
+// -------------------
+
+FileIndices::FileIndices(void)
+    : DataSetListElement<FileIndex>("FileIndices", XsdType::BASE_DATA_MODEL)
+{ }
+
+void FileIndices::Add(const FileIndex& index)
+{ AddChild(index); }
+
+void FileIndices::Remove(const FileIndex& index)
+{ RemoveChild(index); }
+
+// -------------------
+// Filter
+// -------------------
+
+Filter::Filter(void)
+    : DataSetElement("Filter", XsdType::DATASETS)
+{ }
+
+DEFINE_ACCESSORS(Filter, Properties, Properties)
+
+Filter& Filter::Properties(const PacBio::BAM::Properties& properties)
+{ Properties() = properties; return *this; }
+
+// -------------------
+// Filters
+// -------------------
+
+Filters::Filters(void)
+    : DataSetListElement<Filter>("Filters", XsdType::DATASETS)
+{ }
+
+Filters& Filters::operator+=(const Filters& other)
+{
+    for (auto& newFilter : other)
+        AddChild(newFilter);
+    return *this;
+}
+
+void Filters::Add(const Filter& filter)
+{ AddChild(filter); }
+
+void Filters::Remove(const Filter& filter)
+{ RemoveChild(filter); }
+
+// -------------------
+// HdfSubreadSet
+// -------------------
+
+HdfSubreadSet::HdfSubreadSet(void)
+    : DataSetBase("HdfSubreadSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// ParentTool
+// -------------------
+
+ParentTool::ParentTool(void)
+    : BaseEntityType("ParentTool", XsdType::DATASETS)
+{ }
+
+// -------------------
+// Properties
+// -------------------
+
+Properties::Properties(void)
+    : DataSetListElement<Property>("Properties", XsdType::BASE_DATA_MODEL)
+{ }
+
+void Properties::Add(const Property &property)
+{ AddChild(property); }
+
+void Properties::Remove(const Property& property)
+{ RemoveChild(property); }
+
+// -------------------
+// Property
+// -------------------
+
+Property::Property(const std::string& name,
+                   const std::string& value,
+                   const std::string& op)
+    : DataSetElement("Property", XsdType::BASE_DATA_MODEL)
+{
+    Name(name);
+    Value(value);
+    Operator(op);
+}
+
+// -------------------
+// Provenance
+// -------------------
+
+Provenance::Provenance(void)
+    : DataSetElement("Provenance", XsdType::DATASETS)
+{ }
+
+DEFINE_ACCESSORS(Provenance, ParentTool, ParentTool)
+
+// -------------------
+// ReferenceSet
+// -------------------
+
+ReferenceSet::ReferenceSet(void)
+    : DataSetBase("ReferenceSet", XsdType::DATASETS)
+{ }
+
+// -------------------
+// SubDataSets
+// -------------------
+
+SubDataSets::SubDataSets(void)
+    : internal::DataSetListElement<DataSetBase>("DataSets", XsdType::DATASETS)
+{ }
+
+SubDataSets& SubDataSets::operator+=(const DataSetBase& other)
+{
+    AddChild(other);
+    return *this;
+}
+
+SubDataSets& SubDataSets::operator+=(const SubDataSets& other)
+{
+    for (auto& newSubDataset : other)
+        AddChild(newSubDataset);
+    return *this;
+}
+
+void SubDataSets::Add(const DataSetBase& subdataset)
+{ AddChild(subdataset); }
+
+void SubDataSets::Remove(const DataSetBase& subdataset)
+{ RemoveChild(subdataset); }
+
+// -------------------
+// SubreadSet
+// -------------------
+
+SubreadSet::SubreadSet(void)
+    : DataSetBase("SubreadSet", XsdType::DATASETS)
+{ }
diff --git a/src/DataSetUtils.h b/src/DataSetUtils.h
new file mode 100644
index 0000000..2fa1f8c
--- /dev/null
+++ b/src/DataSetUtils.h
@@ -0,0 +1,95 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef DATASETUTILS_H
+#define DATASETUTILS_H
+
+#include "pbbam/DataSetTypes.h"
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+template<typename T>
+inline const T& NullObject(void)
+{
+    static const T empty;
+    return empty;
+}
+
+template<>
+inline const PacBio::BAM::DataSetMetadata& NullObject(void)
+{
+    static const PacBio::BAM::DataSetMetadata empty("", "");
+    return empty;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#ifndef FETCH_CHILD_CONST_REF
+#define FETCH_CHILD_CONST_REF(Class, Type, Method) \
+    \
+    const PacBio::BAM::Type& Class::Method(void) const \
+    { \
+        try { \
+            return Child<PacBio::BAM::Type>(#Type); \
+        } catch (std::exception&) { \
+            return internal::NullObject<PacBio::BAM::Type>(); \
+        } \
+    }
+#endif
+
+#ifndef FETCH_CHILD_REF
+#define FETCH_CHILD_REF(Class, Type, Method) \
+    \
+    PacBio::BAM::Type& Class::Method(void) \
+    { \
+        if (!HasChild(#Type)) \
+            AddChild(internal::NullObject<PacBio::BAM::Type>()); \
+        return Child<PacBio::BAM::Type>(#Type); \
+    }
+#endif
+
+#ifndef DEFINE_ACCESSORS
+#define DEFINE_ACCESSORS(Class, Type, Method) \
+    FETCH_CHILD_CONST_REF(Class, Type, Method) \
+    FETCH_CHILD_REF(Class, Type, Method)
+#endif
+
+#endif // DATASETUTILS_H
diff --git a/src/DataSetXsd.cpp b/src/DataSetXsd.cpp
new file mode 100644
index 0000000..0474691
--- /dev/null
+++ b/src/DataSetXsd.cpp
@@ -0,0 +1,132 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/DataSetXsd.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static map<XsdType, NamespaceInfo> DefaultRegistry(void)
+{
+    map<XsdType, NamespaceInfo> result;
+    result[XsdType::NONE]                   = NamespaceInfo();
+    result[XsdType::AUTOMATION_CONSTRAINTS] = NamespaceInfo("",       "http://pacificbiosciences.com/PacBioAutomationConstraints.xsd");
+    result[XsdType::BASE_DATA_MODEL]        = NamespaceInfo("pbbase", "http://pacificbiosciences.com/PacBioBaseDataModel.xsd");
+    result[XsdType::COLLECTION_METADATA]    = NamespaceInfo("pbmeta", "http://pacificbiosciences.com/PacBioCollectionMetadata.xsd");
+    result[XsdType::COMMON_MESSAGES]        = NamespaceInfo("",       "http://pacificbiosciences.com/PacBioCommonMessages.xsd");
+    result[XsdType::DATA_MODEL]             = NamespaceInfo("pbdm",   "http://pacificbiosciences.com/PacBioDataModel.xsd");
+    result[XsdType::DATA_STORE]             = NamespaceInfo("",       "http://pacificbiosciences.com/PacBioDataStore.xsd");
+    result[XsdType::DATASETS]               = NamespaceInfo("pbds",   "http://pacificbiosciences.com/PacBioDatasets.xsd");
+    result[XsdType::DECL_DATA]              = NamespaceInfo("",       "http://pacificbiosciences.com/PacBioDeclData.xsd");
+    result[XsdType::PART_NUMBERS]           = NamespaceInfo("pbpn",   "http://pacificbiosciences.com/PacBioPartNumbers.xsd");
+    result[XsdType::PRIMARY_METRICS]        = NamespaceInfo("",       "http://pacificbiosciences.com/PacBioPrimaryMetrics.xsd");
+    result[XsdType::REAGENT_KIT]            = NamespaceInfo("pbrk",   "http://pacificbiosciences.com/PacBioReagentKit.xsd");
+    result[XsdType::RIGHTS_AND_ROLES]       = NamespaceInfo("",       "http://pacificbiosciences.com/PacBioRightsAndRoles.xsd");
+    result[XsdType::SAMPLE_INFO]            = NamespaceInfo("pbsample", "http://pacificbiosciences.com/PacBioSampleInfo.xsd");
+    result[XsdType::SEEDING_DATA]           = NamespaceInfo("",       "http://pacificbiosciences.com/PacBioSeedingData.xsd");
+    return result;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+// ---------------
+// NamespaceInfo
+// ---------------
+
+NamespaceInfo::NamespaceInfo(void) { }
+
+NamespaceInfo::NamespaceInfo(const string& name,
+                             const string& uri)
+    : name_(name)
+    , uri_(uri)
+{ }
+
+// -------------------
+// NamespaceRegistry
+// -------------------
+
+NamespaceRegistry::NamespaceRegistry(void)
+    : data_(std::move(internal::DefaultRegistry()))
+    , defaultXsdType_(XsdType::DATASETS)
+{ }
+
+NamespaceRegistry::NamespaceRegistry(const NamespaceRegistry &other)
+    : data_(other.data_)
+    , defaultXsdType_(other.defaultXsdType_)
+{ }
+
+NamespaceRegistry& NamespaceRegistry::operator=(const NamespaceRegistry& other)
+{
+    data_ = other.data_;
+    defaultXsdType_ = other.defaultXsdType_;
+    return *this;
+}
+
+NamespaceRegistry::~NamespaceRegistry(void) { }
+
+const NamespaceInfo& NamespaceRegistry::DefaultNamespace(void) const
+{ return Namespace(DefaultXsd()); }
+
+XsdType NamespaceRegistry::DefaultXsd(void) const
+{ return defaultXsdType_; }
+
+const NamespaceInfo& NamespaceRegistry::Namespace(const XsdType& xsd) const
+{ return data_.at(xsd); }
+
+XsdType NamespaceRegistry::XsdForUri(const std::string& uri) const
+{
+    map<XsdType, NamespaceInfo>::const_iterator iter = data_.cbegin();
+    map<XsdType, NamespaceInfo>::const_iterator end  = data_.cend();
+    for ( ; iter != end; ++iter ) {
+        const NamespaceInfo& info = iter->second;
+        if (info.Uri() == uri)
+            return iter->first;
+    }
+    return XsdType::NONE;
+}
+
+void NamespaceRegistry::Register(const XsdType& xsd, const NamespaceInfo& namespaceInfo)
+{ data_[xsd] = namespaceInfo; }
+
+void NamespaceRegistry::SetDefaultXsd(const XsdType& xsd)
+{ defaultXsdType_ = xsd; }
diff --git a/src/EntireFileQuery.cpp b/src/EntireFileQuery.cpp
new file mode 100644
index 0000000..814dc51
--- /dev/null
+++ b/src/EntireFileQuery.cpp
@@ -0,0 +1,102 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/BamFile.h"
+
+#include "pbbam/internal/SequentialMergeStrategy.h"
+
+#include "MemoryUtils.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+class EntireFileIterator : public internal::IBamFileIterator
+{
+public:
+    EntireFileIterator(const BamFile& bamFile)
+        : internal::IBamFileIterator(bamFile)
+    {
+        htsFile_.reset(sam_open(bamFile.Filename().c_str(), "rb"));
+        if (!htsFile_)
+            throw std::runtime_error("could not open BAM file for reading");
+
+        htsHeader_.reset(sam_hdr_read(htsFile_.get()));
+        if (!htsHeader_)
+            throw std::runtime_error("could not read BAM header");
+    }
+
+public:
+    bool GetNext(BamRecord& record) {
+
+//        record = BamRecord(/*fileData_.Header()*/);
+        const int result = sam_read1(htsFile_.get(),
+                                     htsHeader_.get(),
+                                     internal::BamRecordMemory::GetRawData(record).get());
+        record.header_ = header_;
+
+        // success
+        if (result >= 0)
+            return true;
+
+        // normal EOF
+        else if (result == -1)
+            return false;
+
+        // error (truncated file, etc)
+        else
+            throw std::runtime_error("corrupted file, may be truncated");
+    }
+
+private:
+    unique_ptr<samFile,   internal::HtslibFileDeleter>   htsFile_;
+    unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> htsHeader_;
+};
+
+EntireFileQuery::EntireFileQuery(const DataSet& dataset)
+    : internal::IQuery(dataset)
+{
+    // check files
+    // if SO all coordinate
+    // else if SO all queryname
+    // else SO unsorted/unknown
+    mergeStrategy_.reset(new internal::SequentialMergeStrategy(CreateIterators()));
+}
+
+EntireFileQuery::FileIterPtr EntireFileQuery::CreateIterator(const BamFile& bamFile)
+{ return FileIterPtr(new EntireFileIterator(bamFile)); }
+
diff --git a/src/FileUtils.h b/src/FileUtils.h
new file mode 100644
index 0000000..5cf7c72
--- /dev/null
+++ b/src/FileUtils.h
@@ -0,0 +1,132 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef FILEUTILS_H
+#define FILEUTILS_H
+
+#include <exception>
+#include <fstream>
+#include <iostream>
+#include <string>
+#include <ctime>
+#include <sys/stat.h>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+struct FileUtils
+{
+public:
+    static bool Exists(const char* fn);
+    static bool Exists(const std::string& fn);
+
+    // throws if can't read
+    static time_t LastModified(const char* fn);
+    static time_t LastModified(const std::string& fn);
+
+    // throws if can't read
+    static off_t Size(const char* fn);
+    static off_t Size(const std::string& fn);
+};
+
+inline bool FileUtils::Exists(const char* fn)
+{ return Exists(std::string(fn)); }
+
+inline bool FileUtils::Exists(const std::string& fn)
+{
+    std::ifstream stream(fn);
+    return !stream.fail();
+}
+
+inline time_t FileUtils::LastModified(const char* fn)
+{
+    struct stat s;
+    if (stat(fn, &s) != 0)
+        throw std::runtime_error("could not get file timestamp");
+
+#ifdef __DARWIN_64_BIT_INO_T
+    return s.st_mtimespec.tv_sec; // 64-bit OSX has a modified stat struct
+#else
+    return s.st_mtime;            // all others?
+#endif
+}
+
+inline time_t FileUtils::LastModified(const std::string& fn)
+{ return LastModified(fn.c_str()); }
+
+inline off_t FileUtils::Size(const char* fn)
+{
+    struct stat s;
+    if (stat(fn, &s) != 0)
+        throw std::runtime_error("could not determine file size");
+    return s.st_size;
+}
+
+inline off_t FileUtils::Size(const std::string& fn)
+{ return Size(fn.c_str()); }
+
+//inline std::string FilenameExtension(const std::string& fn)
+//{
+//    const size_t lastDot = fn.find_last_of(".");
+//    return (lastDot != std::string::npos ? fn.substr(lastDot+1) : std::string());
+//}
+
+////
+//// -- examples --
+////
+//// input: /path/to/file.ext      result: file.ext
+//// input: /path/to/file.ext.zip  result: file.ext.zip
+//// input: file.ext               result: file.ext
+////
+//inline std::string FilenameFromPath(const std::string& fullPath)
+//{
+//    struct MatchesPathSeparator {
+//        bool operator()(char c) const { return c == '/'; }
+//    };
+
+//    const auto lastSeparator = std::find_if(fullPath.rbegin(),
+//                                            fullPath.rend(),
+//                                            MatchesPathSeparator()).base();
+//    return std::string(lastSeparator,fullPath.end());
+//}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // FILEUTILS_H
diff --git a/src/FilterEngine.cpp b/src/FilterEngine.cpp
new file mode 100644
index 0000000..1f47967
--- /dev/null
+++ b/src/FilterEngine.cpp
@@ -0,0 +1,76 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/internal/FilterEngine.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+
+FilterEngine::FilterEngine(void) { }
+
+bool FilterEngine::Accepts(const BamRecord& r) const
+{
+//        foreach ( const FilterParameter& param, parameters_ ) {
+//            if (!param.Accepts(r))
+//                return false;
+//        }
+//        return true;
+    (void)r;
+    return true;
+}
+
+bool FilterEngine::Accepts(vector<BamRecord>& r) const
+{
+    size_t i = 0;
+    while (i < r.size()) {
+        if (!Accepts(r.at(i)))
+            r.erase(r.begin() + i);
+        else
+            ++i;
+    }
+    return !r.empty();
+}
diff --git a/src/FofnReader.cpp b/src/FofnReader.cpp
new file mode 100644
index 0000000..a0d9280
--- /dev/null
+++ b/src/FofnReader.cpp
@@ -0,0 +1,52 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "FofnReader.h"
+#include <iostream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+vector<string> FofnReader::Files(istream& in)
+{
+    vector<string> files;
+    string fn;
+    while (getline(in, fn))
+        files.push_back(fn);
+    return files;
+}
diff --git a/src/FofnReader.h b/src/FofnReader.h
new file mode 100644
index 0000000..ee09fc5
--- /dev/null
+++ b/src/FofnReader.h
@@ -0,0 +1,60 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef FOFNREADER_H
+#define FOFNREADER_H
+
+#include "pbbam/DataSet.h"
+#include <iosfwd>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class FofnReader
+{
+public:
+    static std::vector<std::string> Files(std::istream& in);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // FOFNREADER_H
diff --git a/src/Frames.cpp b/src/Frames.cpp
new file mode 100644
index 0000000..36e49d9
--- /dev/null
+++ b/src/Frames.cpp
@@ -0,0 +1,179 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/Frames.h"
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static vector<uint16_t> framepoints;
+static vector<uint8_t> frameToCode;
+static uint16_t maxFramepoint;
+
+static
+void InitIpdDownsampling(void)
+{
+    if (!framepoints.empty())
+        return;
+
+    // liftover from Dave's python code:
+    // .../bioinformatics/tools/kineticsTools/kineticsTools/_downsampling.py
+    //
+    // TODO: move this conversion functionality to pbbam
+
+    const int B = 2;
+    const int t = 6;
+    const double T = pow(B, t);
+
+    int next = 0;
+    double grain;
+    const int end = 256/T;
+    for (int i = 0; i < end; ++i) {
+        grain = pow(B, i);
+        vector<uint16_t> nextOnes;
+        for (double j = 0; j < T; ++j)
+            nextOnes.push_back(j*grain + next);
+        next = nextOnes.back() + grain;
+        framepoints.insert(framepoints.end(), nextOnes.cbegin(), nextOnes.cend());
+    }
+    assert(framepoints.size()-1 <= UINT8_MAX);
+
+    const uint16_t maxElement = (*max_element(framepoints.cbegin(), framepoints.cend()));
+    frameToCode.assign(maxElement+1, 0);
+
+    const int fpEnd = framepoints.size() - 1;
+    uint8_t i = 0;
+    uint16_t fl = 0;
+    uint16_t fu = 0;
+    for (; i < fpEnd; ++i) {
+        fl = framepoints[i];
+        fu = framepoints[i+1];
+        if (fu > fl+1) {
+            const int middle = (fl+fu)/2;
+            for (int f = fl; f < middle; ++f)
+                frameToCode[f] = i;
+            for (int f = middle; f < fu; ++f)
+                frameToCode[f] = i+1;
+        } else
+            frameToCode[fl] = i;
+    }
+
+    // this next line differs from the python implementation (there, it's "i+1")
+    // our C++ for loop has incremented our index counter one more time than the indexes from python enumerate(...)
+    frameToCode[fu] = i;
+    maxFramepoint = fu;
+}
+
+static inline
+uint16_t CodeToFrames(const uint8_t code)
+{
+    return framepoints[code];
+}
+
+static
+vector<uint16_t> CodeToFrames(const vector<uint8_t>& codedData)
+{
+    InitIpdDownsampling();
+
+    const size_t length = codedData.size();
+    vector<uint16_t> frames(length, 0);
+    for (size_t i = 0; i < length; ++i)
+        frames[i] = CodeToFrames(codedData[i]);
+    return frames;
+}
+
+static inline
+uint8_t FramesToCode(const uint16_t frame)
+{
+    return frameToCode[std::min(maxFramepoint, frame)];
+}
+
+static
+vector<uint8_t> FramesToCode(const vector<uint16_t>& frames)
+{
+    InitIpdDownsampling();
+
+    const size_t length = frames.size();
+    vector<uint8_t> result(length, 0);
+    for (size_t i = 0; i < length; ++i)
+        result[i] = FramesToCode(frames[i]);
+    return result;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+Frames::Frames(void)
+{ }
+
+Frames::Frames(const std::vector<uint16_t>& frames)
+    : data_(frames)
+{ }
+
+Frames::Frames(std::vector<uint16_t>&& frames)
+    : data_(std::move(frames))
+{ }
+
+Frames::Frames(const Frames& other)
+    : data_(other.data_)
+{ }
+
+Frames::Frames(Frames&& other)
+    : data_(std::move(other.data_))
+{ }
+
+Frames::~Frames(void) { }
+
+Frames& Frames::operator=(const Frames& other)
+{ data_ = other.data_; return *this; }
+
+Frames& Frames::operator=(Frames&& other)
+{ data_ = std::move(other.data_); return *this; }
+
+Frames Frames::Decode(const std::vector<uint8_t>& codedData)
+{  return Frames(std::move(internal::CodeToFrames(codedData))); }
+
+std::vector<uint8_t> Frames::Encode(const std::vector<uint16_t>& frames)
+{ return internal::FramesToCode(frames); }
diff --git a/src/GenomicInterval.cpp b/src/GenomicInterval.cpp
new file mode 100644
index 0000000..7cf0b73
--- /dev/null
+++ b/src/GenomicInterval.cpp
@@ -0,0 +1,131 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/GenomicInterval.h"
+#include "AssertUtils.h"
+#include "StringUtils.h"
+#include <cstdlib>
+#include <cstring>
+#include <ctype.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// returns sequence name & sets begin/end, from input regionString
+string parseRegionString(const string& reg,
+                         PacBio::BAM::Position* begin,
+                         PacBio::BAM::Position* end)
+{
+    const vector<string> parts = internal::Split(reg, ':');
+    if (parts.empty() || parts.size() > 2)
+        throw std::runtime_error("malformed region string");
+
+    // given name only, default min,max intervals
+    if (parts.size() == 1) {
+        *begin = 0;
+        *end = 1<<29;
+    }
+
+    // parse interval from input
+    else if (parts.size() == 2) {
+        const vector<string> intervalParts = internal::Split(parts.at(1), '-');
+        if (intervalParts.empty() || intervalParts.size() >2 )
+            throw std::runtime_error("malformed region string");
+        *begin = std::stoi(intervalParts.at(0));
+        *end   = std::stoi(intervalParts.at(1));
+    }
+
+    return parts.at(0);
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+GenomicInterval::GenomicInterval(void) { }
+
+GenomicInterval::GenomicInterval(const std::string& name,
+                                 const Position& start,
+                                 const Position& stop)
+    : name_(name)
+    , interval_(start, stop)
+{ }
+
+GenomicInterval::GenomicInterval(const string& samtoolsRegionString)
+{
+    Position begin;
+    Position end;
+    name_ = internal::parseRegionString(samtoolsRegionString, &begin, &end);
+    interval_ = PacBio::BAM::Interval<Position>(begin, end);
+}
+
+GenomicInterval::GenomicInterval(const GenomicInterval& other)
+    : name_(other.name_)
+    , interval_(other.interval_)
+{ }
+
+GenomicInterval& GenomicInterval::operator=(const GenomicInterval& other)
+{
+    name_ = other.name_;
+    interval_ = other.interval_;
+    return *this;
+}
+
+bool GenomicInterval::CoveredBy(const GenomicInterval& other) const
+{
+    if (name_ != other.name_)
+        return false;
+    return interval_.CoveredBy(other.interval_);
+}
+
+bool GenomicInterval::Covers(const GenomicInterval& other) const
+{
+    if (name_ != other.name_)
+        return false;
+    return interval_.Covers(other.interval_);
+}
+
+bool GenomicInterval::Intersects(const GenomicInterval& other) const
+{
+    if (name_ != other.name_)
+        return false;
+    return interval_.Intersects(other.interval_);
+}
diff --git a/src/GenomicIntervalQuery.cpp b/src/GenomicIntervalQuery.cpp
new file mode 100644
index 0000000..087c626
--- /dev/null
+++ b/src/GenomicIntervalQuery.cpp
@@ -0,0 +1,140 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/GenomicIntervalQuery.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/internal/BamRecordSort.h"
+#include "pbbam/internal/MergeStrategy.h"
+#include "AssertUtils.h"
+#include "MemoryUtils.h"
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+class GenomicIntervalIterator : public internal::IBamFileIterator
+{
+public:
+    GenomicIntervalIterator(const GenomicInterval& interval,
+                            const BamFile& bamFile)
+        : internal::IBamFileIterator(bamFile)
+        , interval_(interval)
+    {
+        // open file
+        htsFile_.reset(sam_open(bamFile.Filename().c_str(), "rb"));
+        if (!htsFile_)
+            throw std::runtime_error("could not open BAM file for reading");
+
+        // load header info
+        htsHeader_.reset(sam_hdr_read(htsFile_.get()));
+        if (!htsHeader_)
+            throw std::runtime_error("could not read BAM header data");
+
+        // open index
+        htsIndex_.reset(bam_index_load(bamFile.Filename().c_str()));
+        if (!htsIndex_)
+            throw std::runtime_error("could not load BAI index data");
+
+        // initialize iterator
+        if (bamFile.Header().HasSequence(interval_.Name())) {
+            const int id = bamFile.ReferenceId(interval_.Name());
+            if (id >= 0 && id < htsHeader_->n_targets) {
+                htsIterator_.reset(sam_itr_queryi(htsIndex_.get(),
+                                                  id,
+                                                  interval.Start(),
+                                                  interval.Stop()));
+            }
+        }
+        if (!htsIterator_)
+            throw std::runtime_error("could not create iterator for requested region");
+    }
+
+public:
+    bool GetNext(BamRecord& record) {
+
+        assert(htsFile_);
+        assert(htsIterator_);
+        const int result = sam_itr_next(htsFile_.get(),
+                                        htsIterator_.get(),
+                                        internal::BamRecordMemory::GetRawData(record).get());
+        record.header_ = header_;
+
+        // success
+        if (result >= 0)
+            return true;
+
+        // normal EOF
+        else if (result == -1)
+            return false;
+
+        // error (truncated file, etc)
+        else
+            throw std::runtime_error("corrupted file, may be truncated");
+    }
+
+private:
+    GenomicInterval interval_;
+    unique_ptr<samFile,   internal::HtslibFileDeleter>     htsFile_;
+    unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter>   htsHeader_;
+    unique_ptr<hts_idx_t, internal::HtslibIndexDeleter>    htsIndex_;
+    unique_ptr<hts_itr_t, internal::HtslibIteratorDeleter> htsIterator_;
+};
+
+GenomicIntervalQuery::GenomicIntervalQuery(const GenomicInterval& interval,
+                                           const DataSet& dataset)
+    : internal::IQuery(dataset)
+    , interval_(interval)
+{
+    Interval(interval_);
+}
+
+GenomicIntervalQuery::FileIterPtr GenomicIntervalQuery::CreateIterator(const BamFile& bamFile)
+{ return FileIterPtr(new GenomicIntervalIterator(interval_, bamFile)); }
+
+GenomicIntervalQuery& GenomicIntervalQuery::Interval(const GenomicInterval& interval)
+{
+    interval_ = interval;
+    // check files
+    // if SO all coordinate
+    // else if SO all queryname
+    // else SO unsorted/unknown
+    mergeStrategy_.reset(new internal::MergeStrategy<internal::ByPosition>(CreateIterators()));
+    return *this;
+}
+
+GenomicInterval GenomicIntervalQuery::Interval(void) const
+{ return interval_; }
diff --git a/src/GroupQuery.cpp b/src/GroupQuery.cpp
new file mode 100644
index 0000000..4b72b4f
--- /dev/null
+++ b/src/GroupQuery.cpp
@@ -0,0 +1,91 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Yuan Li
+
+#include "pbbam/GroupQuery.h"
+#include "MemoryUtils.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+SequentialGroupQueryBase::SequentialGroupQueryBase(const BamFile & file) 
+    : GroupQueryBase(file)
+    , htsFile_(nullptr)
+    , htsHeader_(nullptr)
+    , nextRecord_()
+{
+    htsFile_.reset(sam_open(file.Filename().c_str(), "rb"), internal::HtslibFileDeleter());
+    if (!htsFile_) 
+        throw std::runtime_error("could not open BAM file for reading");
+
+    htsHeader_.reset(sam_hdr_read(htsFile_.get()), internal::HtslibHeaderDeleter());
+    if (!htsHeader_) 
+        throw std::runtime_error("could not read BAM header data");
+}
+
+bool SequentialGroupQueryBase::GetNext(vector<BamRecord> & records) 
+{
+    records.clear();
+
+    if (nextRecord_.Impl().Name() != "") {
+        records.push_back(nextRecord_);
+        nextRecord_ = BamRecord();
+    }
+
+    while(true) {
+        BamRecord record(file_.Header());
+        const int result = sam_read1(htsFile_.get(),
+                                     htsHeader_.get(),
+                                     internal::BamRecordMemory::GetRawData(record).get());
+        if (result >= 0) { // get next record
+            if (records.size() == 0) {
+                records.push_back(record); // add the first record
+            } else {
+                if (InSameGroup(record, records[0])) {
+                    records.push_back(record); // add remaining record
+                } else {
+                    nextRecord_ = record; // store record from another zmw
+                    return true;
+                }
+            }
+        } else { // unable to get next record
+            if (records.size() > 0) return true; // Has records to return
+            else return false; // Has no records to return
+        }
+    }
+    assert(false); // Should not reach here.
+    return false;
+}
diff --git a/src/IndexedFastaReader.cpp b/src/IndexedFastaReader.cpp
new file mode 100644
index 0000000..fffe44b
--- /dev/null
+++ b/src/IndexedFastaReader.cpp
@@ -0,0 +1,219 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: David Alexander
+
+#include "htslib/faidx.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/GenomicInterval.h"
+#include "pbbam/IndexedFastaReader.h"
+#include "pbbam/Orientation.h"
+#include "SequenceUtils.h"
+
+#include <cstdlib>
+#include <iostream>
+
+namespace PacBio {
+namespace BAM {
+
+
+IndexedFastaReader::IndexedFastaReader(const std::string& filename)
+{
+    Open(filename);
+}
+
+IndexedFastaReader::~IndexedFastaReader()
+{
+    Close();
+}
+
+bool IndexedFastaReader::Open(const std::string &filename)
+{
+    faidx_t* handle = fai_load(filename.c_str());
+    if (handle == nullptr)
+        return false;
+    else
+    {
+        filename_ = filename;
+        handle_ = handle;
+        return true;
+    }
+}
+
+void IndexedFastaReader::Close()
+{
+    filename_ = "";
+    if (handle_ != nullptr)
+        fai_destroy(handle_);
+    handle_ = nullptr;
+}
+
+#define REQUIRE_FAIDX_LOADED if (handle_ == nullptr) throw std::exception()
+
+std::string IndexedFastaReader::Subsequence(const std::string& id,
+                                            Position begin,
+                                            Position end) const
+{
+    REQUIRE_FAIDX_LOADED;
+
+    int len;
+    // Derek: *Annoyingly* htslib seems to interpret "end" as inclusive in
+    // faidx_fetch_seq, whereas it considers it exclusive in the region spec in
+    // fai_fetch.  Can you please verify?
+    char* rawSeq = faidx_fetch_seq(handle_, id.c_str(), begin, end - 1, &len);
+    if (rawSeq == nullptr)
+        throw std::runtime_error("could not fetch FASTA sequence");
+    else {
+        std::string seq(rawSeq);
+        free(rawSeq);
+        return seq;
+    }
+}
+
+std::string IndexedFastaReader::Subsequence(const GenomicInterval& interval) const
+{
+    REQUIRE_FAIDX_LOADED;
+    return Subsequence(interval.Name(), interval.Start(), interval.Stop());
+}
+
+std::string IndexedFastaReader::Subsequence(const char *htslibRegion) const
+{
+    REQUIRE_FAIDX_LOADED;
+
+    int len;
+    char* rawSeq = fai_fetch(handle_, htslibRegion, &len);
+    if (rawSeq == nullptr)
+        throw std::runtime_error("could not fetch FASTA sequence");
+    else {
+        std::string seq(rawSeq);
+        free(rawSeq);
+        return seq;
+    }
+}
+
+
+std::string
+IndexedFastaReader::ReferenceSubsequence(const BamRecord& bamRecord,
+                                         const Orientation orientation,
+                                         const bool gapped,
+                                         const bool exciseSoftClips) const
+{
+    REQUIRE_FAIDX_LOADED;
+
+    std::string subseq = Subsequence(bamRecord.ReferenceName(),
+                                     bamRecord.ReferenceStart(),
+                                     bamRecord.ReferenceEnd());
+    const auto reverse = orientation != Orientation::GENOMIC &&
+                         bamRecord.Impl().IsReverseStrand();
+
+    if (bamRecord.Impl().IsMapped() && gapped)
+    {
+        size_t seqIndex = 0;
+        const Cigar& cigar = bamRecord.Impl().CigarData();
+        Cigar::const_iterator cigarIter = cigar.cbegin();
+        Cigar::const_iterator cigarEnd = cigar.cend();
+        for (; cigarIter != cigarEnd; ++cigarIter)
+        {
+            const CigarOperation& op = (*cigarIter);
+            const CigarOperationType& type = op.Type();
+
+            // do nothing for hard clips
+            if (type != CigarOperationType::HARD_CLIP)
+            {
+                const size_t opLength = op.Length();
+
+                // maybe remove soft clips
+                if (type == CigarOperationType::SOFT_CLIP)
+                {
+                    if (!exciseSoftClips)
+                    {
+                        subseq.reserve(subseq.size() + opLength);
+                        subseq.insert(seqIndex, opLength, '-');
+                        seqIndex += opLength;
+                    }
+                }
+
+                // for non-clipping operations
+                else {
+
+                    // maybe add gaps/padding
+                    if (type == CigarOperationType::INSERTION)
+                    {
+                        subseq.reserve(subseq.size() + opLength);
+                        subseq.insert(seqIndex, opLength, '-');
+                    }
+                    else if (type == CigarOperationType::PADDING)
+                    {
+                        subseq.reserve(subseq.size() + opLength);
+                        subseq.insert(seqIndex, opLength, '*');
+                    }
+
+                    // update index
+                    seqIndex += opLength;
+                }
+            }
+        }
+    }
+
+    if (reverse)
+        internal::ReverseComplementCaseSens(subseq);
+
+    return subseq;
+}
+
+
+int IndexedFastaReader::NumSequences() const
+{
+    REQUIRE_FAIDX_LOADED;
+    return faidx_nseq(handle_);
+}
+
+bool IndexedFastaReader::HasSequence(const std::string& name) const
+{
+    REQUIRE_FAIDX_LOADED;
+    return (faidx_has_seq(handle_, name.c_str()) != 0);
+}
+
+int IndexedFastaReader::SequenceLength(const std::string& name) const
+{
+    REQUIRE_FAIDX_LOADED;
+    int len = faidx_seq_len(handle_, name.c_str());
+    if (len < 0)
+        throw std::runtime_error("could not determine FASTA sequence length");
+    else return len;
+}
+
+
+}}  // PacBio::BAM
diff --git a/src/MemoryUtils.cpp b/src/MemoryUtils.cpp
new file mode 100644
index 0000000..e3ec6a2
--- /dev/null
+++ b/src/MemoryUtils.cpp
@@ -0,0 +1,82 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "MemoryUtils.h"
+#include <string>
+#include <cstdlib>
+#include <cstring>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// -----------------
+// BamHeaderMemory
+// -----------------
+
+BamHeader BamHeaderMemory::FromRawData(bam_hdr_t* hdr)
+{
+    // null input - error
+    if (hdr == nullptr)
+        throw std::runtime_error("invalid BAM header");
+
+    // empty text input - ok
+    if (hdr->text == nullptr || hdr->l_text == 0)
+        return BamHeader();
+
+    // parse normal SAM text input
+    return BamHeader(string(hdr->text, hdr->l_text));
+}
+
+PBBAM_SHARED_PTR<bam_hdr_t> BamHeaderMemory::MakeRawHeader(const BamHeader& header)
+{
+    const string& text = header.ToSam();
+    PBBAM_SHARED_PTR<bam_hdr_t> rawData(sam_hdr_parse(text.size(), text.c_str()), internal::HtslibHeaderDeleter());
+    rawData->ignore_sam_err = 0;
+    rawData->cigar_tab = NULL;
+    rawData->l_text = text.size();
+    rawData->text = (char*)calloc(rawData->l_text + 1, 1);
+    memcpy(rawData->text, text.c_str(), rawData->l_text);
+    return rawData;
+}
+
+//PBBAM_SHARED_PTR<bam_hdr_t> BamHeaderMemory::MakeRawHeader(const BamHeader& header)
+//{
+//    if (!header)
+//        return PBBAM_SHARED_PTR<bam_hdr_t>(nullptr);
+//    return MakeRawHeader(*header.get());
+//}
diff --git a/src/MemoryUtils.h b/src/MemoryUtils.h
new file mode 100644
index 0000000..dc4be84
--- /dev/null
+++ b/src/MemoryUtils.h
@@ -0,0 +1,159 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef MEMORYUTILS_H
+#define MEMORYUTILS_H
+
+#include "pbbam/Config.h"
+#include "pbbam/BamHeader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/BamRecordImpl.h"
+#include <htslib/bgzf.h>
+#include <htslib/sam.h>
+#include <memory>
+
+namespace PacBio {
+namespace BAM {
+
+class BamHeader;
+
+namespace internal {
+
+// intended for use with PBBAM_SHARED_PTR<T>, std::unique_ptr<T>, etc
+
+struct HtslibBgzfDeleter
+{
+    void operator()(BGZF* bgzf)
+    {
+        if (bgzf) 
+            bgzf_close(bgzf);
+        bgzf = nullptr;
+    }
+};
+
+struct HtslibFileDeleter
+{
+    void operator()(samFile* file)
+    {
+        if (file)
+            sam_close(file);
+        file = nullptr;
+    }
+};
+
+struct HtslibHeaderDeleter
+{
+    void operator()(bam_hdr_t* hdr)
+    {
+        if (hdr)
+            bam_hdr_destroy(hdr);
+        hdr = nullptr;
+    }
+};
+
+struct HtslibIndexDeleter
+{
+    void operator()(hts_idx_t* index)
+    {
+        if (index)
+            hts_idx_destroy(index);
+        index = nullptr;
+    }
+};
+
+struct HtslibIteratorDeleter
+{
+    void operator()(hts_itr_t* iter)
+    {
+        if (iter)
+            hts_itr_destroy(iter);
+        iter = nullptr;
+    }
+};
+
+struct HtslibRecordDeleter
+{
+    void operator()(bam1_t* b)
+    {
+        if (b)
+            bam_destroy1(b);
+        b = nullptr;
+    }
+};
+
+class BamHeaderMemory
+{
+public:
+    static BamHeader FromRawData(bam_hdr_t* header);
+    static PBBAM_SHARED_PTR<bam_hdr_t> MakeRawHeader(const BamHeader& header);
+//    static PBBAM_SHARED_PTR<bam_hdr_t> MakeRawHeader(const BamHeader& header);
+};
+
+class BamRecordMemory
+{
+public:
+    static const BamRecordImpl& GetImpl(const BamRecord& r);
+    static const BamRecordImpl& GetImpl(const BamRecord* r);
+    static PBBAM_SHARED_PTR<bam1_t> GetRawData(const BamRecord& r);
+    static PBBAM_SHARED_PTR<bam1_t> GetRawData(const BamRecord* r);
+    static PBBAM_SHARED_PTR<bam1_t> GetRawData(const BamRecordImpl& impl);
+    static PBBAM_SHARED_PTR<bam1_t> GetRawData(const BamRecordImpl* impl);
+};
+
+inline const BamRecordImpl& BamRecordMemory::GetImpl(const BamRecord& r)
+{ return r.impl_; }
+
+inline const BamRecordImpl& BamRecordMemory::GetImpl(const BamRecord* r)
+{ return r->impl_; }
+
+inline PBBAM_SHARED_PTR<bam1_t> BamRecordMemory::GetRawData(const BamRecord& r)
+{ return GetRawData(r.impl_); }
+
+inline PBBAM_SHARED_PTR<bam1_t> BamRecordMemory::GetRawData(const BamRecord* r)
+{ return GetRawData(r->impl_); }
+
+inline PBBAM_SHARED_PTR<bam1_t> BamRecordMemory::GetRawData(const BamRecordImpl& impl)
+{ return impl.d_; }
+
+inline PBBAM_SHARED_PTR<bam1_t> BamRecordMemory::GetRawData(const BamRecordImpl* impl)
+{ return impl->d_; }
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // MEMORYUTILS_H
diff --git a/src/PbiBuilder.cpp b/src/PbiBuilder.cpp
new file mode 100644
index 0000000..65c87bd
--- /dev/null
+++ b/src/PbiBuilder.cpp
@@ -0,0 +1,255 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#include "pbbam/PbiBuilder.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/PbiRawData.h"
+#include "MemoryUtils.h"
+#include "PbiIndexIO.h"
+#include <htslib/bgzf.h>
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+// -------------------------------------------
+// PbiRawReferenceDataBuilder implementation
+// -------------------------------------------
+
+// helper for reference data
+class PbiRawReferenceDataBuilder
+{
+public:
+    PbiRawReferenceDataBuilder(const size_t numReferenceSequences);
+
+public:
+    bool AddRecord(const BamRecord& record,
+                   const PbiReferenceEntry::Row rowNumber);
+    PbiRawReferenceData Result(void) const;
+
+private:
+    int32_t lastRefId_;
+    Position lastPos_;
+    map<uint32_t, PbiReferenceEntry> rawReferenceEntries_;
+};
+
+PbiRawReferenceDataBuilder::PbiRawReferenceDataBuilder(const size_t numReferenceSequences)
+    : lastRefId_(-1)
+    , lastPos_(-1)
+{
+//    const BamHeader& header = bam.Header();
+//    const size_t numReferences = header.Sequences().size();
+    for (size_t i = 0; i < numReferenceSequences; ++i)
+        rawReferenceEntries_[i] = PbiReferenceEntry(i);
+    rawReferenceEntries_[PbiReferenceEntry::UNMAPPED_ID] = PbiReferenceEntry();
+}
+
+bool PbiRawReferenceDataBuilder::AddRecord(const BamRecord& record,
+                                           const PbiReferenceEntry::Row rowNumber)
+{
+    // fetch ref ID & pos for record
+    const int32_t tId = record.ReferenceId();
+    const int32_t pos = record.ReferenceStart();
+
+    // sanity checks to protect against non-coordinate-sorted BAMs
+    if (lastRefId_ != tId || (lastRefId_ >= 0 && tId < 0)) {
+        if (tId >= 0) {
+
+            // if we've already seen unmapped reads, but our current tId is valid
+            //
+            // error: unmapped reads should all be at the end (can stop checking refs)
+            //
+            PbiReferenceEntry& unmappedEntry =
+                    rawReferenceEntries_[PbiReferenceEntry::UNMAPPED_ID];
+            if (unmappedEntry.beginRow_ != PbiReferenceEntry::UNSET_ROW)
+                return false;
+
+            // if we've already seen data for this new tId
+            // (remember we're coming from another tId)
+            //
+            // error: refs are out of order (can stop checking refs)
+            //
+            PbiReferenceEntry& currentEntry =
+                    rawReferenceEntries_[(uint32_t)tId];
+            if (currentEntry.beginRow_ != PbiReferenceEntry::UNSET_ROW)
+                return false;
+        }
+        lastRefId_ = tId;
+    }
+    else if (tId >= 0 && lastPos_ > pos)
+        return false; //error: positions out of order
+
+    // update row numbers
+    PbiReferenceEntry& entry = rawReferenceEntries_[(uint32_t)tId];
+    if (entry.beginRow_ == PbiReferenceEntry::UNSET_ROW)
+        entry.beginRow_ = rowNumber;
+    entry.endRow_ = rowNumber+1;
+
+    // update pos (for sorting check next go-round)
+    lastPos_ = pos;
+    return true;
+}
+
+PbiRawReferenceData PbiRawReferenceDataBuilder::Result(void) const {
+    // PbiReferenceEntries will be sorted thanks to std::map
+    // tId will be at end since we're sorting on the uint cast of -1
+    PbiRawReferenceData result;
+    result.entries_.reserve(rawReferenceEntries_.size());
+    auto refIter = rawReferenceEntries_.cbegin();
+    const auto refEnd  = rawReferenceEntries_.cend();
+    for ( ; refIter != refEnd; ++refIter )
+        result.entries_.push_back(refIter->second);
+    return result;
+}
+
+// ----------------------------------
+// PbiBuilderPrivate implementation
+// ----------------------------------
+
+class PbiBuilderPrivate
+{
+public:
+    PbiBuilderPrivate(const string& filename, const size_t numReferenceSequences);
+    ~PbiBuilderPrivate(void);
+
+public:
+    void AddRecord(const BamRecord& record, const int64_t vOffset);
+
+public:
+    unique_ptr<BGZF, HtslibBgzfDeleter> bgzf_;
+    PbiRawData rawData_;
+    PbiReferenceEntry::Row currentRow_;
+    bool hasMappedData_;
+    bool hasBarcodeData_;
+    bool hasReferenceData_;
+    unique_ptr<PbiRawReferenceDataBuilder> refDataBuilder_;
+};
+
+PbiBuilderPrivate::PbiBuilderPrivate(const string& filename, const size_t numReferenceSequences)
+    : bgzf_(bgzf_open(filename.c_str(), "wb"))
+    , currentRow_(0)
+    , hasMappedData_(true)
+    , hasBarcodeData_(true)
+    , hasReferenceData_(true)
+    , refDataBuilder_(nullptr)
+{
+    if (bgzf_.get()== 0)
+        throw std::runtime_error("could not open PBI file for writing");
+
+    if (numReferenceSequences > 0)
+        refDataBuilder_.reset(new PbiRawReferenceDataBuilder(numReferenceSequences));
+    else
+        hasReferenceData_ = false;
+}
+
+PbiBuilderPrivate::~PbiBuilderPrivate(void)
+{
+    rawData_.NumReads(currentRow_);
+
+    // fetch reference data, if available
+    if (hasReferenceData_) {
+        assert(refDataBuilder_);
+        rawData_.ReferenceData() = std::move(refDataBuilder_->Result());
+    }
+
+    // determine flags
+    PbiFile::Sections sections = PbiFile::SUBREAD;
+    if (hasMappedData_)    sections |= PbiFile::MAPPED;
+    if (hasBarcodeData_)   sections |= PbiFile::BARCODE;
+    if (hasReferenceData_) sections |= PbiFile::REFERENCE;
+    rawData_.FileSections(sections);
+
+    // write index contents to file
+    BGZF* fp = bgzf_.get();
+    PbiIndexIO::WriteHeader(rawData_, fp);
+    const uint32_t numReads = rawData_.NumReads();
+    if (numReads > 0) {
+        PbiIndexIO::WriteSubreadData(rawData_.SubreadData(), numReads, fp);
+        if (rawData_.HasMappedData())
+            PbiIndexIO::WriteMappedData(rawData_.MappedData(), numReads, fp);
+        if (rawData_.HasReferenceData())
+            PbiIndexIO::WriteReferenceData(rawData_.ReferenceData(), fp);
+        if (rawData_.HasBarcodeData())
+            PbiIndexIO::WriteBarcodeData(rawData_.BarcodeData(), numReads, fp);
+    }
+}
+
+void PbiBuilderPrivate::AddRecord(const BamRecord& record, const int64_t vOffset)
+{
+    record.ResetCachedPositions();
+
+    rawData_.SubreadData().AddRecord(record, vOffset);
+
+    if (hasMappedData_)
+        hasMappedData_ &= rawData_.MappedData().AddRecord(record);
+
+    if (hasReferenceData_)
+        hasBarcodeData_ &= rawData_.BarcodeData().AddRecord(record);
+
+    if (hasReferenceData_)
+        hasReferenceData_ &= refDataBuilder_->AddRecord(record, currentRow_);
+
+    ++currentRow_;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+// ---------------------------
+// PbiBuilder implementation
+// ---------------------------
+
+PbiBuilder::PbiBuilder(const string& pbiFilename)
+    : d_(new internal::PbiBuilderPrivate(pbiFilename, 0))
+{ }
+
+PbiBuilder::PbiBuilder(const string& pbiFilename, const size_t numReferenceSequences)
+    : d_(new internal::PbiBuilderPrivate(pbiFilename, numReferenceSequences))
+{ }
+
+PbiBuilder::~PbiBuilder(void) { }
+
+void PbiBuilder::AddRecord(const BamRecord& record, const int64_t vOffset)
+{ d_->AddRecord(record, vOffset);  }
+
+const PbiRawData& PbiBuilder::Index(void) const
+{ return d_->rawData_; }
diff --git a/src/PbiFile.cpp b/src/PbiFile.cpp
new file mode 100644
index 0000000..0318e42
--- /dev/null
+++ b/src/PbiFile.cpp
@@ -0,0 +1,87 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#include "pbbam/PbiFile.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/PbiBuilder.h"
+#include "MemoryUtils.h"
+#include <htslib/sam.h>
+#include <cassert>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::PbiFile;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace PbiFile {
+
+void CreateFrom(const BamFile& bamFile)
+{
+    // open input file for file handle & header
+    unique_ptr<samFile,internal::HtslibFileDeleter> htsFile(sam_open(bamFile.Filename().c_str(), "rb"));
+    if (!htsFile)
+        throw std::runtime_error("could not open BAM file for reading");
+
+    unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> htsHeader(sam_hdr_read(htsFile.get()));
+    if (!htsHeader)
+        throw std::runtime_error("could not read BAM header data");
+
+    samFile*   fp  = htsFile.get();
+    bam_hdr_t* hdr = htsHeader.get();
+    assert(fp);
+    assert(hdr);
+
+    // setup our record object
+    BamRecord record;
+    bam1_t* b = internal::BamRecordMemory::GetRawData(record).get();
+    if (b == 0)
+        throw std::runtime_error("could not allocate BAM record");
+
+    // iterate through file, building index data
+    PbiBuilder builder(bamFile.PacBioIndexFilename(), bamFile.Header().Sequences().size());
+    int64_t offset = bgzf_tell(fp->fp.bgzf);
+    while (sam_read1(fp, hdr, b) >= 0) {
+        builder.AddRecord(record, offset);
+        offset = bgzf_tell(fp->fp.bgzf);
+    }
+}
+
+} // namespace PbiFile
+} // namespace BAM
+} // namespace PacBio
diff --git a/src/PbiIndex.cpp b/src/PbiIndex.cpp
new file mode 100644
index 0000000..2225a6c
--- /dev/null
+++ b/src/PbiIndex.cpp
@@ -0,0 +1,311 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#include "pbbam/PbiIndex.h"
+#include "PbiIndexIO.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// ----------------------------------
+// IndexResultBlock implementation
+// ----------------------------------
+
+IndexResultBlock::IndexResultBlock(void)
+    : firstIndex_(0)
+    , numReads_(0)
+    , virtualOffset_(-1)
+{ }
+
+IndexResultBlock::IndexResultBlock(size_t idx, size_t numReads)
+    : firstIndex_(idx)
+    , numReads_(numReads)
+    , virtualOffset_(-1)
+{ }
+
+bool IndexResultBlock::operator==(const IndexResultBlock& other) const
+{
+    return firstIndex_ == other.firstIndex_ &&
+           numReads_ == other.numReads_ &&
+           virtualOffset_ == other.virtualOffset_;
+}
+
+bool IndexResultBlock::operator!=(const IndexResultBlock& other) const
+{ return !(*this == other); }
+
+// ----------------------------------
+// SubreadLookupData implementation
+// ----------------------------------
+
+SubreadLookupData::SubreadLookupData(void) { }
+
+SubreadLookupData::SubreadLookupData(const PbiRawSubreadData& rawData)
+    : rgId_(rawData.rgId_)
+    , qStart_(rawData.qStart_)
+    , qEnd_(rawData.qEnd_)
+    , holeNumber_(rawData.holeNumber_)
+    , readQual_(rawData.readQual_)
+    , fileOffset_(rawData.fileOffset_)
+{ }
+
+//SubreadLookupData::SubreadLookupData(PbiRawSubreadData&& rawData)
+//    : rgId_(std::move(rawData.rgId_))
+//    , qStart_(std::move(rawData.qStart_))
+//    , qEnd_(std::move(rawData.qEnd_))
+//    , holeNumber_(std::move(rawData.holeNumber_))
+//    , readQual_(std::move(rawData.readQual_))
+//    , fileOffset_(std::move(rawData.fileOffset_))
+//{ }
+
+// ----------------------------------
+// MappedLookupData implementation
+// ----------------------------------
+
+MappedLookupData::MappedLookupData(void) { }
+
+MappedLookupData::MappedLookupData(const PbiRawMappedData& rawData)
+    : tId_(rawData.tId_)
+    , tStart_(rawData.tStart_)
+    , tEnd_(rawData.tEnd_)
+    , aStart_(rawData.aStart_)
+    , aEnd_(rawData.aEnd_)
+    , nM_(rawData.nM_)
+    , nMM_(rawData.nMM_)
+    , mapQV_(rawData.mapQV_)
+{
+    const size_t numElements = rawData.revStrand_.size();
+    reverseStrand_.reserve(numElements/2);
+    forwardStrand_.reserve(numElements/2);
+
+    std::map<uint32_t, IndexList> insRawData;
+    std::map<uint32_t, IndexList> delRawData;
+    for (size_t i = 0; i < numElements; ++i) {
+
+        // nIns, nDel
+        const uint32_t aStart = rawData.aStart_.at(i);
+        const uint32_t aEnd   = rawData.aEnd_.at(i);
+        const uint32_t tStart = rawData.tStart_.at(i);
+        const uint32_t tEnd   = rawData.tEnd_.at(i);
+        const uint32_t nM     = rawData.nM_.at(i);
+        const uint32_t nMM    = rawData.nMM_.at(i);
+        const uint32_t numIns = (aEnd - aStart - nM - nMM);
+        const uint32_t numDel = (tEnd - tStart - nM - nMM);
+        insRawData[numIns].push_back(i);
+        delRawData[numDel].push_back(i);
+
+        // strand
+        if (rawData.revStrand_.at(i) == 0)
+            forwardStrand_.push_back(i);
+        else
+            reverseStrand_.push_back(i);
+    }
+
+    nIns_ = OrderedLookup<uint32_t>(std::move(insRawData));
+    nDel_ = OrderedLookup<uint32_t>(std::move(delRawData));
+}
+
+//MappedLookupData::MappedLookupData(PbiRawMappedData&& rawData)
+//    : tId_(std::move(rawData.tId_))
+//    , tStart_(std::move(rawData.tStart_))
+//    , tEnd_(std::move(rawData.tEnd_))
+//    , aStart_(std::move(rawData.aStart_))
+//    , aEnd_(std::move(rawData.aEnd_))
+//    , nM_(std::move(rawData.nM_))
+//    , nMM_(std::move(rawData.nMM_))
+//    , mapQV_(std::move(rawData.mapQV_))
+//{
+//    const size_t numElements = rawData.revStrand_.size();
+//    reverseStrand_.reserve(numElements/2);
+//    forwardStrand_.reserve(numElements/2);
+//    for (size_t i = 0; i < numElements; ++i) {
+//        if (rawData.revStrand_.at(i) == 0)
+//            forwardStrand_.push_back(i);
+//        else
+//            reverseStrand_.push_back(i);
+//    }
+//}
+
+// ----------------------------------
+// BarcodeLookupData implementation
+// ----------------------------------
+
+BarcodeLookupData::BarcodeLookupData(void) { }
+
+BarcodeLookupData::BarcodeLookupData(const PbiRawBarcodeData& rawData)
+    : bcLeft_(rawData.bcLeft_)
+    , bcRight_(rawData.bcRight_)
+    , bcQual_(rawData.bcQual_)
+    , ctxtFlag_(rawData.ctxtFlag_)
+{  }
+
+//BarcodeLookupData::BarcodeLookupData(PbiRawBarcodeData&& rawData)
+//    : bcLeft_(std::move(rawData.bcLeft_))
+//    , bcRight_(std::move(rawData.bcRight_))
+//    , bcQual_(std::move(rawData.bcQual_))
+//    , ctxtFlag_(std::move(rawData.ctxtFlag_))
+//{ }
+
+// ----------------------------------
+// ReferenceLookupData implementation
+// ----------------------------------
+
+ReferenceLookupData::ReferenceLookupData(void) { }
+
+ReferenceLookupData::ReferenceLookupData(const PbiRawReferenceData& rawData)
+{
+    const size_t numEntries = rawData.entries_.size();
+    references_.reserve(numEntries);
+    for (size_t i = 0; i < numEntries; ++i) {
+        const PbiReferenceEntry& entry = rawData.entries_.at(i);
+        references_[entry.tId_] = IndexRange(entry.beginRow_, entry.endRow_);
+    }
+}
+
+//ReferenceLookupData::ReferenceLookupData(PbiRawReferenceData&& rawData)
+//{
+//    const size_t numEntries = rawData.entries_.size();
+//    references_.reserve(numEntries);
+//    for (size_t i = 0; i < numEntries; ++i) {
+//        const PbiReferenceEntry& entry = rawData.entries_.at(i);
+//        references_[entry.tId_] = IndexRange(entry.beginRow_, entry.endRow_);
+//    }
+//}
+
+// --------------------------------
+// PbiIndexPrivate implementation
+// --------------------------------
+
+PbiIndexPrivate::PbiIndexPrivate(void)
+    : version_(PbiFile::CurrentVersion)
+    , sections_(PbiFile::SUBREAD)
+    , numReads_(0)
+{ }
+
+PbiIndexPrivate::PbiIndexPrivate(const PbiRawData& rawIndex)
+    : version_(rawIndex.Version())
+    , sections_(rawIndex.FileSections())
+    , numReads_(rawIndex.NumReads())
+    , subreadData_(rawIndex.SubreadData())
+    , mappedData_(rawIndex.MappedData())
+    , referenceData_(rawIndex.ReferenceData())
+    , barcodeData_(rawIndex.BarcodeData())
+{ }
+
+PbiIndexPrivate::PbiIndexPrivate(PbiRawData&& rawIndex)
+    : version_(std::move(rawIndex.Version()))
+    , sections_(std::move(rawIndex.FileSections()))
+    , numReads_(std::move(rawIndex.NumReads()))
+    , subreadData_(std::move(rawIndex.SubreadData()))
+    , mappedData_(std::move(rawIndex.MappedData()))
+    , referenceData_(std::move(rawIndex.ReferenceData()))
+    , barcodeData_(std::move(rawIndex.BarcodeData()))
+{ }
+
+unique_ptr<PbiIndexPrivate> PbiIndexPrivate::DeepCopy(void) const
+{
+    std::unique_ptr<PbiIndexPrivate> copy(new PbiIndexPrivate);
+    copy->version_  = version_;
+    copy->sections_ = sections_;
+    copy->numReads_ = numReads_;
+    copy->subreadData_   = subreadData_;
+    copy->mappedData_    = mappedData_;
+    copy->referenceData_ = referenceData_;
+    copy->barcodeData_   = barcodeData_;
+    return copy;
+}
+
+// -------------------------
+// PbiIndex implementation
+// -------------------------
+
+PbiIndex::PbiIndex(void)
+    : d_(new PbiIndexPrivate)
+{ }
+
+PbiIndex::PbiIndex(const string& pbiFilename)
+    : d_(new PbiIndexPrivate(PbiRawData(pbiFilename)))
+{ }
+
+PbiIndex::PbiIndex(const PbiIndex& other)
+    : d_(std::move(other.d_->DeepCopy()))
+{
+    // move is ok, since it's a deep-copied, new object
+}
+
+PbiIndex::PbiIndex(PbiIndex&& other)
+    : d_(std::move(other.d_))
+{ }
+
+PbiIndex& PbiIndex::operator=(const PbiIndex& other)
+{
+    // move is ok, since it's a deep-copied, new object
+    d_ = std::move(other.d_->DeepCopy());
+    return *this;
+}
+
+PbiIndex& PbiIndex::operator=(PbiIndex&& other)
+{
+    d_ = std::move(other.d_);
+    return *this;
+}
+
+PbiIndex::~PbiIndex(void) { }
+
+PbiFile::Sections PbiIndex::FileSections(void) const
+{ return d_->sections_; }
+
+bool PbiIndex::HasBarcodeData(void) const
+{ return d_->HasSection(PbiFile::BARCODE); }
+
+bool PbiIndex::HasMappedData(void) const
+{ return d_->HasSection(PbiFile::MAPPED); }
+
+bool PbiIndex::HasReferenceData(void) const
+{ return d_->HasSection(PbiFile::REFERENCE); }
+
+bool PbiIndex::HasSection(const PbiFile::Section section) const
+{ return d_->HasSection(section); }
+
+uint32_t PbiIndex::NumReads(void) const
+{ return d_->numReads_; }
+
+PbiFile::VersionEnum PbiIndex::Version(void) const
+{ return d_->version_; }
+
+const vector<int64_t>& PbiIndex::VirtualFileOffsets(void) const
+{ return d_->subreadData_.fileOffset_; }
diff --git a/src/PbiIndexIO.cpp b/src/PbiIndexIO.cpp
new file mode 100644
index 0000000..9d0d4e7
--- /dev/null
+++ b/src/PbiIndexIO.cpp
@@ -0,0 +1,345 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#include "PbiIndexIO.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/PbiBuilder.h"
+#include "MemoryUtils.h"
+#include <boost/algorithm/string.hpp>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+// ---------------------------
+// PbiIndexIO implementation
+// ---------------------------
+
+PbiRawData PbiIndexIO::Load(const std::string& pbiFilename)
+{
+     PbiRawData rawData;
+     Load(rawData, pbiFilename);
+     return rawData;
+}
+
+void PbiIndexIO::Load(PbiRawData& rawData,
+                      const string &filename)
+{
+    // open file for reading
+    if (!boost::algorithm::iends_with(filename, ".pbi"))
+        throw std::runtime_error("unsupported file extension");
+    std::unique_ptr<BGZF, HtslibBgzfDeleter> bgzf(bgzf_open(filename.c_str(), "rb"));
+    BGZF* fp = bgzf.get();
+    if (fp == 0)
+        throw std::runtime_error("could not open PBI file for reading");
+
+    // load data
+    LoadHeader(rawData, fp);
+    const uint32_t numReads = rawData.NumReads();
+    if (numReads > 0) {
+        LoadSubreadData(rawData.SubreadData(), numReads, fp);
+        LoadMappedData(rawData.MappedData(), numReads, fp);
+        LoadReferenceData(rawData.ReferenceData(), fp);
+        LoadBarcodeData(rawData.BarcodeData(), numReads, fp);
+    }
+}
+
+void PbiIndexIO::LoadBarcodeData(PbiRawBarcodeData& barcodeData,
+                                 const uint32_t numReads,
+                                 BGZF* fp)
+{
+    assert(numReads > 0);
+
+    LoadBgzfVector(fp, barcodeData.bcLeft_,   numReads);
+    LoadBgzfVector(fp, barcodeData.bcRight_,  numReads);
+    LoadBgzfVector(fp, barcodeData.bcQual_,   numReads);
+    LoadBgzfVector(fp, barcodeData.ctxtFlag_, numReads);
+
+    assert(barcodeData.bcLeft_.size()   == numReads);
+    assert(barcodeData.bcRight_.size()  == numReads);
+    assert(barcodeData.bcQual_.size()   == numReads);
+    assert(barcodeData.ctxtFlag_.size() == numReads);
+}
+
+void PbiIndexIO::LoadHeader(PbiRawData& index,
+                            BGZF* fp)
+{
+    size_t bytesRead = 0;
+
+    // 'magic' string
+    char magic[4];
+    bytesRead = bgzf_read(fp, magic, 4);
+    if (bytesRead != 4 || strncmp(magic, "PBI\1", 4))
+        throw std::runtime_error("expected PBI file, found unknown format instead");
+
+    // version, pbi_flags, & n_reads
+    uint32_t version;
+    uint16_t sections;
+    uint32_t numReads;
+    bgzf_read(fp, &version,  sizeof(version));
+    bgzf_read(fp, &sections, sizeof(sections));
+    bgzf_read(fp, &numReads, sizeof(numReads));
+    if (fp->is_be) {
+        version  = ed_swap_4(version);
+        sections = ed_swap_2(sections);
+        numReads = ed_swap_4(numReads);
+    }
+
+    index.Version(PbiFile::VersionEnum(version));
+    index.FileSections(PbiFile::Sections(sections));
+    index.NumReads(numReads);
+
+    // skip reserved section
+    size_t reservedLength = 18;
+    // adjust depending on version
+    char reserved[18];
+    bytesRead = bgzf_read(fp, &reserved, reservedLength);
+}
+
+void PbiIndexIO::LoadMappedData(PbiRawMappedData& mappedData,
+                                const uint32_t numReads,
+                                BGZF* fp)
+{
+    assert(numReads > 0);
+
+    LoadBgzfVector(fp, mappedData.tId_,       numReads);
+    LoadBgzfVector(fp, mappedData.tStart_,    numReads);
+    LoadBgzfVector(fp, mappedData.tEnd_,      numReads);
+    LoadBgzfVector(fp, mappedData.aStart_,    numReads);
+    LoadBgzfVector(fp, mappedData.aEnd_,      numReads);
+    LoadBgzfVector(fp, mappedData.revStrand_, numReads);
+    LoadBgzfVector(fp, mappedData.nM_,        numReads);
+    LoadBgzfVector(fp, mappedData.nMM_,       numReads);
+    LoadBgzfVector(fp, mappedData.mapQV_,     numReads);
+
+    assert(mappedData.tId_.size()       == numReads);
+    assert(mappedData.tStart_.size()    == numReads);
+    assert(mappedData.tEnd_.size()      == numReads);
+    assert(mappedData.aStart_.size()    == numReads);
+    assert(mappedData.aEnd_.size()      == numReads);
+    assert(mappedData.revStrand_.size() == numReads);
+    assert(mappedData.nM_.size()        == numReads);
+    assert(mappedData.nMM_.size()       == numReads);
+    assert(mappedData.mapQV_.size()     == numReads);
+}
+
+void PbiIndexIO::LoadReferenceData(PbiRawReferenceData& referenceData,
+                                   BGZF* fp)
+{
+    assert(sizeof(PbiReferenceEntry::ID)  == 4);
+    assert(sizeof(PbiReferenceEntry::Row) == 4);
+
+    // num refs
+    uint32_t numRefs;
+    bgzf_read(fp, &numRefs, 4);
+    if (fp->is_be)
+        numRefs = ed_swap_4(numRefs);
+
+    // reference entries
+    referenceData.entries_.clear();
+    referenceData.entries_.resize(numRefs);
+    for (size_t i = 0; i < numRefs; ++i) {
+        PbiReferenceEntry& entry = referenceData.entries_[i];
+        bgzf_read(fp, &entry.tId_,      4);
+        bgzf_read(fp, &entry.beginRow_, 4);
+        bgzf_read(fp, &entry.endRow_,   4);
+        if (fp->is_be) {
+            entry.tId_      = ed_swap_4(entry.tId_);
+            entry.beginRow_ = ed_swap_4(entry.beginRow_);
+            entry.endRow_   = ed_swap_4(entry.endRow_);
+        }
+    }
+}
+
+void PbiIndexIO::LoadSubreadData(PbiRawSubreadData& subreadData,
+                                 const uint32_t numReads,
+                                 BGZF* fp)
+{
+    assert(numReads > 0);
+
+    LoadBgzfVector(fp, subreadData.rgId_,       numReads);
+    LoadBgzfVector(fp, subreadData.qStart_,     numReads);
+    LoadBgzfVector(fp, subreadData.qEnd_,       numReads);
+    LoadBgzfVector(fp, subreadData.holeNumber_, numReads);
+    LoadBgzfVector(fp, subreadData.readQual_,   numReads);
+    LoadBgzfVector(fp, subreadData.fileOffset_, numReads);
+
+    assert(subreadData.rgId_.size()       == numReads);
+    assert(subreadData.qStart_.size()     == numReads);
+    assert(subreadData.qEnd_.size()       == numReads);
+    assert(subreadData.holeNumber_.size() == numReads);
+    assert(subreadData.readQual_.size()   == numReads);
+    assert(subreadData.fileOffset_.size() == numReads);
+}
+
+void PbiIndexIO::Save(const PbiRawData& index,
+                      const std::string& filename)
+{
+    std::unique_ptr<BGZF, HtslibBgzfDeleter> bgzf(bgzf_open(filename.c_str(), "wb"));
+    BGZF* fp = bgzf.get();
+    if (fp == 0)
+        throw std::runtime_error("could not open PBI file for writing");
+
+    WriteHeader(index, fp);
+    const uint32_t numReads = index.NumReads();
+    if (numReads > 0) {
+        WriteSubreadData(index.SubreadData(), numReads, fp);
+
+        if (index.HasMappedData())
+            WriteMappedData(index.MappedData(), numReads, fp);
+        if (index.HasReferenceData())
+            WriteReferenceData(index.ReferenceData(), fp);
+        if (index.HasBarcodeData())
+            WriteBarcodeData(index.BarcodeData(), numReads, fp);
+    }
+}
+
+void PbiIndexIO::WriteBarcodeData(const PbiRawBarcodeData& barcodeData,
+                                  const uint32_t numReads,
+                                  BGZF* fp)
+{
+    assert(numReads > 0);
+    assert(barcodeData.bcLeft_.size()   == numReads);
+    assert(barcodeData.bcRight_.size()  == numReads);
+    assert(barcodeData.bcQual_.size()   == numReads);
+    assert(barcodeData.ctxtFlag_.size() == numReads);
+
+    WriteBgzfVector(fp, barcodeData.bcLeft_);
+    WriteBgzfVector(fp, barcodeData.bcRight_);
+    WriteBgzfVector(fp, barcodeData.bcQual_);
+    WriteBgzfVector(fp, barcodeData.ctxtFlag_);
+}
+
+void PbiIndexIO::WriteHeader(const PbiRawData& index,
+                             BGZF* fp)
+{
+    // 'magic' string
+    char magic[4];
+    strncpy(magic, "PBI\1", 4);
+    bgzf_write(fp, magic, 4);
+
+    // version, pbi_flags, & n_reads
+    uint32_t version   = static_cast<uint32_t>(index.Version());
+    uint16_t pbi_flags = static_cast<uint16_t>(index.FileSections());
+    uint32_t numReads  = index.NumReads();
+    if (fp->is_be) {
+        version   = ed_swap_4(version);
+        pbi_flags = ed_swap_2(pbi_flags);
+        numReads  = ed_swap_4(numReads);
+    }
+    bgzf_write(fp, &version,   4);
+    bgzf_write(fp, &pbi_flags, 2);
+    bgzf_write(fp, &numReads,  4);
+
+    // reserved space
+    char reserved[18];
+    memset(reserved, 0, 18);
+    bgzf_write(fp, reserved, 18);
+}
+
+void PbiIndexIO::WriteMappedData(const PbiRawMappedData& mappedData,
+                                 const uint32_t numReads,
+                                 BGZF* fp)
+{
+    assert(mappedData.tId_.size()       == numReads);
+    assert(mappedData.tStart_.size()    == numReads);
+    assert(mappedData.tEnd_.size()      == numReads);
+    assert(mappedData.aStart_.size()    == numReads);
+    assert(mappedData.aEnd_.size()      == numReads);
+    assert(mappedData.revStrand_.size() == numReads);
+    assert(mappedData.nM_.size()        == numReads);
+    assert(mappedData.nMM_.size()       == numReads);
+    assert(mappedData.mapQV_.size()     == numReads);
+
+    WriteBgzfVector(fp, mappedData.tId_);
+    WriteBgzfVector(fp, mappedData.tStart_);
+    WriteBgzfVector(fp, mappedData.tEnd_);
+    WriteBgzfVector(fp, mappedData.aStart_);
+    WriteBgzfVector(fp, mappedData.aEnd_);
+    WriteBgzfVector(fp, mappedData.revStrand_);
+    WriteBgzfVector(fp, mappedData.nM_);
+    WriteBgzfVector(fp, mappedData.nMM_);
+    WriteBgzfVector(fp, mappedData.mapQV_);
+}
+
+void PbiIndexIO::WriteReferenceData(const PbiRawReferenceData& referenceData,
+                                    BGZF* fp)
+{
+    // num_refs
+    uint32_t numRefs = referenceData.entries_.size();
+    if (fp->is_be)
+        numRefs = ed_swap_4(numRefs);
+    bgzf_write(fp, &numRefs, 4);
+
+    // reference entries
+    numRefs = referenceData.entries_.size(); // need to reset after maybe endian-swapping
+    for (size_t i = 0; i < numRefs; ++i) {
+        const PbiReferenceEntry& entry = referenceData.entries_[i];
+        uint32_t tId      = entry.tId_;
+        uint32_t beginRow = entry.beginRow_;
+        uint32_t endRow   = entry.endRow_;
+        if (fp->is_be) {
+            tId      = ed_swap_4(tId);
+            beginRow = ed_swap_4(beginRow);
+            endRow   = ed_swap_4(endRow);
+        }
+        bgzf_write(fp, &tId,      4);
+        bgzf_write(fp, &beginRow, 4);
+        bgzf_write(fp, &endRow,   4);
+    }
+}
+
+void PbiIndexIO::WriteSubreadData(const PbiRawSubreadData& subreadData,
+                                  const uint32_t numReads,
+                                  BGZF* fp)
+{
+    assert(subreadData.rgId_.size()       == numReads);
+    assert(subreadData.qStart_.size()     == numReads);
+    assert(subreadData.qEnd_.size()       == numReads);
+    assert(subreadData.holeNumber_.size() == numReads);
+    assert(subreadData.readQual_.size()   == numReads);
+    assert(subreadData.fileOffset_.size() == numReads);
+
+    WriteBgzfVector(fp, subreadData.rgId_);
+    WriteBgzfVector(fp, subreadData.qStart_);
+    WriteBgzfVector(fp, subreadData.qEnd_);
+    WriteBgzfVector(fp, subreadData.holeNumber_);
+    WriteBgzfVector(fp, subreadData.readQual_);
+    WriteBgzfVector(fp, subreadData.fileOffset_);
+}
diff --git a/src/PbiIndexIO.h b/src/PbiIndexIO.h
new file mode 100644
index 0000000..9ec001d
--- /dev/null
+++ b/src/PbiIndexIO.h
@@ -0,0 +1,165 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#ifndef PBIINDEXIO_H
+#define PBIINDEXIO_H
+
+#include "pbbam/BamFile.h"
+#include "pbbam/PbiFile.h"
+#include "pbbam/PbiRawData.h"
+#include <htslib/bgzf.h>
+#include <htslib/sam.h>
+#include <memory>
+#include <string>
+#include <vector>
+#include <cassert>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class PbiIndexIO
+{
+public:
+    // top-level entry points
+    static PbiRawData Load(const std::string& filename);
+    static void Load(PbiRawData& rawData,
+                     const std::string& filename);
+    static void Save(const PbiRawData& rawData,
+                     const std::string& filename);
+
+public:
+    // per-component load
+    static void LoadBarcodeData(PbiRawBarcodeData& barcodeData,
+                                const uint32_t numReads,
+                                BGZF* fp);
+    static void LoadHeader(PbiRawData& index,
+                           BGZF* fp);
+    static void LoadMappedData(PbiRawMappedData& mappedData,
+                               const uint32_t numReads,
+                               BGZF* fp);
+    static void LoadReferenceData(PbiRawReferenceData& referenceData,
+                                  BGZF* fp);
+    static void LoadSubreadData(PbiRawSubreadData& subreadData,
+                                const uint32_t numReads,
+                                BGZF* fp);
+
+    // per-data-field load
+    template<typename T>
+    static void LoadBgzfVector(BGZF* fp,
+                               std::vector<T>& data,
+                               const uint32_t numReads);
+
+public:
+    // per-component write
+    static void WriteBarcodeData(const PbiRawBarcodeData& barcodeData,
+                                 const uint32_t numReads,
+                                 BGZF* fp);
+    static void WriteHeader(const PbiRawData& index,
+                            BGZF* fp);
+    static void WriteMappedData(const PbiRawMappedData& mappedData,
+                                const uint32_t numReads,
+                                BGZF* fp);
+    static void WriteReferenceData(const PbiRawReferenceData& referenceData,
+                                   BGZF* fp);
+    static void WriteSubreadData(const PbiRawSubreadData& subreadData,
+                                 const uint32_t numReads,
+                                 BGZF* fp);
+
+    // per-data-field write
+    template<typename T>
+    static void WriteBgzfVector(BGZF* fp,
+                                const std::vector<T>& data);
+
+private:
+    // helper functions
+    template<typename T>
+    static void SwapEndianness(std::vector<T>& data);
+};
+
+template<typename T>
+inline void PbiIndexIO::LoadBgzfVector(BGZF* fp,
+                                       std::vector<T>& data,
+                                       const uint32_t numReads)
+{
+    assert(fp);
+    data.resize(numReads);
+    bgzf_read(fp, &data[0], numReads*sizeof(T));
+    if (fp->is_be)
+        SwapEndianness(data);
+}
+
+template<typename T>
+inline void PbiIndexIO::SwapEndianness(std::vector<T>& data)
+{
+    const size_t elementSize = sizeof(T);
+    const size_t numReads = data.size();
+    switch (elementSize) {
+        case 1 : break; // no swapping necessary
+        case 2 :
+            for (size_t i = 0; i < numReads; ++i)
+                ed_swap_2p(&data[i]);
+            break;
+        case 4:
+            for (size_t i = 0; i < numReads; ++i)
+                ed_swap_4p(&data[i]);
+            break;
+        case 8:
+            for (size_t i = 0; i < numReads; ++i)
+                ed_swap_8p(&data[i]);
+            break;
+        default:
+            throw std::runtime_error("unsupported element size");
+    }
+}
+
+template<typename T>
+inline void PbiIndexIO::WriteBgzfVector(BGZF* fp,
+                                        const std::vector<T>& data)
+{
+    assert(fp);
+    std::vector<T> output = data;
+    if (fp->is_be)
+        SwapEndianness(output);
+    bgzf_write(fp, &output[0], data.size()*sizeof(T));
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // PBIINDEXIO_H
diff --git a/src/PbiRawData.cpp b/src/PbiRawData.cpp
new file mode 100644
index 0000000..edcb6d0
--- /dev/null
+++ b/src/PbiRawData.cpp
@@ -0,0 +1,444 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+//
+// Author: Derek Barnett
+
+#include "pbbam/PbiRawData.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "PbiIndexIO.h"
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+// ----------------------------------
+// PbiRawBarcodeData implementation
+// ----------------------------------
+
+PbiRawBarcodeData::PbiRawBarcodeData(void) { }
+
+PbiRawBarcodeData::PbiRawBarcodeData(uint32_t numReads)
+{
+    bcLeft_.reserve(numReads);
+    bcRight_.reserve(numReads);
+    bcQual_.reserve(numReads);
+    ctxtFlag_.reserve(numReads);
+}
+
+PbiRawBarcodeData::PbiRawBarcodeData(const PbiRawBarcodeData& other)
+    : bcLeft_(other.bcLeft_)
+    , bcRight_(other.bcRight_)
+    , bcQual_(other.bcQual_)
+    , ctxtFlag_(other.ctxtFlag_)
+{ }
+
+PbiRawBarcodeData::PbiRawBarcodeData(PbiRawBarcodeData&& other)
+    : bcLeft_(std::move(other.bcLeft_))
+    , bcRight_(std::move(other.bcRight_))
+    , bcQual_(std::move(other.bcQual_))
+    , ctxtFlag_(std::move(other.ctxtFlag_))
+{ }
+
+PbiRawBarcodeData& PbiRawBarcodeData::operator=(const PbiRawBarcodeData& other)
+{
+    bcLeft_ = other.bcLeft_;
+    bcRight_ = other.bcRight_;
+    bcQual_ = other.bcQual_;
+    ctxtFlag_ =other.ctxtFlag_;
+    return *this;
+}
+
+PbiRawBarcodeData& PbiRawBarcodeData::operator=(PbiRawBarcodeData&& other)
+{
+    bcLeft_ = std::move(other.bcLeft_);
+    bcRight_ = std::move(other.bcRight_);
+    bcQual_ = std::move(other.bcQual_);
+    ctxtFlag_ = std::move(other.ctxtFlag_);
+    return *this;
+}
+
+bool PbiRawBarcodeData::AddRecord(const BamRecord& b)
+{
+    const BamRecordImpl& impl = b.Impl();
+    const bool hasBcTag = impl.HasTag("bc");
+    const bool hasBqTag = impl.HasTag("bq");
+    const bool hasCxTag = impl.HasTag("cx");
+    const bool hasBarcodeInfo = hasBcTag && hasBqTag && hasCxTag;
+    if (!hasBarcodeInfo)
+        return false;
+
+    const vector<uint16_t> bcValue = impl.TagValue("bc").ToUInt16Array();
+    assert(bcValue.size() == 2);
+    bcLeft_.push_back(bcValue[0]);
+    bcRight_.push_back(bcValue[1]);
+
+    bcQual_.push_back(impl.TagValue("bq").ToUInt8());
+    ctxtFlag_.push_back(impl.TagValue("cx").ToUInt8());
+
+    return true;
+}
+
+// ----------------------------------
+// PbiRawMappedData implementation
+// ----------------------------------
+
+PbiRawMappedData::PbiRawMappedData(void) { }
+
+PbiRawMappedData::PbiRawMappedData(uint32_t numReads)
+{
+    tId_.reserve(numReads);
+    tStart_.reserve(numReads);
+    tEnd_.reserve(numReads);
+    aStart_.reserve(numReads);
+    aEnd_.reserve(numReads);
+    revStrand_.reserve(numReads);
+    nM_.reserve(numReads);
+    nMM_.reserve(numReads);
+    mapQV_.reserve(numReads);
+}
+
+PbiRawMappedData::PbiRawMappedData(const PbiRawMappedData& other)
+    : tId_(other.tId_)
+    , tStart_(other.tStart_)
+    , tEnd_(other.tEnd_)
+    , aStart_(other.aStart_)
+    , aEnd_(other.aEnd_)
+    , revStrand_(other.revStrand_)
+    , nM_(other.nM_)
+    , nMM_(other.nMM_)
+    , mapQV_(other.mapQV_)
+{ }
+
+PbiRawMappedData::PbiRawMappedData(PbiRawMappedData&& other)
+    : tId_(std::move(other.tId_))
+    , tStart_(std::move(other.tStart_))
+    , tEnd_(std::move(other.tEnd_))
+    , aStart_(std::move(other.aStart_))
+    , aEnd_(std::move(other.aEnd_))
+    , revStrand_(std::move(other.revStrand_))
+    , nM_(std::move(other.nM_))
+    , nMM_(std::move(other.nMM_))
+    , mapQV_(std::move(other.mapQV_))
+{ }
+
+PbiRawMappedData& PbiRawMappedData::operator=(const PbiRawMappedData& other)
+{
+    tId_ = other.tId_;
+    tStart_ = other.tStart_;
+    tEnd_ = other.tEnd_;
+    aStart_ = other.aStart_;
+    aEnd_ = other.aEnd_;
+    revStrand_ = other.revStrand_;
+    nM_ = other.nM_;
+    nMM_ = other.nMM_;
+    mapQV_ = other.mapQV_;
+    return *this;
+}
+
+PbiRawMappedData& PbiRawMappedData::operator=(PbiRawMappedData&& other)
+{
+    tId_ = std::move(other.tId_);
+    tStart_ = std::move(other.tStart_);
+    tEnd_ = std::move(other.tEnd_);
+    aStart_ = std::move(other.aStart_);
+    aEnd_ = std::move(other.aEnd_);
+    revStrand_ = std::move(other.revStrand_);
+    nM_ = std::move(other.nM_);
+    nMM_ = std::move(other.nMM_);
+    mapQV_ = std::move(other.mapQV_);
+    return *this;
+}
+
+bool PbiRawMappedData::AddRecord(const BamRecord& b)
+{
+    if (!b.IsMapped())
+        return false;
+
+    tId_.push_back(b.ReferenceId());
+    tStart_.push_back(b.ReferenceStart());
+    tEnd_.push_back(b.ReferenceEnd());
+    aStart_.push_back(b.AlignedStart());
+    aEnd_.push_back(b.AlignedEnd());
+    revStrand_.push_back( (b.AlignedStrand() == Strand::REVERSE ? 1 : 0) );
+    mapQV_.push_back(b.MapQuality());
+
+    uint32_t nM = 0;
+    uint32_t nMM = 0;
+    const Cigar& cigar = b.CigarData();
+    auto cigarIter = cigar.cbegin();
+    auto cigarEnd  = cigar.cend();
+    for (; cigarIter != cigarEnd; ++cigarIter) {
+        const CigarOperation& op = (*cigarIter);
+        if (op.Type() == CigarOperationType::SEQUENCE_MATCH)
+            nM += op.Length();
+        else if (op.Type() == CigarOperationType::SEQUENCE_MISMATCH)
+            nMM += op.Length();
+        else if (op.Type() == CigarOperationType::ALIGNMENT_MATCH)
+            throw std::runtime_error("CIGAR operation 'M' is not allowed in PacBio BAM files. Use 'X/=' instead.");
+    }
+    nM_.push_back(nM);
+    nMM_.push_back(nMM);
+
+    return true;
+}
+// ------------------------------------
+// PbiReferenceEntry implementation
+// ------------------------------------
+
+const PbiReferenceEntry::ID  PbiReferenceEntry::UNMAPPED_ID = static_cast<PbiReferenceEntry::ID>(-1);
+const PbiReferenceEntry::Row PbiReferenceEntry::UNSET_ROW   = static_cast<PbiReferenceEntry::Row>(-1);
+
+PbiReferenceEntry::PbiReferenceEntry(void)
+    : tId_(UNMAPPED_ID)
+    , beginRow_(UNSET_ROW)
+    , endRow_(UNSET_ROW)
+{ }
+
+PbiReferenceEntry::PbiReferenceEntry(ID id)
+    : tId_(id)
+    , beginRow_(UNSET_ROW)
+    , endRow_(UNSET_ROW)
+{ }
+
+PbiReferenceEntry::PbiReferenceEntry(const PbiReferenceEntry& other)
+    : tId_(other.tId_)
+    , beginRow_(other.beginRow_)
+    , endRow_(other.endRow_)
+{ }
+
+PbiReferenceEntry::PbiReferenceEntry(PbiReferenceEntry&& other)
+    : tId_(std::move(other.tId_))
+    , beginRow_(std::move(other.beginRow_))
+    , endRow_(std::move(other.endRow_))
+{ }
+
+PbiReferenceEntry& PbiReferenceEntry::operator=(const PbiReferenceEntry& other)
+{
+    tId_ = other.tId_;
+    beginRow_ = other.beginRow_;
+    endRow_ = other.endRow_;
+    return *this;
+}
+
+PbiReferenceEntry& PbiReferenceEntry::operator=(PbiReferenceEntry&& other)
+{
+    tId_ = std::move(other.tId_);
+    beginRow_ = std::move(other.beginRow_);
+    endRow_ = std::move(other.endRow_);
+    return *this;
+}
+
+// ------------------------------------
+// PbiRawReferenceData implementation
+// ------------------------------------
+
+PbiRawReferenceData::PbiRawReferenceData(void) { }
+
+PbiRawReferenceData::PbiRawReferenceData(uint32_t numRefs)
+{  entries_.reserve(numRefs); }
+
+PbiRawReferenceData::PbiRawReferenceData(const PbiRawReferenceData& other)
+    : entries_(other.entries_)
+{ }
+
+PbiRawReferenceData::PbiRawReferenceData(PbiRawReferenceData&& other)
+    : entries_(std::move(other.entries_))
+{ }
+
+PbiRawReferenceData& PbiRawReferenceData::operator=(const PbiRawReferenceData& other)
+{
+    entries_ = other.entries_;
+    return *this;
+}
+
+PbiRawReferenceData& PbiRawReferenceData::operator=(PbiRawReferenceData&& other)
+{
+    entries_ = std::move(other.entries_);
+    return *this;
+}
+
+// ----------------------------------
+// PbiRawSubreadData implementation
+// ----------------------------------
+
+PbiRawSubreadData::PbiRawSubreadData(void) { }
+
+PbiRawSubreadData::PbiRawSubreadData(uint32_t numReads)
+{
+    rgId_.reserve(numReads);
+    qStart_.reserve(numReads);
+    qEnd_.reserve(numReads);
+    holeNumber_.reserve(numReads);
+    readQual_.reserve(numReads);
+    fileOffset_.reserve(numReads);
+}
+
+PbiRawSubreadData::PbiRawSubreadData(const PbiRawSubreadData& other)
+    : rgId_(other.rgId_)
+    , qStart_(other.qStart_)
+    , qEnd_(other.qEnd_)
+    , holeNumber_(other.holeNumber_)
+    , readQual_(other.readQual_)
+    , fileOffset_(other.fileOffset_)
+{ }
+
+PbiRawSubreadData::PbiRawSubreadData(PbiRawSubreadData&& other)
+    : rgId_(std::move(other.rgId_))
+    , qStart_(std::move(other.qStart_))
+    , qEnd_(std::move(other.qEnd_))
+    , holeNumber_(std::move(other.holeNumber_))
+    , readQual_(std::move(other.readQual_))
+    , fileOffset_(std::move(other.fileOffset_))
+{ }
+
+PbiRawSubreadData& PbiRawSubreadData::operator=(const PbiRawSubreadData& other)
+{
+    rgId_ = other.rgId_;
+    qStart_ = other.qStart_;
+    qEnd_ = other.qEnd_;
+    holeNumber_ = other.holeNumber_;
+    readQual_ = other.readQual_;
+    fileOffset_ = other.fileOffset_;
+    return *this;
+}
+
+PbiRawSubreadData& PbiRawSubreadData::operator=(PbiRawSubreadData&& other)
+{
+    rgId_ = std::move(other.rgId_);
+    qStart_ = std::move(other.qStart_);
+    qEnd_ = std::move(other.qEnd_);
+    holeNumber_ = std::move(other.holeNumber_);
+    readQual_ = std::move(other.readQual_);
+    fileOffset_ = std::move(other.fileOffset_);
+    return *this;
+}
+
+void PbiRawSubreadData::AddRecord(const BamRecord& b, int64_t offset)
+{
+
+    string rgId = b.ReadGroupId();
+    if (rgId.empty()) {
+        // calculate
+    }
+    const uint32_t rawid = std::stoul(rgId, nullptr, 16);
+    const int32_t id = static_cast<int32_t>(rawid);
+
+    rgId_.push_back(id);
+
+    if (b.Type() == RecordType::CCS) {
+        qStart_.push_back(-1);
+        qEnd_.push_back(-1);
+    } else {
+        qStart_.push_back(b.QueryStart());
+        qEnd_.push_back(b.QueryEnd());
+    }
+
+    if (b.HasHoleNumber())
+        holeNumber_.push_back(b.HoleNumber());
+    else
+        holeNumber_.push_back(0); // TODO: what to do?
+
+    if (b.HasReadAccuracy())
+        readQual_.push_back(b.ReadAccuracy());
+    else
+        readQual_.push_back(0); // TODO: what to do?
+
+    fileOffset_.push_back(offset);
+}
+
+// ----------------------------------
+// PbiRawData implementation
+// ----------------------------------
+
+PbiRawData::PbiRawData(void)
+    : version_(PbiFile::CurrentVersion)
+    , sections_(PbiFile::ALL)
+    , numReads_(0)
+{ }
+
+PbiRawData::PbiRawData(const string& pbiFilename)
+    : version_(PbiFile::CurrentVersion)
+    , sections_(PbiFile::ALL)
+    , numReads_(0)
+{
+    internal::PbiIndexIO::Load(*this, pbiFilename);
+}
+
+PbiRawData::PbiRawData(const PbiRawData& other)
+    : version_(other.version_)
+    , sections_(other.sections_)
+    , numReads_(other.numReads_)
+    , barcodeData_(other.barcodeData_)
+    , mappedData_(other.mappedData_)
+    , referenceData_(other.referenceData_)
+    , subreadData_(other.subreadData_)
+{ }
+
+PbiRawData::PbiRawData(PbiRawData&& other)
+    : version_(std::move(other.version_))
+    , sections_(std::move(other.sections_))
+    , numReads_(std::move(other.numReads_))
+    , barcodeData_(std::move(other.barcodeData_))
+    , mappedData_(std::move(other.mappedData_))
+    , referenceData_(std::move(other.referenceData_))
+    , subreadData_(std::move(other.subreadData_))
+{ }
+
+PbiRawData& PbiRawData::operator=(const PbiRawData& other)
+{
+    version_ = other.version_;
+    sections_ = other.sections_;
+    numReads_ = other.numReads_;
+    barcodeData_ = other.barcodeData_;
+    mappedData_ = other.mappedData_;
+    referenceData_ = other.referenceData_;
+    subreadData_ = other.subreadData_;
+    return *this;
+}
+
+PbiRawData& PbiRawData::operator=(PbiRawData&& other)
+{
+    version_ = std::move(other.version_);
+    sections_ = std::move(other.sections_);
+    numReads_ = std::move(other.numReads_);
+    barcodeData_ = std::move(other.barcodeData_);
+    mappedData_ = std::move(other.mappedData_);
+    referenceData_ = std::move(other.referenceData_);
+    subreadData_ = std::move(other.subreadData_);
+    return *this;
+}
+
+PbiRawData::~PbiRawData(void) { }
diff --git a/src/ProgramInfo.cpp b/src/ProgramInfo.cpp
new file mode 100644
index 0000000..45c8680
--- /dev/null
+++ b/src/ProgramInfo.cpp
@@ -0,0 +1,161 @@
+
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/ProgramInfo.h"
+#include "SequenceUtils.h"
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static string token_ID = string("ID");
+static string token_CL = string("CL");
+static string token_DS = string("DS");
+static string token_PN = string("PN");
+static string token_PP = string("PP");
+static string token_VN = string("VN");
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+ProgramInfo::ProgramInfo(void) { }
+
+ProgramInfo::ProgramInfo(const std::string& id)
+    : id_(id)
+{ }
+
+ProgramInfo::ProgramInfo(const ProgramInfo& other)
+    : commandLine_(other.commandLine_)
+    , description_(other.description_)
+    , id_(other.id_)
+    , name_(other.name_)
+    , previousProgramId_(other.previousProgramId_)
+    , version_(other.version_)
+{  }
+
+ProgramInfo::ProgramInfo(ProgramInfo&& other)
+    : commandLine_(std::move(other.commandLine_))
+    , description_(std::move(other.description_))
+    , id_(std::move(other.id_))
+    , name_(std::move(other.name_))
+    , previousProgramId_(std::move(other.previousProgramId_))
+    , version_(std::move(other.version_))
+{ }
+
+ProgramInfo::~ProgramInfo(void) { }
+
+ProgramInfo& ProgramInfo::operator=(const ProgramInfo& other)
+{
+    commandLine_ = other.commandLine_;
+    description_ = other.description_;
+    id_ = other.id_;
+    name_ = other.name_;
+    previousProgramId_ = other.previousProgramId_;
+    version_ = other.version_;
+    return *this;
+}
+
+ProgramInfo& ProgramInfo::operator=(ProgramInfo&& other)
+{
+    commandLine_ = std::move(other.commandLine_);
+    description_ = std::move(other.description_);
+    id_ = std::move(other.id_);
+    name_ = std::move(other.name_);
+    previousProgramId_ = std::move(other.previousProgramId_);
+    version_ = std::move(other.version_);
+    return *this;
+}
+
+ProgramInfo ProgramInfo::FromSam(const string& sam)
+{
+    // pop off '@PG\t', then split rest of line into tokens
+    const vector<string>& tokens = internal::Split(sam.substr(4), '\t');
+    if (tokens.empty())
+        return ProgramInfo();
+
+    ProgramInfo prog;
+    map<string, string> custom;
+
+    // iterate over tokens
+    for (const string& token : tokens) {
+        const string& tokenTag   = token.substr(0,2);
+        const string& tokenValue = token.substr(3);
+
+        // set program contents
+        if      (tokenTag == internal::token_ID) prog.Id(tokenValue);
+        else if (tokenTag == internal::token_CL) prog.CommandLine(tokenValue);
+        else if (tokenTag == internal::token_DS) prog.Description(tokenValue);
+        else if (tokenTag == internal::token_PN) prog.Name(tokenValue);
+        else if (tokenTag == internal::token_PP) prog.PreviousProgramId(tokenValue);
+        else if (tokenTag == internal::token_VN) prog.Version(tokenValue);
+
+        // otherwise, "custom" tag
+        else
+            custom[tokenTag] = tokenValue;
+    }
+
+    prog.CustomTags(custom);
+    return prog;
+}
+
+string ProgramInfo::ToSam(void) const
+{
+    stringstream out;
+    out << "@PG"
+        << internal::MakeSamTag(internal::token_ID, id_);
+
+    if (!name_.empty())              out << internal::MakeSamTag(internal::token_PN, name_);
+    if (!version_.empty())           out << internal::MakeSamTag(internal::token_VN, version_);
+    if (!description_.empty())       out << internal::MakeSamTag(internal::token_DS, description_);
+    if (!previousProgramId_.empty()) out << internal::MakeSamTag(internal::token_PP, previousProgramId_);
+    if (!commandLine_.empty())       out << internal::MakeSamTag(internal::token_CL, commandLine_);
+
+    // append any custom tags
+    map<string, string>::const_iterator customIter = custom_.cbegin();
+    map<string, string>::const_iterator customEnd  = custom_.cend();
+    for ( ; customIter != customEnd; ++customIter )
+        out << internal::MakeSamTag(customIter->first, customIter->second);
+
+    return out.str();
+}
+
diff --git a/src/QualityValue.cpp b/src/QualityValue.cpp
new file mode 100644
index 0000000..200b96b
--- /dev/null
+++ b/src/QualityValue.cpp
@@ -0,0 +1,43 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/QualityValue.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const uint8_t QualityValue::MAX = 93;
diff --git a/src/QueryBase.cpp b/src/QueryBase.cpp
new file mode 100644
index 0000000..8bd2a53
--- /dev/null
+++ b/src/QueryBase.cpp
@@ -0,0 +1,48 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/QueryBase.h"
+#include "pbbam/BamRecord.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+QueryBase::QueryBase(const BamFile& file)
+    : file_(file)
+{ }
+
+QueryBase::~QueryBase(void) { }
diff --git a/src/ReadGroupInfo.cpp b/src/ReadGroupInfo.cpp
new file mode 100644
index 0000000..b48c602
--- /dev/null
+++ b/src/ReadGroupInfo.cpp
@@ -0,0 +1,525 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/ReadGroupInfo.h"
+#include "SequenceUtils.h"
+#include <cram/md5.h>
+#include <cstdio>
+#include <set>
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static const string token_ID = string("ID");
+static const string token_CN = string("CN");
+static const string token_DS = string("DS");
+static const string token_DT = string("DT");
+static const string token_FO = string("FO");
+static const string token_KS = string("KS");
+static const string token_LB = string("LB");
+static const string token_PG = string("PG");
+static const string token_PI = string("PI");
+static const string token_PL = string("PL");
+static const string token_PU = string("PU");
+static const string token_SM = string("SM");
+
+static const string feature_DQ = string("DeletionQV");
+static const string feature_DT = string("DeletionTag");
+static const string feature_IQ = string("InsertionQV");
+static const string feature_MQ = string("MergeQV");
+static const string feature_SQ = string("SubstitutionQV");
+static const string feature_ST = string("SubstitutionTag");
+static const string feature_IP = string("Ipd");
+static const string feature_PW = string("PulseWidth");
+static const string feature_PM = string("PkMid");
+static const string feature_PA = string("PkMean");
+static const string feature_LT = string("Label");
+static const string feature_PQ = string("LabelQV");
+static const string feature_PT = string("AltLabel");
+static const string feature_PV = string("AltLabelQV");
+static const string feature_PG = string("PulseMergeQV");
+static const string feature_PC = string("PulseCall");
+static const string feature_PD = string("PrePulseFrames");
+static const string feature_PX = string("PulseCallWidth");
+
+static const string token_RT = string("READTYPE");
+static const string token_BK = string("BINDINGKIT");
+static const string token_SK = string("SEQUENCINGKIT");
+static const string token_BV = string("BASECALLERVERSION");
+static const string token_FR = string("FRAMERATEHZ");
+static const string token_CT = string("CONTROL");
+
+static const string codec_RAW = string("Frames");
+static const string codec_V1  = string("CodecV1");
+
+static
+string BaseFeatureName(const BaseFeature& feature)
+{
+    switch(feature) {
+        case BaseFeature::DELETION_QV      : return feature_DQ;
+        case BaseFeature::DELETION_TAG     : return feature_DT;
+        case BaseFeature::INSERTION_QV     : return feature_IQ;
+        case BaseFeature::MERGE_QV         : return feature_MQ;
+        case BaseFeature::SUBSTITUTION_QV  : return feature_SQ;
+        case BaseFeature::SUBSTITUTION_TAG : return feature_ST;
+        case BaseFeature::IPD              : return feature_IP;
+        case BaseFeature::PULSE_WIDTH      : return feature_PW;
+        case BaseFeature::PKMID            : return feature_PM;
+        case BaseFeature::PKMEAN           : return feature_PA;
+        case BaseFeature::LABEL_QV         : return feature_PQ;
+        case BaseFeature::ALT_LABEL        : return feature_PT;
+        case BaseFeature::ALT_LABEL_QV     : return feature_PV;
+        case BaseFeature::PULSE_MERGE_QV   : return feature_PG;
+        case BaseFeature::PULSE_CALL       : return feature_PC;
+        case BaseFeature::PRE_PULSE_FRAMES : return feature_PD;
+        case BaseFeature::PULSE_CALL_WIDTH : return feature_PX;
+        default:
+            throw std::runtime_error("unrecognized base feature");
+    }
+    return string();
+}
+
+static
+string FrameCodecName(const FrameCodec& codec)
+{
+    switch (codec) {
+        case FrameCodec::RAW : return codec_RAW;
+        case FrameCodec::V1  : return codec_V1;
+        default:
+            throw std::runtime_error("unrecognized frame codec");
+    }
+    return string();
+}
+
+static map<string, BaseFeature> nameToFeature;
+static map<string, FrameCodec>  nameToCodec;
+
+static inline
+void InitNameToFeature(void)
+{
+    if (nameToFeature.empty()) {
+        nameToFeature[feature_DQ] = BaseFeature::DELETION_QV;
+        nameToFeature[feature_DT] = BaseFeature::DELETION_TAG;
+        nameToFeature[feature_IQ] = BaseFeature::INSERTION_QV;
+        nameToFeature[feature_MQ] = BaseFeature::MERGE_QV;
+        nameToFeature[feature_SQ] = BaseFeature::SUBSTITUTION_QV;
+        nameToFeature[feature_ST] = BaseFeature::SUBSTITUTION_TAG;
+        nameToFeature[feature_IP] = BaseFeature::IPD;
+        nameToFeature[feature_PW] = BaseFeature::PULSE_WIDTH;
+        nameToFeature[feature_PM] = BaseFeature::PKMID;
+        nameToFeature[feature_PA] = BaseFeature::PKMEAN;
+        nameToFeature[feature_PQ] = BaseFeature::LABEL_QV;
+        nameToFeature[feature_PT] = BaseFeature::ALT_LABEL;
+        nameToFeature[feature_PV] = BaseFeature::ALT_LABEL_QV;
+        nameToFeature[feature_PC] = BaseFeature::PULSE_CALL;
+        nameToFeature[feature_PG] = BaseFeature::PULSE_MERGE_QV;
+        nameToFeature[feature_PD] = BaseFeature::PRE_PULSE_FRAMES;
+        nameToFeature[feature_PX] = BaseFeature::PULSE_CALL_WIDTH;
+    }
+}
+
+static inline
+void InitNameToCodec(void)
+{
+    if (nameToCodec.empty()) {
+        nameToCodec[codec_RAW] = FrameCodec::RAW;
+        nameToCodec[codec_V1]  = FrameCodec::V1;
+    }
+}
+
+static inline
+bool IsBaseFeature(const std::string& name)
+{
+    InitNameToFeature();
+    return nameToFeature.find(name) != nameToFeature.cend();
+}
+
+static inline
+BaseFeature BaseFeatureFromName(const std::string& name)
+{
+    InitNameToFeature();
+    return nameToFeature.at(name);
+}
+
+static inline
+FrameCodec FrameCodecFromName(const string& name)
+{
+    InitNameToCodec();
+    return nameToCodec.at(name);
+}
+
+} // namespace internal
+
+ReadGroupInfo::ReadGroupInfo(void)
+    : readType_("UNKNOWN")
+    , ipdCodec_(FrameCodec::V1)
+    , pulseWidthCodec_(FrameCodec::V1)
+{ }
+
+ReadGroupInfo::ReadGroupInfo(const std::string& id)
+    : id_(id)
+    , readType_("UNKNOWN")
+    , ipdCodec_(FrameCodec::V1)
+    , pulseWidthCodec_(FrameCodec::V1)
+{ }
+
+ReadGroupInfo::ReadGroupInfo(const std::string& movieName,
+                             const std::string& readType)
+    : id_(MakeReadGroupId(movieName, readType))
+    , movieName_(movieName)
+    , readType_(readType)
+{ }
+
+ReadGroupInfo::ReadGroupInfo(const ReadGroupInfo& other)
+    : id_(other.id_)
+    , sequencingCenter_(other.sequencingCenter_)
+    , date_(other.date_)
+    , flowOrder_(other.flowOrder_)
+    , keySequence_(other.keySequence_)
+    , library_(other.library_)
+    , programs_(other.programs_)
+    , predictedInsertSize_(other.predictedInsertSize_)
+    , movieName_(other.movieName_)
+    , sample_(other.sample_)
+    , readType_(other.readType_)
+    , bindingKit_(other.bindingKit_)
+    , sequencingKit_(other.sequencingKit_)
+    , basecallerVersion_(other.basecallerVersion_)
+    , frameRateHz_(other.frameRateHz_)
+    , control_(other.control_)
+    , ipdCodec_(other.ipdCodec_)
+    , pulseWidthCodec_(other.pulseWidthCodec_)
+    , features_(other.features_)
+{  }
+
+ReadGroupInfo::ReadGroupInfo(ReadGroupInfo&& other)
+    : id_(std::move(other.id_))
+    , sequencingCenter_(std::move(other.sequencingCenter_))
+    , date_(std::move(other.date_))
+    , flowOrder_(std::move(other.flowOrder_))
+    , keySequence_(std::move(other.keySequence_))
+    , library_(std::move(other.library_))
+    , programs_(std::move(other.programs_))
+    , predictedInsertSize_(std::move(other.predictedInsertSize_))
+    , movieName_(std::move(other.movieName_))
+    , sample_(std::move(other.sample_))
+    , readType_(std::move(other.readType_))
+    , bindingKit_(std::move(other.bindingKit_))
+    , sequencingKit_(std::move(other.sequencingKit_))
+    , basecallerVersion_(std::move(other.basecallerVersion_))
+    , frameRateHz_(std::move(other.frameRateHz_))
+    , control_(std::move(other.control_))
+    , ipdCodec_(std::move(other.ipdCodec_))
+    , pulseWidthCodec_(std::move(other.pulseWidthCodec_))
+    , features_(std::move(other.features_))
+{ }
+
+ReadGroupInfo::~ReadGroupInfo(void) { }
+
+ReadGroupInfo& ReadGroupInfo::operator=(const ReadGroupInfo& other)
+{
+    id_ = other.id_;
+    sequencingCenter_ = other.sequencingCenter_;
+    date_ = other.date_;
+    flowOrder_ = other.flowOrder_;
+    keySequence_ = other.keySequence_;
+    library_ = other.library_;
+    programs_ = other.programs_;
+    predictedInsertSize_ = other.predictedInsertSize_;
+    movieName_ = other.movieName_;
+    sample_ = other.sample_;
+    readType_ = other.readType_;
+    bindingKit_ = other.bindingKit_;
+    sequencingKit_ = other.sequencingKit_;
+    basecallerVersion_ = other.basecallerVersion_;
+    frameRateHz_ = other.frameRateHz_;
+    control_ = other.control_;
+    ipdCodec_ = other.ipdCodec_;
+    pulseWidthCodec_ = other.pulseWidthCodec_;
+    features_ = other.features_;
+    return *this;
+}
+
+ReadGroupInfo& ReadGroupInfo::operator=(ReadGroupInfo&& other)
+{
+    id_ = std::move(other.id_);
+    sequencingCenter_ = std::move(other.sequencingCenter_);
+    date_ = std::move(other.date_);
+    flowOrder_ = std::move(other.flowOrder_);
+    keySequence_ = std::move(other.keySequence_);
+    library_ = std::move(other.library_);
+    programs_ = std::move(other.programs_);
+    predictedInsertSize_ = std::move(other.predictedInsertSize_);
+    movieName_ = std::move(other.movieName_);
+    sample_ = std::move(other.sample_);
+    readType_ = std::move(other.readType_);
+    bindingKit_ = std::move(other.bindingKit_);
+    sequencingKit_ = std::move(other.sequencingKit_);
+    basecallerVersion_ = std::move(other.basecallerVersion_);
+    frameRateHz_ = std::move(other.frameRateHz_);
+    control_ = std::move(other.control_);
+    ipdCodec_ = std::move(other.ipdCodec_);
+    pulseWidthCodec_ = std::move(other.pulseWidthCodec_);
+    features_ = std::move(other.features_);
+    return *this;
+}
+
+void ReadGroupInfo::DecodeSamDescription(const std::string& description)
+{
+    // split on semicolons
+    // for each, split on equal
+    //    determine name ->
+
+    const vector<string>& tokens = internal::Split(description, ';');
+    if (tokens.empty())
+        return;
+
+    // iterate over tokens
+    auto tokenEnd  = tokens.cend();
+    for (auto tokenIter = tokens.cbegin(); tokenIter != tokenEnd; ++tokenIter) {
+
+        const string& token = *tokenIter;
+
+        const size_t foundEqual = token.find('=');
+        if (foundEqual == string::npos)
+            continue;
+
+        const string& key = token.substr(0,foundEqual);
+        const string& value = token.substr(foundEqual+1);
+
+        if      (key == internal::token_RT) readType_ = value;
+        else if (key == internal::token_BK) bindingKit_ = value;
+        else if (key == internal::token_BV) basecallerVersion_ = value;
+        else if (key == internal::token_SK) sequencingKit_ = value;
+        else if (key == internal::token_FR) frameRateHz_ = value;
+        else if (key == internal::token_CT) control_ = value == "TRUE";
+        else if (internal::IsBaseFeature(key)) {
+            features_[internal::BaseFeatureFromName(key)] = value;
+        } 
+        else {
+            const vector<string> keyParts = internal::Split(key, ':');
+            if (keyParts.size() == 2) {
+                const string& subkey = keyParts.at(0);
+                if (subkey == internal::feature_IP) {
+                    ipdCodec_ = internal::FrameCodecFromName(keyParts.at(1));
+                    features_[BaseFeature::IPD] = value;
+                } 
+                else if (subkey == internal::feature_PW) {
+                    pulseWidthCodec_ = internal::FrameCodecFromName(keyParts.at(1));
+                    features_[BaseFeature::PULSE_WIDTH] = value;
+                }
+            }
+        }
+    }
+}
+
+std::string ReadGroupInfo::EncodeSamDescription(void) const
+{
+    string result;
+    result.reserve(256);
+    result.append(std::string(internal::token_RT+"=" + readType_));
+
+    string featureName;
+    const auto featureEnd = features_.cend();
+    auto featureIter = features_.cbegin();
+    for ( ; featureIter != featureEnd; ++featureIter ) {
+        featureName = internal::BaseFeatureName(featureIter->first);
+        if (featureName.empty() || featureIter->second.empty())
+            continue;
+        else if (featureName == internal::feature_IP) {
+            featureName.append(":");
+            featureName.append(internal::FrameCodecName(ipdCodec_));
+        }
+        else if (featureName == internal::feature_PW) {
+            featureName.append(":");
+            featureName.append(internal::FrameCodecName(pulseWidthCodec_));
+        }
+        result.append(string(';' + featureName + '=' + featureIter->second));
+    }
+
+    if (!bindingKit_.empty())        result.append(";"+internal::token_BK+"="+bindingKit_);
+    if (!sequencingKit_.empty())     result.append(";"+internal::token_SK+"="+sequencingKit_);
+    if (!basecallerVersion_.empty()) result.append(";"+internal::token_BV+"="+basecallerVersion_);
+    if (!frameRateHz_.empty())       result.append(";"+internal::token_FR+"="+frameRateHz_);
+    if (control_)                    result.append(";"+internal::token_CT+"="+ (control_ ? "TRUE" : "FALSE"));
+
+    return result;
+}
+
+ReadGroupInfo ReadGroupInfo::FromSam(const string& sam)
+{
+    // pop off '@RG\t', then split rest of line into tokens
+    const vector<string>& tokens = internal::Split(sam.substr(4), '\t');
+    if (tokens.empty())
+        return ReadGroupInfo();
+
+    ReadGroupInfo rg;
+    map<string, string> custom;
+
+    for (const string& token : tokens) {
+        const string& tokenTag   = token.substr(0,2);
+        const string& tokenValue = token.substr(3);
+
+        // set read group info
+        if      (tokenTag == internal::token_ID) rg.Id(tokenValue);
+        else if (tokenTag == internal::token_CN) rg.SequencingCenter(tokenValue);
+        else if (tokenTag == internal::token_DT) rg.Date(tokenValue);
+        else if (tokenTag == internal::token_FO) rg.FlowOrder(tokenValue);
+        else if (tokenTag == internal::token_KS) rg.KeySequence(tokenValue);
+        else if (tokenTag == internal::token_LB) rg.Library(tokenValue);
+        else if (tokenTag == internal::token_PG) rg.Programs(tokenValue);
+        else if (tokenTag == internal::token_PI) rg.PredictedInsertSize(tokenValue);
+        else if (tokenTag == internal::token_PU) rg.MovieName(tokenValue);
+        else if (tokenTag == internal::token_SM) rg.Sample(tokenValue);
+        else if (tokenTag == internal::token_DS) rg.DecodeSamDescription(tokenValue);
+
+        // otherwise, "custom" tag
+        else
+            custom[tokenTag] = tokenValue;
+    }
+    rg.CustomTags(custom);
+
+    return rg;
+}
+
+ReadGroupInfo& ReadGroupInfo::IpdCodec(const FrameCodec& codec, const string& tag)
+{
+    // store desired codec type
+    ipdCodec_ = codec;
+
+    // update base features map
+    string actualTag = tag;
+    if (actualTag.empty())
+        actualTag = "ip";
+    BaseFeatureTag(BaseFeature::IPD, actualTag);
+    return *this;
+}
+
+ReadGroupInfo& ReadGroupInfo::PulseWidthCodec(const FrameCodec& codec, const string& tag)
+{
+    // store desired codec type
+    pulseWidthCodec_ = codec;
+
+    // update base features map
+    string actualTag = tag;
+    if (actualTag.empty())
+        actualTag = "pw";
+    BaseFeatureTag(BaseFeature::PULSE_WIDTH, actualTag);
+    return *this;
+}
+
+std::string ReadGroupInfo::ToSam(void) const
+{
+    stringstream out;
+    out << "@RG"
+        << internal::MakeSamTag(internal::token_ID, id_)
+        << internal::MakeSamTag(internal::token_PL, Platform());
+
+    const string& description = EncodeSamDescription();
+    if (!description.empty())
+        out << internal::MakeSamTag(internal::token_DS, description);
+
+    if (!sequencingCenter_.empty())    out << internal::MakeSamTag(internal::token_CN, sequencingCenter_);
+    if (!date_.empty())                out << internal::MakeSamTag(internal::token_DT, date_);
+    if (!flowOrder_.empty())           out << internal::MakeSamTag(internal::token_FO, flowOrder_);
+    if (!keySequence_.empty())         out << internal::MakeSamTag(internal::token_KS, keySequence_);
+    if (!library_.empty())             out << internal::MakeSamTag(internal::token_LB, library_);
+    if (!programs_.empty())            out << internal::MakeSamTag(internal::token_PG, programs_);
+    if (!predictedInsertSize_.empty()) out << internal::MakeSamTag(internal::token_PI, predictedInsertSize_);
+    if (!movieName_.empty())           out << internal::MakeSamTag(internal::token_PU, movieName_);
+    if (!sample_.empty())              out << internal::MakeSamTag(internal::token_SM, sample_);
+
+    // append any custom tags
+    map<string, string>::const_iterator customIter = custom_.cbegin();
+    map<string, string>::const_iterator customEnd  = custom_.cend();
+    for ( ; customIter != customEnd; ++customIter )
+        out << internal::MakeSamTag(customIter->first, customIter->second);
+
+    return out.str();
+}
+
+std::string MakeReadGroupId(const std::string& movieName,
+                            const std::string& readType)
+{
+    MD5_CTX md5;
+    unsigned char digest[16];
+    char hexdigest[9];
+
+    MD5_Init(&md5);
+    MD5_Update(&md5, reinterpret_cast<void*>(const_cast<char*>(movieName.c_str())), movieName.size());
+    MD5_Update(&md5, reinterpret_cast<void*>(const_cast<char*>("//")), 2);
+    MD5_Update(&md5, reinterpret_cast<void*>(const_cast<char*>(readType.c_str())), readType.size());
+    MD5_Final(digest, &md5);
+
+    for (int i = 0; i < 4; ++i)
+        sprintf(&hexdigest[2*i], "%02x", digest[i]);
+
+    return std::string(hexdigest, 8);
+}
+
+bool ReadGroupInfo::operator==(const ReadGroupInfo& other) const
+{
+    return id_ == other.id_ 
+            && sequencingCenter_ == other.sequencingCenter_        
+            && date_ == other.date_                    
+            && flowOrder_ == other.flowOrder_               
+            && keySequence_ == other.keySequence_             
+            && library_ == other.library_                 
+            && programs_ == other.programs_                
+            && predictedInsertSize_ == other.predictedInsertSize_     
+            && movieName_ == other.movieName_               
+            && sample_ == other.sample_                  
+            && readType_ == other.readType_ 
+            && bindingKit_ == other.bindingKit_ 
+            && sequencingKit_ == other.sequencingKit_ 
+            && basecallerVersion_ == other.basecallerVersion_ 
+            && frameRateHz_ == other.frameRateHz_ 
+            && control_ == other.control_ 
+            && ipdCodec_ == other.ipdCodec_
+            && pulseWidthCodec_ == other.pulseWidthCodec_
+            && features_.size() == other.features_.size()
+            && std::equal(features_.begin(), features_.end(),
+                          other.features_.begin());
+}
+
+} // namespace BAM
+} // namespace PacBio
diff --git a/src/SamTagCodec.cpp b/src/SamTagCodec.cpp
new file mode 100644
index 0000000..532998f
--- /dev/null
+++ b/src/SamTagCodec.cpp
@@ -0,0 +1,296 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/SamTagCodec.h"
+#include "AssertUtils.h"
+#include <boost/lexical_cast.hpp>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+template<typename T>
+inline void appendSamValue(const T& value,
+                           string& result,
+                           bool force8BitInt = false)
+{
+    if (force8BitInt)
+        result.append(boost::lexical_cast<string>(static_cast<int>(value)));
+    else
+        result.append(boost::lexical_cast<string>(value));
+}
+
+template<typename T>
+void appendSamMultiValue(const T& container,
+                         string& result,
+                         bool force8BitInt = false)
+{
+    auto end = container.cend();
+    for (auto iter = container.cbegin(); iter != end; ++iter) {
+        result.append(1, ',');
+        if ( force8BitInt )
+            result.append(boost::lexical_cast<string>(static_cast<int>(*iter)));
+        else
+            result.append(boost::lexical_cast<string>(*iter));
+    }
+}
+
+static
+vector<string>& split(const string& s, char delim, vector<string>& elems)
+{
+    stringstream ss(s);
+    string item;
+    while (getline(ss, item, delim))
+        elems.push_back(item);
+    return elems;
+}
+
+static
+vector<string> split(const string& s, char delim) {
+    vector<string> elems;
+    split(s, delim, elems);
+    return elems;
+}
+
+vector<float> readFloatSamMultiValue(const string& data)
+{
+    vector<float> result;
+    char* c = (char*)data.c_str();
+    const char* end = c + data.length();
+    while (c+1 < end) {
+        const float value = strtof(c+1, &c); // c+1 to skip comma
+        result.push_back(value);
+    }
+    return result;
+}
+
+template<typename T>
+vector<T> readSignedSamMultiValue(const string& data)
+{
+    vector<T> result;
+    char* c = (char*)data.c_str();
+    const char* end = c + data.length();
+    while (c+1 < end) {
+        const T value = strtol(c+1, &c, 0); // c+1 to skip comma
+        result.push_back(value);
+    }
+
+    return result;
+}
+
+template<typename T>
+vector<T> readUnsignedSamMultiValue(const string& data)
+{
+    vector<T> result;
+    char* c = (char*)data.c_str();
+    const char* end = c + data.length();
+    while (c+1 < end) {
+        const T value = strtoul(c+1, &c, 0); // c+1 to skip comma
+        result.push_back(value);
+    }
+    return result;
+}
+
+TagCollection SamTagCodec::Decode(const string& tagString)
+{
+    TagCollection tags;
+
+    const vector<string>& tokens = split(tagString, '\t');
+    const auto end = tokens.cend();
+    for (auto iter = tokens.cbegin(); iter != end; ++iter ) {
+        const string& token = (*iter);
+        if (token.size() < 6)          // TT:t:X
+            continue;
+
+        const string& name = token.substr(0, 2);
+        const char type = token.at(3);
+        const string& remainder = token.substr(5);
+        PB_ASSERT_OR_CONTINUE(!remainder.empty());
+
+        switch (type) {
+
+            // technically only 'A' is allowed in SAM chars, but we'll be a little permissive
+            case 'A' :
+            case 'a' :
+            {
+                tags[name] = static_cast<char>(remainder.at(0));
+                tags[name].Modifier(TagModifier::ASCII_CHAR);
+                break;
+            }
+
+            // technically only 'i' is allowed in SAM ints, but we'll be a little permissive
+            // since SAM might be a bit more "user-edited" than BAM
+            case 'c' :
+            case 'C' :
+            case 's' :
+            case 'S' :
+            case 'i' :
+            case 'I' :
+            {
+                // negative value (force signed int)
+                if (remainder.at(0) == '-') {
+                    const int32_t x = boost::lexical_cast<int32_t>(remainder);
+                    if ( x >= INT8_MIN )
+                        tags[name] = static_cast<int8_t>(x);  // check out boost::numeric cast
+                    else if ( x >= INT16_MIN )
+                        tags[name] = static_cast<int16_t>(x);
+                    else
+                        tags[name] = x;
+                }
+
+                // unsigned int
+                else {
+                    const uint32_t x = boost::lexical_cast<uint32_t>(remainder);
+                    if ( x <= UINT8_MAX )
+                        tags[name] = static_cast<uint8_t>(x);
+                    else if ( x <= UINT16_MAX )
+                        tags[name] = static_cast<uint16_t>(x);
+                    else
+                        tags[name] = x;
+                }
+                break;
+            }
+
+            case 'f' :
+            {
+                tags[name] = boost::lexical_cast<float>(remainder);
+                break;
+            }
+
+            case 'Z' :
+            {
+                tags[name] = remainder;
+                break;
+            }
+
+            case 'H' :
+            {
+                tags[name] = remainder;
+                tags[name].Modifier(TagModifier::HEX_STRING);
+                break;
+            }
+
+            case 'B' :
+            {
+                const char elementType = remainder.at(0);
+                const string& arrayData = remainder.substr(1);
+                switch (elementType) {
+                    case 'c' : tags[name] = readSignedSamMultiValue<int8_t>(arrayData);     break;
+                    case 'C' : tags[name] = readUnsignedSamMultiValue<uint8_t>(arrayData);  break;
+                    case 's' : tags[name] = readSignedSamMultiValue<int16_t>(arrayData);    break;
+                    case 'S' : tags[name] = readUnsignedSamMultiValue<uint16_t>(arrayData); break;
+                    case 'i' : tags[name] = readSignedSamMultiValue<int32_t>(arrayData);    break;
+                    case 'I' : tags[name] = readUnsignedSamMultiValue<uint32_t>(arrayData); break;
+                    case 'f' : tags[name] = readFloatSamMultiValue(arrayData);              break;
+                    default:
+                        PB_ASSERT_OR_CONTINUE(false);
+                }
+                break;
+            }
+
+            // unsupported SAM tag type
+            default :
+                PB_ASSERT_OR_CONTINUE(false);
+        }
+    }
+
+    return tags;
+}
+
+
+string SamTagCodec::Encode(const TagCollection& tags)
+{
+    string result;
+    result.reserve(1024);
+
+    const auto tagEnd = tags.cend();
+    for (auto tagIter = tags.cbegin(); tagIter != tagEnd; ++tagIter) {
+        const string& name = (*tagIter).first;
+        const Tag& tag = (*tagIter).second;
+        PB_ASSERT_OR_CONTINUE(name.size() == 2);
+        if (tag.IsNull())
+            continue;
+
+        // tab separator
+        if (!result.empty())
+            result.append(1, '\t');
+
+        // "<TAG>:"
+        result.append(name);
+        result.append(1, ':');
+
+        // "<TYPE>:<DATA>" for printable, ASCII char
+        if (tag.HasModifier(TagModifier::ASCII_CHAR)) {
+            char c = tag.ToAscii();
+            if (c != '\0') {
+                result.append("A:");
+                result.append(1, c);
+                continue;
+            }
+        }
+
+        // "<TYPE>:<DATA>" for all other data
+        switch ( tag.Type() ) {
+            case TagDataType::INT8   : result.append("i:"); appendSamValue(tag.ToInt8(),   result, true); break;
+            case TagDataType::UINT8  : result.append("i:"); appendSamValue(tag.ToUInt8(),  result, true); break;
+            case TagDataType::INT16  : result.append("i:"); appendSamValue(tag.ToInt16(),  result); break;
+            case TagDataType::UINT16 : result.append("i:"); appendSamValue(tag.ToUInt16(), result); break;
+            case TagDataType::INT32  : result.append("i:"); appendSamValue(tag.ToInt32(),  result); break;
+            case TagDataType::UINT32 : result.append("i:"); appendSamValue(tag.ToUInt32(), result); break;
+            case TagDataType::FLOAT  : result.append("f:"); appendSamValue(tag.ToFloat(),  result); break;
+
+            case TagDataType::STRING :
+            {
+                result.append(tag.HasModifier(TagModifier::HEX_STRING) ? "H:" : "Z:");
+                result.append(tag.ToString());
+                break;
+            }
+
+            case TagDataType::INT8_ARRAY   : result.append("B:c"); appendSamMultiValue(tag.ToInt8Array(),   result, true); break;
+            case TagDataType::UINT8_ARRAY  : result.append("B:C"); appendSamMultiValue(tag.ToUInt8Array(),  result, true); break;
+            case TagDataType::INT16_ARRAY  : result.append("B:s"); appendSamMultiValue(tag.ToInt16Array(),  result); break;
+            case TagDataType::UINT16_ARRAY : result.append("B:S"); appendSamMultiValue(tag.ToUInt16Array(), result); break;
+            case TagDataType::INT32_ARRAY  : result.append("B:i"); appendSamMultiValue(tag.ToInt32Array(),  result); break;
+            case TagDataType::UINT32_ARRAY : result.append("B:I"); appendSamMultiValue(tag.ToUInt32Array(), result); break;
+            case TagDataType::FLOAT_ARRAY  : result.append("B:f"); appendSamMultiValue(tag.ToFloatArray(),  result); break;
+
+            default :
+                PB_ASSERT_OR_RETURN_VALUE(false, string());
+        }
+    }
+
+    return result;
+}
diff --git a/src/SequenceInfo.cpp b/src/SequenceInfo.cpp
new file mode 100644
index 0000000..fa7837d
--- /dev/null
+++ b/src/SequenceInfo.cpp
@@ -0,0 +1,172 @@
+
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/SequenceInfo.h"
+#include "SequenceUtils.h"
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static string token_SN = string("SN");
+static string token_LN = string("LN");
+static string token_AS = string("AS");
+static string token_M5 = string("M5");
+static string token_SP = string("SP");
+static string token_UR = string("UR");
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+SequenceInfo::SequenceInfo(void) { }
+
+SequenceInfo::SequenceInfo(const std::string& name,
+                           const std::string& length)
+    : name_(name)
+    , length_(length)
+{ }
+
+SequenceInfo::SequenceInfo(const SequenceInfo& other)
+    : name_(other.name_)
+    , length_(other.length_)
+    , assemblyId_(other.assemblyId_)
+    , checksum_(other.checksum_)
+    , species_(other.species_)
+    , uri_(other.uri_)
+{  }
+
+SequenceInfo::SequenceInfo(SequenceInfo&& other)
+    : name_(std::move(other.name_))
+    , length_(std::move(other.length_))
+    , assemblyId_(std::move(other.assemblyId_))
+    , checksum_(std::move(other.checksum_))
+    , species_(std::move(other.species_))
+    , uri_(std::move(other.uri_))
+{ }
+
+SequenceInfo::~SequenceInfo(void) { }
+
+SequenceInfo& SequenceInfo::operator=(const SequenceInfo& other)
+{
+    name_ = other.name_;
+    length_ = other.length_;
+    assemblyId_ = other.assemblyId_;
+    checksum_ = other.checksum_;
+    species_ = other.species_;
+    uri_ = other.uri_;
+    return *this;
+}
+
+SequenceInfo& SequenceInfo::operator=(SequenceInfo&& other)
+{
+    name_ = std::move(other.name_);
+    length_ = std::move(other.length_);
+    assemblyId_ = std::move(other.assemblyId_);
+    checksum_ = std::move(other.checksum_);
+    species_ = std::move(other.species_);
+    uri_ = std::move(other.uri_);
+    return *this;
+}
+
+SequenceInfo SequenceInfo::FromSam(const std::string& sam)
+{
+    // pop off '@SQ\t', then split rest of line into tokens
+    const vector<string>& tokens = internal::Split(sam.substr(4), '\t');
+    if (tokens.empty())
+        return SequenceInfo();
+
+    SequenceInfo seq;
+    map<string, string> custom;
+
+    // iterate over tokens
+    for (const string& token : tokens) {
+        const string& tokenTag   = token.substr(0,2);
+        const string& tokenValue = token.substr(3);
+
+        // set sequence info
+        if      (tokenTag == internal::token_SN) seq.Name(tokenValue);
+        else if (tokenTag == internal::token_LN) seq.Length(tokenValue);
+        else if (tokenTag == internal::token_AS) seq.AssemblyId(tokenValue);
+        else if (tokenTag == internal::token_M5) seq.Checksum(tokenValue);
+        else if (tokenTag == internal::token_SP) seq.Species(tokenValue);
+        else if (tokenTag == internal::token_UR) seq.Uri(tokenValue);
+
+        // otherwise, "custom" tag
+        else
+            custom[tokenTag] = tokenValue;
+    }
+
+    seq.CustomTags(custom);
+    return seq;
+}
+
+bool SequenceInfo::IsValid(void) const
+{
+    if (name_.empty())
+        return false;
+
+    // use long instead of int32_t, just to make sure we can catch overflow
+    const long l = atol(length_.c_str());
+    return l >= 0 && l <= INT32_MAX;
+}
+
+std::string SequenceInfo::ToSam(void) const
+{
+    stringstream out;
+    out << "@SQ"
+        << internal::MakeSamTag(internal::token_SN, name_);
+
+    if (!length_.empty())     out << internal::MakeSamTag(internal::token_LN, length_);
+    if (!assemblyId_.empty()) out << internal::MakeSamTag(internal::token_AS, assemblyId_);
+    if (!checksum_.empty())   out << internal::MakeSamTag(internal::token_M5, checksum_);
+    if (!species_.empty())    out << internal::MakeSamTag(internal::token_SP, species_);
+    if (!uri_.empty())        out << internal::MakeSamTag(internal::token_UR, uri_);
+
+    // append any custom tags
+    map<string, string>::const_iterator customIter = custom_.cbegin();
+    map<string, string>::const_iterator customEnd  = custom_.cend();
+    for ( ; customIter != customEnd; ++customIter )
+        out << internal::MakeSamTag(customIter->first, customIter->second);
+
+    return out.str();
+}
diff --git a/src/SequenceUtils.h b/src/SequenceUtils.h
new file mode 100644
index 0000000..23bf5ac
--- /dev/null
+++ b/src/SequenceUtils.h
@@ -0,0 +1,125 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef SEQUENCEUTILS_H
+#define SEQUENCEUTILS_H
+
+#include "StringUtils.h"
+#include <algorithm>
+#include <string>
+#include <ctype.h>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+inline char Complement(const char character)
+{
+    static char const complementLookup[] =
+    {
+        '\0', 'T', 'V', 'G', 'H',
+        '\0', '\0', 'C', 'D', '\0',
+        '\0', 'M', '\0', 'K', 'N',
+        '\0', '\0', '\0', 'Y', 'S',
+        'A', 'A', 'B', 'W', '\0', 'R'
+    };
+    if (character == '-' || character == '*')
+        return character;
+    return complementLookup[toupper(character) & 0x1f];
+}
+
+//inline void Reverse(std::string& s)
+//{ std::reverse(s.begin(), s.end()); }
+
+template<typename T>
+void Reverse(T& input)
+{ std::reverse(input.begin(), input.end()); }
+
+template<typename T>
+T Reversed(const T& input)
+{
+    T result = input;
+    Reverse(result);
+    return result;
+}
+
+//inline std::string Reversed(const std::string& input)
+//{
+//    std::string result = input;
+//    Reverse(result);
+//    return result;
+//}
+
+inline void ReverseComplement(std::string& seq) {
+
+    std::string::iterator sIter = seq.begin();
+    std::string::iterator sEnd  = seq.end();
+    for ( ; sIter != sEnd; ++sIter )
+        *sIter = Complement(*sIter);
+    Reverse(seq);
+}
+
+/// Reverse complement a DNA sequence case-sensitive
+inline void ReverseComplementCaseSens(std::string& seq)
+{
+    const std::string original = seq;
+    int8_t rc_table[128] = {
+        4, 4, 4,   4,  4,   4, 4, 4,  4,  4,  4,  4, 4, 4,  4,  4, 4, 4, 4,
+        4, 4, 4,   4,  4,   4, 4, 4,  4,  4,  4,  4, 4, 32, 4,  4, 4, 4, 4,
+        4, 4, 4,   4,  4,   4, 4, 45, 4,  4,  4,  4, 4, 4,  4,  4, 4, 4, 4,
+        4, 4, 4,   4,  4,   4, 4, 4,  84, 4,  71, 4, 4, 4,  67, 4, 4, 4, 4,
+        4, 4, 78,  4,  4,   4, 4, 4,  65, 65, 4,  4, 4, 4,  4,  4, 4, 4, 4,
+        4, 4, 116, 4,  103, 4, 4, 4,  99, 4,  4,  4, 4, 4,  4,  4, 4, 4, 4,
+        4, 4, 97,  97, 4,   4, 4, 4,  4,  4,  4,  4, 4, 4};
+    std::string reverseCompl(original.length(), 'N');
+    for (uint32_t i = 0; i < original.length(); ++i)
+        reverseCompl[original.length()-i-1] = (char)rc_table[(int8_t)original[i]];
+    seq = reverseCompl;
+}
+
+inline std::string ReverseComplemented(const std::string& input)
+{
+    std::string result = input;
+    ReverseComplement(result);
+    return result;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // SEQUENCEUTILS_H
diff --git a/src/StringUtils.h b/src/StringUtils.h
new file mode 100644
index 0000000..24562fb
--- /dev/null
+++ b/src/StringUtils.h
@@ -0,0 +1,74 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef STRINGUTILS_H
+#define STRINGUTILS_H
+
+#include <algorithm>
+#include <exception>
+#include <ios>
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+inline std::string MakeSamTag(const std::string& tag,
+                              const std::string& value)
+{
+    return std::string('\t' + tag + ':' + value);
+}
+
+inline std::vector<std::string> Split(const std::string& line,
+                                      const char delim = '\t')
+{
+    std::vector<std::string> tokens;
+    std::stringstream lineStream(line);
+    std::string token;
+    while (std::getline(lineStream, token, delim))
+        tokens.push_back(token);
+    return tokens;
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // STRINGUTILS_H
diff --git a/src/Tag.cpp b/src/Tag.cpp
new file mode 100644
index 0000000..7f0a10c
--- /dev/null
+++ b/src/Tag.cpp
@@ -0,0 +1,101 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/Tag.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+Tag::Tag(void)           : data_(),      modifier_(TagModifier::NONE) { }
+Tag::Tag(int8_t value)   : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(uint8_t value)  : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(int16_t value)  : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(uint16_t value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(int32_t value)  : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(uint32_t value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(float value)    : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const std::string& value)      : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<int8_t>& value)   : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<uint8_t>& value)  : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<int16_t>& value)  : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<uint16_t>& value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<int32_t>& value)  : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<uint32_t>& value) : data_(value), modifier_(TagModifier::NONE) { }
+Tag::Tag(const vector<float>& value)    : data_(value), modifier_(TagModifier::NONE) { }
+
+Tag::Tag(const Tag& other)
+    : data_(other.data_)
+    , modifier_(other.modifier_)
+{ }
+
+Tag::Tag(Tag&& other)
+    : data_(std::move(other.data_))
+    , modifier_(std::move(other.modifier_))
+{ }
+
+Tag::~Tag(void) { }
+
+Tag& Tag::operator=(boost::blank value) { data_ = value; return *this; }
+Tag& Tag::operator=(int8_t value)   { data_ = value; return *this; }
+Tag& Tag::operator=(uint8_t value)  { data_ = value; return *this; }
+Tag& Tag::operator=(int16_t value)  { data_ = value; return *this; }
+Tag& Tag::operator=(uint16_t value) { data_ = value; return *this; }
+Tag& Tag::operator=(int32_t value)  { data_ = value; return *this; }
+Tag& Tag::operator=(uint32_t value) { data_ = value; return *this; }
+Tag& Tag::operator=(float value)    { data_ = value; return *this; }
+Tag& Tag::operator=(const std::string& value)      { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<int8_t>& value)   { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<uint8_t>& value)  { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<int16_t>& value)  { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<uint16_t>& value) { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<int32_t>& value)  { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<uint32_t>& value) { data_ = value; return *this; }
+Tag& Tag::operator=(const vector<float>& value)    { data_ = value; return *this; }
+
+Tag& Tag::operator=(const Tag& other)
+{
+    data_ = other.data_;
+    modifier_ = other.modifier_;
+    return *this;
+}
+
+Tag& Tag::operator=(Tag&& other)
+{
+    data_ = std::move(other.data_);
+    modifier_ = std::move(other.modifier_);
+    return *this;
+}
diff --git a/src/TagCollection.cpp b/src/TagCollection.cpp
new file mode 100644
index 0000000..7f50126
--- /dev/null
+++ b/src/TagCollection.cpp
@@ -0,0 +1,46 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/TagCollection.h"
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+bool TagCollection::Contains(const string& name) const
+{
+    return count(name) != 0;
+}
diff --git a/src/TimeUtils.h b/src/TimeUtils.h
new file mode 100644
index 0000000..615295d
--- /dev/null
+++ b/src/TimeUtils.h
@@ -0,0 +1,81 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef TIMEUTILS_H
+#define TIMEUTILS_H
+
+#include <chrono>
+#include <stdexcept>
+#include <string>
+#include <cassert>
+#include <ctime>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+inline
+std::string ToIso8601(const std::chrono::system_clock::time_point& tp)
+{
+    // get time info
+    const time_t ttime_t = std::chrono::system_clock::to_time_t(tp);
+    const std::chrono::system_clock::time_point tp_sec = std::chrono::system_clock::from_time_t(ttime_t);
+    const std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(tp - tp_sec);
+    const std::tm* ttm = gmtime(&ttime_t);  // static obj, no free needed (may not be thread-safe though)
+
+    // format output
+    char date_time_format[] = "%FT%T";
+    char date_time_str[50];
+    strftime(date_time_str, sizeof(date_time_str), date_time_format, ttm);
+    std::string result(date_time_str);
+    if (ms.count() > 0) {
+        result.append(".");
+        result.append(std::to_string(ms.count()));
+    }
+    result.append("Z");
+    return result;
+}
+
+inline
+std::chrono::system_clock::time_point CurrentTime(void)
+{ return std::chrono::system_clock::now(); }
+
+} // namespace PacBio
+} // namespace BAM
+} // namespace internal
+
+#endif // TIMEUTILS_H
diff --git a/src/UnmappedReadsQuery.cpp b/src/UnmappedReadsQuery.cpp
new file mode 100644
index 0000000..9b60657
--- /dev/null
+++ b/src/UnmappedReadsQuery.cpp
@@ -0,0 +1,133 @@
+// Copyright (c) 2014, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+//#include "pbbam/UnmappedReadsQuery.h"
+//#include "pbbam/BamFile.h"
+//#include "MemoryUtils.h"
+
+//#include <iostream>
+
+//using namespace PacBio;
+//using namespace PacBio::BAM;
+//using namespace std;
+
+//UnmappedReadsQuery::UnmappedReadsQuery(const BamFile& file)
+//    : QueryBase()
+//{
+//    // open file
+//    file_.reset(sam_open(file.Filename().c_str(), "rb"), internal::HtslibFileDeleter());
+//    if (!file_) {
+//        error_ = UnmappedReadsQuery::FileOpenError;
+//        return;
+//    }
+
+//    // open index
+//    index_.reset(bam_index_load(file.Filename().c_str()), internal::HtslibIndexDeleter());
+//    if (!index_) {
+//        error_ = UnmappedReadsQuery::IndexFileOpenError;
+//        return;
+//    }
+
+//    // initialize query
+//    iterator_.reset(bam_itr_queryi(index_.get(), HTS_IDX_NOCOOR, 0, 0), internal::HtslibIteratorDeleter());
+//    if (iterator_) {
+
+//        cerr << endl
+//             << "UnmappedQueryReads::iterator" << endl
+//             << "read_rest: " << iterator_->read_rest << endl
+//             << "finished: " << iterator_->finished << endl
+//             << "dummy: " << iterator_->dummy << endl
+//             << "tid: " << iterator_->tid << endl
+//             << "beg: " << iterator_->beg << endl
+//             << "end: " << iterator_->end << endl
+//             << "n_off: " << iterator_->n_off << endl
+//             << "i: " << iterator_->i << endl
+//             << "curr_off: " << iterator_->curr_off << endl
+//             << endl;
+
+
+////        uint32_t read_rest:1, finished:1, dummy:29;
+////        int tid, beg, end, n_off, i;
+////        uint64_t curr_off;
+////        hts_pair64_t *off;
+////        hts_readrec_func *readrec;
+////        struct {
+////            int n, m;
+////            int *a;
+////        } bins;
+
+//    }
+//}
+
+//bool UnmappedReadsQuery::GetNext(BamRecord& record)
+//{
+//    if (error_ == UnmappedReadsQuery::NoError && iterator_) {
+//        const int result = bam_itr_next(file_.get(), iterator_.get(), record.RawData().get());
+//        if ( result > 0 )
+//            return true;
+//        else {
+//            cerr << "ERROR - result: " << result << endl;
+//            if ( result == -4 ) {
+
+//                bam1_t* b = record.RawData().get();
+//                bam1_core_t* c = &b->core;
+//                bool nonBgzfErrorFound = false;
+
+//                if (b->l_data < 0) {
+//                    cerr << "ERROR: bam1_t::l_data < 0" << endl;
+//                    nonBgzfErrorFound = true;
+//                }
+//                if (c->l_qseq < 0) {
+//                    cerr << "ERROR: bam1_t::core::l_qseq < 0" << endl;
+//                    nonBgzfErrorFound = true;
+//                }
+//                if (!b->data) {
+//                    cerr << "ERROR: bam1_t::data is null" << endl;
+//                    nonBgzfErrorFound = true;
+//                }
+//                if  (!nonBgzfErrorFound)
+//                    cerr << "ERROR: in bam_read1(), bgzf_read(fp, b->data, b->l_data) returned unexpected value" << endl;
+//            }
+//        }
+//    }
+//    else {
+//        cerr << "UnmappedReadsQuery::HasError() - " << Error() << endl;
+//    }
+
+
+//    return false;
+//}
diff --git a/src/VirtualPolymeraseBamRecord.cpp b/src/VirtualPolymeraseBamRecord.cpp
new file mode 100644
index 0000000..7b3bf7b
--- /dev/null
+++ b/src/VirtualPolymeraseBamRecord.cpp
@@ -0,0 +1,288 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Armin Töpfer
+
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <vector>
+
+#include "pbbam/virtual/VirtualPolymeraseBamRecord.h"
+#include "pbbam/virtual/VirtualRegionType.h"
+#include "pbbam/virtual/VirtualRegionTypeMap.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+VirtualPolymeraseBamRecord::VirtualPolymeraseBamRecord(
+    std::vector<BamRecord>&& unorderedSources, const BamHeader& header)
+    : BamRecord(header)
+    , sources_(std::forward<std::vector<BamRecord>>(unorderedSources))
+{
+    // Sort sources by queryStart
+    std::sort(sources_.begin(), sources_.end(),
+              [](const BamRecord& l1, const BamRecord& l2)
+              { return l1.QueryStart() < l2.QueryStart(); });
+    StitchSources();
+}
+
+void VirtualPolymeraseBamRecord::StitchSources()
+{
+    const auto& firstRecord = sources_[0];
+    const auto& lastRecord = sources_[sources_.size() - 1];
+
+    // Temporary variables used for stitching
+    int accuracy = 0;
+    int accuracyCounter = 0;
+
+    std::string   sequence;
+    std::string   deletionTag;
+    std::string   substitutionTag;
+    std::string   alternativeLabelTag;
+    std::string   pulseCall;
+
+    QualityValues qualities;
+    QualityValues deletionQv;
+    QualityValues insertionQv;
+    QualityValues mergeQv;
+    QualityValues pulseMergeQv;
+    QualityValues substitutionQv;
+    QualityValues labelQv;
+    QualityValues alternativeLabelQv;
+
+    Frames             ipd;
+    Frames             pw;
+    Frames             pd;
+    Frames             px;
+    std::vector<float> pa;
+    std::vector<float> pm;
+
+    // Stitch using tmp vars
+    for(auto& b : sources_)
+    {
+        sequence.append(b.Sequence());
+        
+        MoveAppend(b.Qualities(), qualities);
+
+        if (b.HasReadAccuracy())
+        {
+            accuracy += b.ReadAccuracy();
+            ++accuracyCounter;
+        }
+
+        if (b.HasDeletionQV())
+            MoveAppend(std::move(b.DeletionQV()), deletionQv);
+
+        if (b.HasInsertionQV())
+            MoveAppend(std::move(b.InsertionQV()), insertionQv);
+
+        if (b.HasMergeQV())
+            MoveAppend(std::move(b.MergeQV()), mergeQv);
+
+        if (b.HasPulseMergeQV())
+            MoveAppend(std::move(b.PulseMergeQV()), pulseMergeQv);
+
+        if (b.HasSubstitutionQV())
+            MoveAppend(std::move(b.SubstitutionQV()), substitutionQv);
+
+        if (b.HasLabelQV())
+            MoveAppend(std::move(b.LabelQV()), labelQv);
+
+        if (b.HasAltLabelQV())
+            MoveAppend(std::move(b.AltLabelQV()), alternativeLabelQv);
+
+        if (b.HasDeletionTag())
+            deletionTag.append(std::move(b.DeletionTag()));
+
+        if (b.HasSubstitutionTag())
+            substitutionTag.append(std::move(b.SubstitutionTag()));
+
+        if (b.HasAltLabelTag())
+            alternativeLabelTag.append(std::move(b.AltLabelTag()));
+
+        if (b.HasPulseCall())
+            pulseCall.append(std::move(b.PulseCall()));
+
+        if (b.HasIPD())
+            MoveAppend(b.IPDRaw().DataRaw(), ipd.DataRaw());
+
+        if (b.HasPulseWidth())
+            MoveAppend(b.PulseWidthRaw().DataRaw(), pw.DataRaw());
+
+        if (b.HasPulseCallWidth())
+            MoveAppend(b.PulseCallWidth().DataRaw(), px.DataRaw());
+
+        if (b.HasPrePulseFrames())
+            MoveAppend(b.PrePulseFrames().DataRaw(), pd.DataRaw());
+
+        if (b.HasPkmid())
+            MoveAppend(b.Pkmid(), pm);
+
+        if (b.HasPkmean())
+            MoveAppend(b.Pkmean(), pa);
+
+        if (b.HasScrapType())
+        {
+            const auto regionType = b.ScrapType();
+
+            if (!HasVirtualRegionType(regionType))
+                virtualRegionsMap_[regionType] = std::vector<VirtualRegion>();
+
+            virtualRegionsMap_[regionType].emplace_back(
+                regionType, b.QueryStart(), b.QueryEnd());   
+        }
+
+        if (b.HasLocalContextFlags())
+        {
+            std::pair<int, int> barcodes{-1, -1};
+            if (b.HasBarcodes())
+                barcodes = b.Barcodes();
+
+            constexpr auto regionType = VirtualRegionType::SUBREAD;
+            if (!HasVirtualRegionType(regionType))
+                virtualRegionsMap_[regionType] = std::vector<VirtualRegion>();
+
+            virtualRegionsMap_[regionType].emplace_back(
+                regionType, b.QueryStart(), b.QueryEnd(), b.LocalContextFlags(),
+                barcodes.first, barcodes.second);
+        }
+    }
+
+    // ReadGroup
+    this->ReadGroup(this->header_.ReadGroups()[0]);
+
+    // Avoid division by 0
+    if (accuracyCounter > 0)
+        this->ReadAccuracy(accuracy / accuracyCounter);
+
+    this->NumPasses(1);
+
+    // All records should contain the same SNR and hole number
+    if (firstRecord.HasSignalToNoise())
+        this->SignalToNoise(firstRecord.SignalToNoise());
+    this->HoleNumber(firstRecord.HoleNumber());
+
+    // QueryStart
+    this->QueryStart(firstRecord.QueryStart());
+    this->QueryEnd(lastRecord.QueryEnd());
+    this->UpdateName();
+
+    std::string qualitiesStr = qualities.Fastq();
+    if (sequence.size() == qualitiesStr.size())
+        this->Impl().SetSequenceAndQualities(sequence, qualitiesStr);
+    else
+        this->Impl().SetSequenceAndQualities(sequence);
+
+    // Tags as strings
+    if (!deletionTag.empty())
+        this->DeletionTag(deletionTag);
+    if (!substitutionTag.empty())
+        this->SubstitutionTag(substitutionTag);
+    if (!alternativeLabelTag.empty())
+        this->AltLabelTag(alternativeLabelTag);
+    if (!pulseCall.empty())
+        this->PulseCall(pulseCall);
+
+    // QVs
+    if (!deletionQv.empty())
+        this->DeletionQV(deletionQv);
+    if (!insertionQv.empty())
+        this->InsertionQV(insertionQv);
+    if (!mergeQv.empty())
+        this->MergeQV(mergeQv);
+    if (!pulseMergeQv.empty())
+        this->PulseMergeQV(pulseMergeQv);
+    if (!substitutionQv.empty())
+        this->SubstitutionQV(substitutionQv);
+    if (!labelQv.empty())
+        this->LabelQV(labelQv);
+    if (!alternativeLabelQv.empty())
+        this->AltLabelQV(alternativeLabelQv);
+
+    // 16 bit arrays
+    if (!ipd.Data().empty())
+        this->IPD(ipd, FrameEncodingType::LOSSLESS);
+    if (!pw.Data().empty())
+        this->PulseWidth(pw, FrameEncodingType::LOSSLESS);
+    if (!pa.empty())
+        this->Pkmean(pa);
+    if (!pm.empty())
+        this->Pkmid(pm);
+    if (!pd.Data().empty())
+        this->PrePulseFrames(pd, FrameEncodingType::LOSSLESS);
+    if (!px.Data().empty())
+        this->PulseCallWidth(px, FrameEncodingType::LOSSLESS);
+
+    // Determine HQREGION bases on LQREGIONS
+    if (HasVirtualRegionType(VirtualRegionType::LQREGION))
+    {
+        if (virtualRegionsMap_[VirtualRegionType::LQREGION].size() == 1)
+        {
+            const auto lq = virtualRegionsMap_[VirtualRegionType::LQREGION][0];
+            if (lq.beginPos == 0)
+                virtualRegionsMap_[VirtualRegionType::HQREGION].emplace_back(
+                    VirtualRegionType::HQREGION, lq.endPos, sequence.size());
+            else if (lq.endPos == static_cast<int>(sequence.size()))
+                virtualRegionsMap_[VirtualRegionType::HQREGION].emplace_back(
+                    VirtualRegionType::HQREGION, 0, lq.beginPos);
+            else
+                throw std::runtime_error("Unknown HQREGION");
+        }
+        else
+        {
+            int beginPos = 0;
+            for (const auto& lqregion : virtualRegionsMap_[VirtualRegionType::LQREGION])
+            {
+                if (lqregion.beginPos - beginPos > 0)
+                    virtualRegionsMap_[VirtualRegionType::HQREGION].emplace_back(
+                        VirtualRegionType::HQREGION, beginPos, lqregion.beginPos);
+                beginPos = lqregion.endPos;
+            }
+        }
+    }
+    else
+    {
+        virtualRegionsMap_[VirtualRegionType::HQREGION].emplace_back(
+            VirtualRegionType::HQREGION, 0, sequence.size());
+    }
+}
+
+Frames VirtualPolymeraseBamRecord::IPDV1Frames(Orientation orientation) const
+{
+    const auto rawFrames = this->IPDRaw(orientation);
+    const std::vector<uint8_t> rawData(rawFrames.Data().begin(), rawFrames.Data().end());
+    return Frames::Decode(rawData);
+}
\ No newline at end of file
diff --git a/src/VirtualPolymeraseReader.cpp b/src/VirtualPolymeraseReader.cpp
new file mode 100644
index 0000000..271a96e
--- /dev/null
+++ b/src/VirtualPolymeraseReader.cpp
@@ -0,0 +1,113 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Armin Töpfer
+
+#include <stdexcept>
+
+#include "pbbam/virtual/VirtualPolymeraseReader.h"
+#include "pbbam/ReadGroupInfo.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+VirtualPolymeraseReader::VirtualPolymeraseReader(
+    const std::string& primaryBamFilePath, const std::string& scrapsBamFilePath)
+    : primaryBamFilePath_(primaryBamFilePath)
+    , scrapsBamFilePath_(scrapsBamFilePath)
+{
+    primaryBamFile_ = std::unique_ptr<BamFile>(new BamFile(primaryBamFilePath_));
+    primaryQuery_   = std::unique_ptr<EntireFileQuery>(new EntireFileQuery(*primaryBamFile_));
+    primaryIt_      = primaryQuery_->begin();
+
+    scrapsBamFile_  = std::unique_ptr<BamFile>(new BamFile(scrapsBamFilePath_));
+    scrapsQuery_    = std::unique_ptr<EntireFileQuery>(new EntireFileQuery(*scrapsBamFile_));
+    scrapsIt_       = scrapsQuery_->begin();
+
+    polyHeader_     = std::unique_ptr<BamHeader>(
+                        new BamHeader(primaryBamFile_->Header().ToSam()));
+
+    auto readGroups = polyHeader_->ReadGroups();
+    if (readGroups.empty())
+        throw std::runtime_error("Bam header of the primary bam has no read groups.");
+    readGroups[0].ReadType("POLYMERASE");
+    readGroups[0].Id(readGroups[0].MovieName(), "POLYMERASE");
+    if (readGroups.size() > 1)
+    {
+        std::vector<ReadGroupInfo> singleGroup;
+        singleGroup.emplace_back(std::move(readGroups[0]));
+        readGroups = std::move(singleGroup);
+        polyHeader_->ClearReadGroups();
+    }
+    polyHeader_->ReadGroups(readGroups);
+}
+
+// This method is not thread safe
+VirtualPolymeraseBamRecord VirtualPolymeraseReader::Next()
+{
+    auto bamRecordVec = NextRaw();
+    VirtualPolymeraseBamRecord stitched(std::move(bamRecordVec), *polyHeader_);
+    return std::move(stitched);
+}
+
+std::vector<BamRecord> VirtualPolymeraseReader::NextRaw()
+{
+    std::vector<BamRecord> bamRecordVec;
+
+    // Current hole number, the smallest of scraps and primary.
+    // It can be that the next ZMW is scrap only.
+    int currentHoleNumber = std::min((*primaryIt_).HoleNumber(), (*scrapsIt_).HoleNumber());
+    // collect subreads or hqregions
+    while (primaryIt_ != primaryQuery_->end() && currentHoleNumber == (*primaryIt_).HoleNumber())
+        bamRecordVec.push_back(*primaryIt_++);
+    
+    // collect scraps
+    while (scrapsIt_ != scrapsQuery_->end() && currentHoleNumber == (*scrapsIt_).HoleNumber())
+        bamRecordVec.push_back(*scrapsIt_++);
+
+    return bamRecordVec;
+}
+
+bool VirtualPolymeraseReader::HasNext()
+{
+	// Return true until both iterators are at the end of the query
+	return primaryIt_ != primaryQuery_->end() || scrapsIt_ != scrapsQuery_->end();
+}
+
+BamHeader VirtualPolymeraseReader::PrimaryHeader()
+{ return primaryBamFile_->Header(); }
+
+BamHeader VirtualPolymeraseReader::ScrapsHeader()
+{ return scrapsBamFile_->Header(); }
diff --git a/src/VirtualRegionTypeMap.cpp b/src/VirtualRegionTypeMap.cpp
new file mode 100644
index 0000000..4839b35
--- /dev/null
+++ b/src/VirtualRegionTypeMap.cpp
@@ -0,0 +1,49 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Armin Töpfer
+
+#include "pbbam/virtual/VirtualRegionTypeMap.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+std::map<char, VirtualRegionType> VirtualRegionTypeMap::ParseChar
+{
+	{ 'A' , VirtualRegionType::ADAPTER },
+	{ 'B' , VirtualRegionType::BARCODE },
+	{ 'H' , VirtualRegionType::HQREGION },
+	{ 'L' , VirtualRegionType::LQREGION }
+};
\ No newline at end of file
diff --git a/src/XmlReader.cpp b/src/XmlReader.cpp
new file mode 100644
index 0000000..5e88e47
--- /dev/null
+++ b/src/XmlReader.cpp
@@ -0,0 +1,154 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "XmlReader.h"
+#include "StringUtils.h"
+#include "pugixml/pugixml.hpp"
+#include <iostream>
+#include <fstream>
+#include <memory>
+#include <vector>
+#include <cassert>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static
+void UpdateRegistry(const string& attributeName,
+                    const string& attributeValue,
+                    NamespaceRegistry& registry)
+{
+    vector<string> nameParts = Split(attributeName, ':');
+    assert(!nameParts.empty());
+    if (nameParts.size() > 2)
+        throw std::runtime_error("malformed xmlns attribute: " + attributeName);
+
+    const bool isDefault = (nameParts.size() == 1);
+    const XsdType& xsd = registry.XsdForUri(attributeValue);
+
+    if (isDefault)
+        registry.SetDefaultXsd(xsd);
+    else {
+        assert(nameParts.size() == 2);
+        const string& name = nameParts.at(1);
+        const string& uri  = attributeValue;
+        NamespaceInfo namespaceInfo(name, uri);
+        registry.Register(xsd, namespaceInfo);
+    }
+}
+
+static
+void FromXml(const pugi::xml_node& xmlNode, DataSetElement& parent)
+{
+    // ignore non-named XML nodes
+    //
+    // pugi::xml separates XML parts into more node types than we use
+    //
+    const string& label = xmlNode.name();
+    if (label.empty())
+        return;
+
+    // label & text
+    DataSetElement e(xmlNode.name());
+    e.Text(xmlNode.text().get());
+
+    // iterate attributes
+    auto attrIter = xmlNode.attributes_begin();
+    auto attrEnd  = xmlNode.attributes_end();
+    for ( ; attrIter != attrEnd; ++attrIter )
+        e.Attribute(attrIter->name(), attrIter->value());
+
+    // iterate children, recursively building up subtree
+    auto childIter = xmlNode.begin();
+    auto childEnd = xmlNode.end();
+    for ( ; childIter != childEnd; ++childIter ) {
+        pugi::xml_node childNode = *childIter;
+        FromXml(childNode, e);
+    }
+
+    // add our element to its parent
+    parent.AddChild(e);
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+std::unique_ptr<DataSetBase> XmlReader::FromStream(istream& in)
+{
+    pugi::xml_document doc;
+    const pugi::xml_parse_result& loadResult = doc.load(in);
+    if (loadResult.status != pugi::status_ok)
+        throw std::runtime_error(string("could not read XML file, error code:") + to_string(loadResult.status) );
+
+    // parse top-level attributes
+    pugi::xml_node rootNode = doc.document_element();
+    if (rootNode == pugi::xml_node())
+        throw std::runtime_error("could not fetch XML root node");
+
+    // create dataset matching type strings
+    std::unique_ptr<DataSetBase> dataset(new DataSetBase);
+    dataset->Label(rootNode.name());
+
+    // iterate attributes, capture namespace info
+    const string xmlnsPrefix("xmlns");
+    auto attrIter = rootNode.attributes_begin();
+    auto attrEnd  = rootNode.attributes_end();
+    for ( ; attrIter != attrEnd; ++attrIter ) {
+        const string& name = attrIter->name();
+        const string& value = attrIter->value();
+        dataset->Attribute(name, value);
+
+        if (name.find(xmlnsPrefix) == 0)
+            UpdateRegistry(name, value, dataset->Namespaces());
+    }
+
+    // iterate children, recursively building up subtree
+    auto childIter = rootNode.begin();
+    auto childEnd = rootNode.end();
+    for ( ; childIter != childEnd; ++childIter ) {
+        pugi::xml_node childNode = *childIter;
+        internal::FromXml(childNode, *dataset.get());
+    }
+
+    return dataset;
+}
diff --git a/src/XmlReader.h b/src/XmlReader.h
new file mode 100644
index 0000000..f5830a3
--- /dev/null
+++ b/src/XmlReader.h
@@ -0,0 +1,59 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef XMLREADER_H
+#define XMLREADER_H
+
+#include "pbbam/DataSet.h"
+#include <iosfwd>
+#include <memory>
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class XmlReader
+{
+public:
+    static std::unique_ptr<DataSetBase> FromStream(std::istream& in);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // XMLREADER_H
diff --git a/src/XmlWriter.cpp b/src/XmlWriter.cpp
new file mode 100644
index 0000000..bf42e36
--- /dev/null
+++ b/src/XmlWriter.cpp
@@ -0,0 +1,152 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "XmlWriter.h"
+#include "pbbam/DataSet.h"
+#include "pugixml/pugixml.hpp"
+#include <fstream>
+#include <iostream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+static
+string OutputName(const DataSetElement& node,
+                  const NamespaceRegistry& registry)
+{
+    if (node.PrefixLabel().empty())
+        return registry.Namespace(node.Xsd()).Name() + ":" + node.LocalNameLabel().to_string();
+    else
+        return node.QualifiedNameLabel(); // is this correct? what if node's contents don't match registry
+                                          // who gets priority?
+}
+
+static
+void ToXml(const DataSetElement& node,
+           const NamespaceRegistry& registry,
+           pugi::xml_node& parentXml)
+{
+    // create child of parent, w/ label & text
+    const string& label = OutputName(node, registry);
+    if (label.empty())
+        return; // error?
+    pugi::xml_node xmlNode = parentXml.append_child(label.c_str());
+
+    if (!node.Text().empty())
+        xmlNode.text().set(node.Text().c_str());
+
+    // add attributes
+    auto attrIter = node.Attributes().cbegin();
+    auto attrEnd  = node.Attributes().cend();
+    for ( ; attrIter != attrEnd; ++attrIter) {
+        const string& name = attrIter->first;
+        if (name.empty())
+            continue;
+        pugi::xml_attribute attr = xmlNode.append_attribute(name.c_str());
+        attr.set_value(attrIter->second.c_str());
+    }
+
+    // additional stuff later? (e.g. comments)
+
+    // iterate children, recursively building up subtree
+    auto childIter = node.Children().cbegin();
+    auto childEnd  = node.Children().cend();
+    for ( ; childIter != childEnd; ++childIter) {
+        const DataSetElement& child = (*childIter);
+        ToXml(child, registry, xmlNode);
+    }
+}
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+void XmlWriter::ToStream(const DataSetBase& dataset,
+                         ostream& out)
+{
+    pugi::xml_document doc;
+
+    const NamespaceRegistry& registry = dataset.Namespaces();
+
+    // create top-level dataset XML node
+    const string& label = OutputName(dataset, registry);
+    if (label.empty())
+        throw std::runtime_error("could not convert dataset node to XML");
+    pugi::xml_node root = doc.append_child(label.c_str());
+
+    const string& text = dataset.Text();
+    if (!text.empty())
+        root.text().set(text.c_str());
+
+    // add top-level attributes
+    auto attrIter = dataset.Attributes().cbegin();
+    auto attrEnd  = dataset.Attributes().cend();
+    for ( ; attrIter != attrEnd; ++attrIter) {
+        const string name = attrIter->first;
+        const string value = attrIter->second;
+        if (name.empty())
+            continue;
+        pugi::xml_attribute attr = root.append_attribute(name.c_str());
+        attr.set_value(value.c_str());
+    }
+
+    // iterate children, recursively building up subtree
+    auto childIter = dataset.Children().cbegin();
+    auto childEnd  = dataset.Children().cend();
+    for ( ; childIter != childEnd; ++childIter) {
+        const DataSetElement& child = (*childIter);
+        ToXml(child, registry, root);
+    }
+
+    // write XML to stream
+    pugi::xml_node decl = doc.prepend_child(pugi::node_declaration);
+    decl.append_attribute("version")  = "1.0";
+    decl.append_attribute("encoding") = "utf-8";
+
+    // "no escapes" to allow explicit ">" "<" comparison operators in filter parameters
+    // we may remove this if/when comparison is separated from the value
+    doc.save(out, "\t", pugi::format_default | pugi::format_no_escapes, pugi::encoding_utf8);
+}
+
+void XmlWriter::ToStream(const unique_ptr<DataSetBase>& dataset,
+                         ostream& out)
+{ ToStream(*dataset.get(), out); }
diff --git a/src/XmlWriter.h b/src/XmlWriter.h
new file mode 100644
index 0000000..7fc457d
--- /dev/null
+++ b/src/XmlWriter.h
@@ -0,0 +1,62 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef XMLWRITER_H
+#define XMLWRITER_H
+
+#include <iosfwd>
+#include <memory>
+
+namespace PacBio {
+namespace BAM {
+
+class DataSetBase;
+
+namespace internal {
+
+class XmlWriter
+{
+public:
+    static void ToStream(const DataSetBase& dataset, std::ostream& out);
+    static void ToStream(const std::unique_ptr<DataSetBase>& dataset, std::ostream& out);
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+#endif // XMLWRITER_H
diff --git a/src/ZmwGroupQuery.cpp b/src/ZmwGroupQuery.cpp
new file mode 100644
index 0000000..bf76ce3
--- /dev/null
+++ b/src/ZmwGroupQuery.cpp
@@ -0,0 +1,143 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/ZmwGroupQuery.h"
+#include "pbbam/PbiIndex.h"
+#include "pbbam/internal/BamRecordSort.h"
+#include "pbbam/internal/MergeStrategy.h"
+#include "MemoryUtils.h"
+#include <algorithm>
+#include <map>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+//using namespace PacBio::BAM::staging;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class ZmwQueryGroupIterator : public IBamFileGroupIterator
+{
+public:
+    ZmwQueryGroupIterator(const std::vector<int32_t>& zmwWhitelist,
+                          const BamFile& file)
+        : IBamFileGroupIterator(file)
+    {
+        // init BAM file for reading
+        htsFile_.reset(sam_open(file.Filename().c_str(), "rb"));
+        if (!htsFile_)
+            throw std::runtime_error("could not open BAM file for reading");
+
+        htsHeader_.reset(sam_hdr_read(htsFile_.get()));
+        if (!htsHeader_)
+            throw std::runtime_error("could not read BAM header data");
+
+        // open index & query for ZMWs
+        PbiIndex index(file.PacBioIndexFilename());
+        for (int32_t zmw : zmwWhitelist)
+            zmwGroups_[zmw] = index.Lookup(ZmwIndexRequest(zmw));
+    }
+
+public:
+    bool GetNext(std::vector<BamRecord>& r)
+    {
+        r.clear();
+        if (zmwGroups_.empty())
+            return false;
+
+        BamRecord record(header_);
+        const IndexResultBlocks& blocks = zmwGroups_.cbegin()->second;
+        for (const IndexResultBlock& block : blocks) {
+
+            // seek to first record in block
+            const int seekResult = bgzf_seek(htsFile_.get()->fp.bgzf, block.virtualOffset_, SEEK_SET);
+            if (seekResult == -1)
+                throw std::runtime_error("could not seek in BAM file");
+
+            // read block records
+            for (size_t i = 0; i < block.numReads_; ++i) {
+                const int readResult = sam_read1(htsFile_.get(),
+                                                 htsHeader_.get(),
+                                                 internal::BamRecordMemory::GetRawData(record).get());
+//                record.header_ = fileData_.Header();
+
+                if (readResult >= 0)           // success
+                    r.push_back(record);
+                else if (readResult == -1)     // normal EOF
+                    break;
+                else                           // error (truncated file, etc)
+                    throw std::runtime_error("corrupted file, may be truncated");
+            }
+        }
+
+        // pop zmw info & return success
+        zmwGroups_.erase(zmwGroups_.begin());
+        return !r.empty();
+    }
+
+    bool InSameGroup(const BamRecord& lhs, const BamRecord& rhs) const
+    { return lhs.HoleNumber() == rhs.HoleNumber(); }
+
+private:
+    unique_ptr<samFile,   internal::HtslibFileDeleter>   htsFile_;
+    unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> htsHeader_;
+    map<int32_t, IndexResultBlocks> zmwGroups_;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+ZmwGroupQuery::ZmwGroupQuery(const DataSet& dataset)
+    : IGroupQuery(dataset)
+    , whitelist_(/* all dataset ZMWs */)
+{
+    mergeStrategy_.reset(new GroupMergeStrategy<ByZmw>(CreateIterators()));
+}
+
+ZmwGroupQuery::ZmwGroupQuery(const std::vector<int32_t>& zmwWhitelist,
+                             const DataSet& dataset)
+    : IGroupQuery(dataset)
+    , whitelist_(zmwWhitelist)
+{
+    mergeStrategy_.reset(new GroupMergeStrategy<ByZmw>(CreateIterators()));
+}
+
+ZmwGroupQuery::FileIterPtr ZmwGroupQuery::CreateIterator(const BamFile& file)
+{ return FileIterPtr(new ZmwQueryGroupIterator(whitelist_, file)); }
diff --git a/src/ZmwQuery.cpp b/src/ZmwQuery.cpp
new file mode 100644
index 0000000..2b25723
--- /dev/null
+++ b/src/ZmwQuery.cpp
@@ -0,0 +1,138 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "pbbam/ZmwQuery.h"
+#include "pbbam/PbiIndex.h"
+#include "pbbam/internal/BamRecordSort.h"
+#include "pbbam/internal/MergeStrategy.h"
+#include "MemoryUtils.h"
+#include <htslib/bgzf.h>
+#include <htslib/sam.h>
+#include <algorithm>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+//using namespace PacBio::BAM::staging;
+using namespace std;
+
+namespace PacBio {
+namespace BAM {
+namespace internal {
+
+class ZmwQueryIterator : public IBamFileIterator
+{
+public:
+    ZmwQueryIterator(const std::vector<int32_t>& zmwWhitelist,
+                     const BamFile& bamFile)
+        : internal::IBamFileIterator(bamFile)
+        , currentBlockReadCount_(0)
+        , htsFile_(nullptr)
+        , htsHeader_(nullptr)
+    {
+        // init BAM file for reading
+        htsFile_.reset(sam_open(bamFile.Filename().c_str(), "rb"));
+        if (!htsFile_)
+            throw std::runtime_error("could not open BAM file for reading");
+
+        htsHeader_.reset(sam_hdr_read(htsFile_.get()));
+        if (!htsHeader_)
+            throw std::runtime_error("could not read BAM header data");
+
+        // open index & query for ZMWs
+        PbiIndex index(bamFile.PacBioIndexFilename());
+        blocks_ = index.Lookup(ZmwIndexMultiRequest(zmwWhitelist));
+    }
+
+public:
+    bool GetNext(BamRecord& r){
+
+        // no data to fetch, return false
+        if (blocks_.empty())
+            return false;
+
+        // maybe seek to block
+        if (currentBlockReadCount_ == 0) {
+            const int seekResult = bgzf_seek(htsFile_.get()->fp.bgzf, blocks_.at(0).virtualOffset_, SEEK_SET);
+            if (seekResult == -1)
+                throw std::runtime_error("could not seek in BAM file");
+        }
+
+        // read next record
+//        r = BamRecord(fileData_.Header());
+        const int readResult = sam_read1(htsFile_.get(),
+                                         htsHeader_.get(),
+                                         internal::BamRecordMemory::GetRawData(r).get());
+//        r.header_ = fileData_.Header();
+        r.header_ = header_;
+
+        // update counters
+        ++currentBlockReadCount_;
+        if (currentBlockReadCount_ == blocks_.at(0).numReads_) {
+            blocks_.pop_front();
+            currentBlockReadCount_ = 0;
+        }
+
+        // return result of reading
+        if (readResult >= 0)           // success
+            return true;
+        else if (readResult == -1)     // normal EOF
+            return false;
+        else                           // error (truncated file, etc)
+            throw std::runtime_error("corrupted file, may be truncated");
+    }
+
+private:
+    IndexResultBlocks blocks_;
+    size_t currentBlockReadCount_;
+    unique_ptr<samFile,   internal::HtslibFileDeleter>   htsFile_;
+    unique_ptr<bam_hdr_t, internal::HtslibHeaderDeleter> htsHeader_;
+};
+
+} // namespace internal
+} // namespace BAM
+} // namespace PacBio
+
+ZmwQuery::ZmwQuery(const std::vector<int32_t> &zmwWhitelist,
+                   const DataSet& dataset)
+    : internal::IQuery(dataset)
+    , whitelist_(zmwWhitelist)
+{
+    mergeStrategy_.reset(new MergeStrategy<ByZmw>(CreateIterators()));
+}
+
+ZmwQuery::FileIterPtr ZmwQuery::CreateIterator(const BamFile& bamFile)
+{ return FileIterPtr(new ZmwQueryIterator(whitelist_, bamFile)); }
diff --git a/src/files.cmake b/src/files.cmake
new file mode 100644
index 0000000..3a399d0
--- /dev/null
+++ b/src/files.cmake
@@ -0,0 +1,152 @@
+
+# headers
+set( PacBioBAM_H
+
+    # API headers
+    ${PacBioBAM_IncludeDir}/pbbam/Accuracy.h
+    ${PacBioBAM_IncludeDir}/pbbam/AlignmentPrinter.h
+    ${PacBioBAM_IncludeDir}/pbbam/BamFile.h
+    ${PacBioBAM_IncludeDir}/pbbam/BamHeader.h
+    ${PacBioBAM_IncludeDir}/pbbam/BamRecord.h
+    ${PacBioBAM_IncludeDir}/pbbam/BamRecordBuilder.h
+    ${PacBioBAM_IncludeDir}/pbbam/BamRecordImpl.h
+    ${PacBioBAM_IncludeDir}/pbbam/BamTagCodec.h
+    ${PacBioBAM_IncludeDir}/pbbam/BamWriter.h
+    ${PacBioBAM_IncludeDir}/pbbam/Cigar.h
+    ${PacBioBAM_IncludeDir}/pbbam/CigarOperation.h
+    ${PacBioBAM_IncludeDir}/pbbam/Config.h
+    ${PacBioBAM_IncludeDir}/pbbam/DataSet.h
+    ${PacBioBAM_IncludeDir}/pbbam/DataSetTypes.h
+    ${PacBioBAM_IncludeDir}/pbbam/DataSetXsd.h
+    ${PacBioBAM_IncludeDir}/pbbam/EntireFileQuery.h
+    ${PacBioBAM_IncludeDir}/pbbam/Frames.h
+    ${PacBioBAM_IncludeDir}/pbbam/GenomicInterval.h
+    ${PacBioBAM_IncludeDir}/pbbam/GenomicIntervalQuery.h
+    ${PacBioBAM_IncludeDir}/pbbam/GroupQuery.h
+    ${PacBioBAM_IncludeDir}/pbbam/GroupQueryBase.h
+    ${PacBioBAM_IncludeDir}/pbbam/IndexedFastaReader.h
+    ${PacBioBAM_IncludeDir}/pbbam/Interval.h
+    ${PacBioBAM_IncludeDir}/pbbam/LocalContextFlags.h
+    ${PacBioBAM_IncludeDir}/pbbam/Orientation.h
+    ${PacBioBAM_IncludeDir}/pbbam/PbiBuilder.h
+    ${PacBioBAM_IncludeDir}/pbbam/PbiFile.h
+    ${PacBioBAM_IncludeDir}/pbbam/PbiIndex.h
+    ${PacBioBAM_IncludeDir}/pbbam/PbiRawData.h
+    ${PacBioBAM_IncludeDir}/pbbam/Position.h
+    ${PacBioBAM_IncludeDir}/pbbam/ProgramInfo.h
+    ${PacBioBAM_IncludeDir}/pbbam/QualityValue.h
+    ${PacBioBAM_IncludeDir}/pbbam/QualityValues.h
+    ${PacBioBAM_IncludeDir}/pbbam/QueryBase.h
+    ${PacBioBAM_IncludeDir}/pbbam/ReadGroupInfo.h
+    ${PacBioBAM_IncludeDir}/pbbam/SamTagCodec.h
+    ${PacBioBAM_IncludeDir}/pbbam/SequenceInfo.h
+    ${PacBioBAM_IncludeDir}/pbbam/Strand.h  
+    ${PacBioBAM_IncludeDir}/pbbam/Tag.h
+    ${PacBioBAM_IncludeDir}/pbbam/TagCollection.h
+#    ${PacBioBAM_IncludeDir}/pbbam/UnmappedReadsQuery.h
+    ${PacBioBAM_IncludeDir}/pbbam/ZmwGroupQuery.h
+    ${PacBioBAM_IncludeDir}/pbbam/ZmwQuery.h
+
+    # internal headers
+    ${PacBioBAM_IncludeDir}/pbbam/internal/BamRecordSort.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/DataSet.inl
+    ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetBaseTypes.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetBaseTypes.inl
+    ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetElement.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetElement.inl
+    ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetListElement.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetListElement.inl
+    ${PacBioBAM_IncludeDir}/pbbam/internal/DataSetTypes.inl
+    ${PacBioBAM_IncludeDir}/pbbam/internal/FilterEngine.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/IBamFileIterator.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/IMergeStrategy.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/MergeItem.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/MergeStrategy.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/PbiIndex_p.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/PbiIndex_p.inl
+    ${PacBioBAM_IncludeDir}/pbbam/internal/QueryBase.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/SequentialMergeStrategy.h
+    ${PacBioBAM_IncludeDir}/pbbam/internal/Tag.inl
+
+    # virtual headers
+    ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualPolymeraseBamRecord.h
+    ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualPolymeraseReader.h
+    ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualRegion.h
+    ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualRegionType.h
+    ${PacBioBAM_IncludeDir}/pbbam/virtual/VirtualRegionTypeMap.h
+
+    ${PacBioBAM_SourceDir}/AssertUtils.h
+    ${PacBioBAM_SourceDir}/DataSetIO.h
+    ${PacBioBAM_SourceDir}/DataSetUtils.h
+    ${PacBioBAM_SourceDir}/FileUtils.h
+    ${PacBioBAM_SourceDir}/FofnReader.h
+    ${PacBioBAM_SourceDir}/MemoryUtils.h
+    ${PacBioBAM_SourceDir}/PbiIndexIO.h
+    ${PacBioBAM_SourceDir}/SequenceUtils.h
+    ${PacBioBAM_SourceDir}/StringUtils.h
+    ${PacBioBAM_SourceDir}/TimeUtils.h
+    ${PacBioBAM_SourceDir}/XmlReader.h
+    ${PacBioBAM_SourceDir}/XmlWriter.h
+    ${PacBioBAM_SourceDir}/pugixml/pugiconfig.hpp
+    ${PacBioBAM_SourceDir}/pugixml/pugixml.hpp
+)
+
+# sources
+set( PacBioBAM_CPP
+
+    # main API headers
+    ${PacBioBAM_SourceDir}/Accuracy.cpp
+    ${PacBioBAM_SourceDir}/AlignmentPrinter.cpp
+    ${PacBioBAM_SourceDir}/AssertUtils.cpp
+    ${PacBioBAM_SourceDir}/BamFile.cpp
+    ${PacBioBAM_SourceDir}/BamHeader.cpp
+    ${PacBioBAM_SourceDir}/BamRecord.cpp
+    ${PacBioBAM_SourceDir}/BamRecordBuilder.cpp
+    ${PacBioBAM_SourceDir}/BamRecordImpl.cpp
+    ${PacBioBAM_SourceDir}/BamTagCodec.cpp
+    ${PacBioBAM_SourceDir}/BamWriter.cpp
+    ${PacBioBAM_SourceDir}/Cigar.cpp
+    ${PacBioBAM_SourceDir}/CigarOperation.cpp
+    ${PacBioBAM_SourceDir}/Config.cpp
+    ${PacBioBAM_SourceDir}/DataSet.cpp
+    ${PacBioBAM_SourceDir}/DataSetBaseTypes.cpp
+    ${PacBioBAM_SourceDir}/DataSetElement.cpp
+    ${PacBioBAM_SourceDir}/DataSetIO.cpp
+    ${PacBioBAM_SourceDir}/DataSetTypes.cpp
+    ${PacBioBAM_SourceDir}/DataSetXsd.cpp
+    ${PacBioBAM_SourceDir}/EntireFileQuery.cpp
+    ${PacBioBAM_SourceDir}/FilterEngine.cpp
+    ${PacBioBAM_SourceDir}/FofnReader.cpp
+    ${PacBioBAM_SourceDir}/Frames.cpp
+    ${PacBioBAM_SourceDir}/GenomicInterval.cpp
+    ${PacBioBAM_SourceDir}/GenomicIntervalQuery.cpp
+    ${PacBioBAM_SourceDir}/GroupQuery.cpp
+    ${PacBioBAM_SourceDir}/IndexedFastaReader.cpp
+    ${PacBioBAM_SourceDir}/MemoryUtils.cpp
+    ${PacBioBAM_SourceDir}/PbiBuilder.cpp
+    ${PacBioBAM_SourceDir}/PbiFile.cpp
+    ${PacBioBAM_SourceDir}/PbiIndex.cpp
+    ${PacBioBAM_SourceDir}/PbiIndexIO.cpp
+    ${PacBioBAM_SourceDir}/PbiRawData.cpp
+    ${PacBioBAM_SourceDir}/ProgramInfo.cpp
+    ${PacBioBAM_SourceDir}/QualityValue.cpp
+    ${PacBioBAM_SourceDir}/QueryBase.cpp
+    ${PacBioBAM_SourceDir}/ReadGroupInfo.cpp
+    ${PacBioBAM_SourceDir}/SamTagCodec.cpp
+    ${PacBioBAM_SourceDir}/SequenceInfo.cpp
+    ${PacBioBAM_SourceDir}/Tag.cpp
+    ${PacBioBAM_SourceDir}/TagCollection.cpp
+#    ${PacBioBAM_SourceDir}/UnmappedReadsQuery.cpp
+    ${PacBioBAM_SourceDir}/XmlReader.cpp
+    ${PacBioBAM_SourceDir}/XmlWriter.cpp
+    ${PacBioBAM_SourceDir}/ZmwGroupQuery.cpp
+    ${PacBioBAM_SourceDir}/ZmwQuery.cpp
+
+    # virtual
+    ${PacBioBAM_SourceDir}/VirtualPolymeraseBamRecord.cpp
+    ${PacBioBAM_SourceDir}/VirtualPolymeraseReader.cpp
+    ${PacBioBAM_SourceDir}/VirtualRegionTypeMap.cpp
+
+    # XML I/O
+    ${PacBioBAM_SourceDir}/pugixml/pugixml.cpp
+)
diff --git a/src/pugixml/pugiconfig.hpp b/src/pugixml/pugiconfig.hpp
new file mode 100644
index 0000000..6219dbe
--- /dev/null
+++ b/src/pugixml/pugiconfig.hpp
@@ -0,0 +1,71 @@
+/**
+ * pugixml parser - version 1.5
+ * --------------------------------------------------------
+ * Copyright (C) 2006-2014, by Arseny Kapoulkine (arseny.kapoulkine at gmail.com)
+ * Report bugs and download new versions at http://pugixml.org/
+ *
+ * This library is distributed under the MIT License. See notice at the end
+ * of this file.
+ *
+ * This work is based on the pugxml parser, which is:
+ * Copyright (C) 2003, by Kristen Wegner (kristen at tima.net)
+ */
+
+#ifndef HEADER_PUGICONFIG_HPP
+#define HEADER_PUGICONFIG_HPP
+
+// Uncomment this to enable wchar_t mode
+// #define PUGIXML_WCHAR_MODE
+
+// Uncomment this to disable XPath
+// #define PUGIXML_NO_XPATH
+
+// Uncomment this to disable STL
+// #define PUGIXML_NO_STL
+
+// Uncomment this to disable exceptions
+// #define PUGIXML_NO_EXCEPTIONS
+
+// Set this to control attributes for public classes/functions, i.e.:
+// #define PUGIXML_API __declspec(dllexport) // to export all public symbols from DLL
+// #define PUGIXML_CLASS __declspec(dllimport) // to import all classes from DLL
+// #define PUGIXML_FUNCTION __fastcall // to set calling conventions to all public functions to fastcall
+// In absence of PUGIXML_CLASS/PUGIXML_FUNCTION definitions PUGIXML_API is used instead
+
+// Tune these constants to adjust memory-related behavior
+// #define PUGIXML_MEMORY_PAGE_SIZE 32768
+// #define PUGIXML_MEMORY_OUTPUT_STACK 10240
+// #define PUGIXML_MEMORY_XPATH_PAGE_SIZE 4096
+
+// Uncomment this to switch to header-only version
+// #define PUGIXML_HEADER_ONLY
+
+// Uncomment this to enable long long support
+// #define PUGIXML_HAS_LONG_LONG
+
+#endif
+
+/**
+ * Copyright (c) 2006-2014 Arseny Kapoulkine
+ *
+ * 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.
+ */
diff --git a/src/pugixml/pugixml.cpp b/src/pugixml/pugixml.cpp
new file mode 100644
index 0000000..0f696ab
--- /dev/null
+++ b/src/pugixml/pugixml.cpp
@@ -0,0 +1,11525 @@
+/**
+ * pugixml parser - version 1.5
+ * --------------------------------------------------------
+ * Copyright (C) 2006-2014, by Arseny Kapoulkine (arseny.kapoulkine at gmail.com)
+ * Report bugs and download new versions at http://pugixml.org/
+ *
+ * This library is distributed under the MIT License. See notice at the end
+ * of this file.
+ *
+ * This work is based on the pugxml parser, which is:
+ * Copyright (C) 2003, by Kristen Wegner (kristen at tima.net)
+ */
+
+#ifndef SOURCE_PUGIXML_CPP
+#define SOURCE_PUGIXML_CPP
+
+#include "pugixml.hpp"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#ifdef PUGIXML_WCHAR_MODE
+#	include <wchar.h>
+#endif
+
+#ifndef PUGIXML_NO_XPATH
+#	include <math.h>
+#	include <float.h>
+#	ifdef PUGIXML_NO_EXCEPTIONS
+#		include <setjmp.h>
+#	endif
+#endif
+
+#ifndef PUGIXML_NO_STL
+#	include <istream>
+#	include <ostream>
+#	include <string>
+#endif
+
+// For placement new
+#include <new>
+
+#ifdef _MSC_VER
+#	pragma warning(push)
+#	pragma warning(disable: 4127) // conditional expression is constant
+#	pragma warning(disable: 4324) // structure was padded due to __declspec(align())
+#	pragma warning(disable: 4611) // interaction between '_setjmp' and C++ object destruction is non-portable
+#	pragma warning(disable: 4702) // unreachable code
+#	pragma warning(disable: 4996) // this function or variable may be unsafe
+#	pragma warning(disable: 4793) // function compiled as native: presence of '_setjmp' makes a function unmanaged
+#endif
+
+#ifdef __INTEL_COMPILER
+#	pragma warning(disable: 177) // function was declared but never referenced 
+#	pragma warning(disable: 279) // controlling expression is constant
+#	pragma warning(disable: 1478 1786) // function was declared "deprecated"
+#	pragma warning(disable: 1684) // conversion from pointer to same-sized integral type
+#endif
+
+#if defined(__BORLANDC__) && defined(PUGIXML_HEADER_ONLY)
+#	pragma warn -8080 // symbol is declared but never used; disabling this inside push/pop bracket does not make the warning go away
+#endif
+
+#ifdef __BORLANDC__
+#	pragma option push
+#	pragma warn -8008 // condition is always false
+#	pragma warn -8066 // unreachable code
+#endif
+
+#ifdef __SNC__
+// Using diag_push/diag_pop does not disable the warnings inside templates due to a compiler bug
+#	pragma diag_suppress=178 // function was declared but never referenced
+#	pragma diag_suppress=237 // controlling expression is constant
+#endif
+
+// Inlining controls
+#if defined(_MSC_VER) && _MSC_VER >= 1300
+#	define PUGI__NO_INLINE __declspec(noinline)
+#elif defined(__GNUC__)
+#	define PUGI__NO_INLINE __attribute__((noinline))
+#else
+#	define PUGI__NO_INLINE 
+#endif
+
+// Branch weight controls
+#if defined(__GNUC__)
+#	define PUGI__UNLIKELY(cond) __builtin_expect(cond, 0)
+#else
+#	define PUGI__UNLIKELY(cond) (cond)
+#endif
+
+// Simple static assertion
+#define PUGI__STATIC_ASSERT(cond) { static const char condition_failed[(cond) ? 1 : -1] = {0}; (void)condition_failed[0]; }
+
+// Digital Mars C++ bug workaround for passing char loaded from memory via stack
+#ifdef __DMC__
+#	define PUGI__DMC_VOLATILE volatile
+#else
+#	define PUGI__DMC_VOLATILE
+#endif
+
+// Borland C++ bug workaround for not defining ::memcpy depending on header include order (can't always use std::memcpy because some compilers don't have it at all)
+#if defined(__BORLANDC__) && !defined(__MEM_H_USING_LIST)
+using std::memcpy;
+using std::memmove;
+#endif
+
+// In some environments MSVC is a compiler but the CRT lacks certain MSVC-specific features
+#if defined(_MSC_VER) && !defined(__S3E__)
+#	define PUGI__MSVC_CRT_VERSION _MSC_VER
+#endif
+
+#ifdef PUGIXML_HEADER_ONLY
+#	define PUGI__NS_BEGIN namespace pugi { namespace impl {
+#	define PUGI__NS_END } }
+#	define PUGI__FN inline
+#	define PUGI__FN_NO_INLINE inline
+#else
+#	if defined(_MSC_VER) && _MSC_VER < 1300 // MSVC6 seems to have an amusing bug with anonymous namespaces inside namespaces
+#		define PUGI__NS_BEGIN namespace pugi { namespace impl {
+#		define PUGI__NS_END } }
+#	else
+#		define PUGI__NS_BEGIN namespace pugi { namespace impl { namespace {
+#		define PUGI__NS_END } } }
+#	endif
+#	define PUGI__FN
+#	define PUGI__FN_NO_INLINE PUGI__NO_INLINE
+#endif
+
+// uintptr_t
+#if !defined(_MSC_VER) || _MSC_VER >= 1600
+#	include <stdint.h>
+#else
+#	ifndef _UINTPTR_T_DEFINED
+// No native uintptr_t in MSVC6 and in some WinCE versions
+typedef size_t uintptr_t;
+#define _UINTPTR_T_DEFINED
+#	endif
+PUGI__NS_BEGIN
+	typedef unsigned __int8 uint8_t;
+	typedef unsigned __int16 uint16_t;
+	typedef unsigned __int32 uint32_t;
+PUGI__NS_END
+#endif
+
+// Memory allocation
+PUGI__NS_BEGIN
+	PUGI__FN void* default_allocate(size_t size)
+	{
+		return malloc(size);
+	}
+
+	PUGI__FN void default_deallocate(void* ptr)
+	{
+		free(ptr);
+	}
+
+	template <typename T>
+	struct xml_memory_management_function_storage
+	{
+		static allocation_function allocate;
+		static deallocation_function deallocate;
+	};
+
+	// Global allocation functions are stored in class statics so that in header mode linker deduplicates them
+	// Without a template<> we'll get multiple definitions of the same static
+	template <typename T> allocation_function xml_memory_management_function_storage<T>::allocate = default_allocate;
+	template <typename T> deallocation_function xml_memory_management_function_storage<T>::deallocate = default_deallocate;
+
+	typedef xml_memory_management_function_storage<int> xml_memory;
+PUGI__NS_END
+
+// String utilities
+PUGI__NS_BEGIN
+	// Get string length
+	PUGI__FN size_t strlength(const char_t* s)
+	{
+		assert(s);
+
+	#ifdef PUGIXML_WCHAR_MODE
+		return wcslen(s);
+	#else
+		return strlen(s);
+	#endif
+	}
+
+	// Compare two strings
+	PUGI__FN bool strequal(const char_t* src, const char_t* dst)
+	{
+		assert(src && dst);
+
+	#ifdef PUGIXML_WCHAR_MODE
+		return wcscmp(src, dst) == 0;
+	#else
+		return strcmp(src, dst) == 0;
+	#endif
+	}
+
+	// Compare lhs with [rhs_begin, rhs_end)
+	PUGI__FN bool strequalrange(const char_t* lhs, const char_t* rhs, size_t count)
+	{
+		for (size_t i = 0; i < count; ++i)
+			if (lhs[i] != rhs[i])
+				return false;
+	
+		return lhs[count] == 0;
+	}
+
+	// Get length of wide string, even if CRT lacks wide character support
+	PUGI__FN size_t strlength_wide(const wchar_t* s)
+	{
+		assert(s);
+
+	#ifdef PUGIXML_WCHAR_MODE
+		return wcslen(s);
+	#else
+		const wchar_t* end = s;
+		while (*end) end++;
+		return static_cast<size_t>(end - s);
+	#endif
+	}
+
+#ifdef PUGIXML_WCHAR_MODE
+	// Convert string to wide string, assuming all symbols are ASCII
+	PUGI__FN void widen_ascii(wchar_t* dest, const char* source)
+	{
+		for (const char* i = source; *i; ++i) *dest++ = *i;
+		*dest = 0;
+	}
+#endif
+PUGI__NS_END
+
+#if !defined(PUGIXML_NO_STL) || !defined(PUGIXML_NO_XPATH)
+// auto_ptr-like buffer holder for exception recovery
+PUGI__NS_BEGIN
+	struct buffer_holder
+	{
+		void* data;
+		void (*deleter)(void*);
+
+		buffer_holder(void* data_, void (*deleter_)(void*)): data(data_), deleter(deleter_)
+		{
+		}
+
+		~buffer_holder()
+		{
+			if (data) deleter(data);
+		}
+
+		void* release()
+		{
+			void* result = data;
+			data = 0;
+			return result;
+		}
+	};
+PUGI__NS_END
+#endif
+
+PUGI__NS_BEGIN
+	static const size_t xml_memory_page_size =
+	#ifdef PUGIXML_MEMORY_PAGE_SIZE
+		PUGIXML_MEMORY_PAGE_SIZE
+	#else
+		32768
+	#endif
+		;
+
+	static const uintptr_t xml_memory_page_alignment = 64;
+	static const uintptr_t xml_memory_page_pointer_mask = ~(xml_memory_page_alignment - 1);
+	static const uintptr_t xml_memory_page_contents_shared_mask = 32;
+	static const uintptr_t xml_memory_page_name_allocated_mask = 16;
+	static const uintptr_t xml_memory_page_value_allocated_mask = 8;
+	static const uintptr_t xml_memory_page_type_mask = 7;
+	static const uintptr_t xml_memory_page_name_allocated_or_shared_mask = xml_memory_page_name_allocated_mask | xml_memory_page_contents_shared_mask;
+	static const uintptr_t xml_memory_page_value_allocated_or_shared_mask = xml_memory_page_value_allocated_mask | xml_memory_page_contents_shared_mask;
+
+	#define PUGI__NODETYPE(n) static_cast<xml_node_type>(((n)->header & impl::xml_memory_page_type_mask) + 1)
+
+	struct xml_allocator;
+
+	struct xml_memory_page
+	{
+		static xml_memory_page* construct(void* memory)
+		{
+			xml_memory_page* result = static_cast<xml_memory_page*>(memory);
+
+			result->allocator = 0;
+			result->prev = 0;
+			result->next = 0;
+			result->busy_size = 0;
+			result->freed_size = 0;
+
+			return result;
+		}
+
+		xml_allocator* allocator;
+
+		xml_memory_page* prev;
+		xml_memory_page* next;
+
+		size_t busy_size;
+		size_t freed_size;
+	};
+
+	struct xml_memory_string_header
+	{
+		uint16_t page_offset; // offset from page->data
+		uint16_t full_size; // 0 if string occupies whole page
+	};
+
+	struct xml_allocator
+	{
+		xml_allocator(xml_memory_page* root): _root(root), _busy_size(root->busy_size)
+		{
+		}
+
+		xml_memory_page* allocate_page(size_t data_size)
+		{
+			size_t size = sizeof(xml_memory_page) + data_size;
+
+			// allocate block with some alignment, leaving memory for worst-case padding
+			void* memory = xml_memory::allocate(size + xml_memory_page_alignment);
+			if (!memory) return 0;
+
+			// align to next page boundary (note: this guarantees at least 1 usable byte before the page)
+			char* page_memory = reinterpret_cast<char*>((reinterpret_cast<uintptr_t>(memory) + xml_memory_page_alignment) & ~(xml_memory_page_alignment - 1));
+
+			// prepare page structure
+			xml_memory_page* page = xml_memory_page::construct(page_memory);
+			assert(page);
+
+			page->allocator = _root->allocator;
+
+			// record the offset for freeing the memory block
+			assert(page_memory > memory && page_memory - static_cast<char*>(memory) <= 127);
+			page_memory[-1] = static_cast<char>(page_memory - static_cast<char*>(memory));
+
+			return page;
+		}
+
+		static void deallocate_page(xml_memory_page* page)
+		{
+			char* page_memory = reinterpret_cast<char*>(page);
+
+			xml_memory::deallocate(page_memory - page_memory[-1]);
+		}
+
+		void* allocate_memory_oob(size_t size, xml_memory_page*& out_page);
+
+		void* allocate_memory(size_t size, xml_memory_page*& out_page)
+		{
+			if (_busy_size + size > xml_memory_page_size) return allocate_memory_oob(size, out_page);
+
+			void* buf = reinterpret_cast<char*>(_root) + sizeof(xml_memory_page) + _busy_size;
+
+			_busy_size += size;
+
+			out_page = _root;
+
+			return buf;
+		}
+
+		void deallocate_memory(void* ptr, size_t size, xml_memory_page* page)
+		{
+			if (page == _root) page->busy_size = _busy_size;
+
+			assert(ptr >= reinterpret_cast<char*>(page) + sizeof(xml_memory_page) && ptr < reinterpret_cast<char*>(page) + sizeof(xml_memory_page) + page->busy_size);
+			(void)!ptr;
+
+			page->freed_size += size;
+			assert(page->freed_size <= page->busy_size);
+
+			if (page->freed_size == page->busy_size)
+			{
+				if (page->next == 0)
+				{
+					assert(_root == page);
+
+					// top page freed, just reset sizes
+					page->busy_size = page->freed_size = 0;
+					_busy_size = 0;
+				}
+				else
+				{
+					assert(_root != page);
+					assert(page->prev);
+
+					// remove from the list
+					page->prev->next = page->next;
+					page->next->prev = page->prev;
+
+					// deallocate
+					deallocate_page(page);
+				}
+			}
+		}
+
+		char_t* allocate_string(size_t length)
+		{
+			PUGI__STATIC_ASSERT(xml_memory_page_size <= (1 << 16));
+
+			// allocate memory for string and header block
+			size_t size = sizeof(xml_memory_string_header) + length * sizeof(char_t);
+			
+			// round size up to pointer alignment boundary
+			size_t full_size = (size + (sizeof(void*) - 1)) & ~(sizeof(void*) - 1);
+
+			xml_memory_page* page;
+			xml_memory_string_header* header = static_cast<xml_memory_string_header*>(allocate_memory(full_size, page));
+
+			if (!header) return 0;
+
+			// setup header
+			ptrdiff_t page_offset = reinterpret_cast<char*>(header) - reinterpret_cast<char*>(page) - sizeof(xml_memory_page);
+
+			assert(page_offset >= 0 && page_offset < (1 << 16));
+			header->page_offset = static_cast<uint16_t>(page_offset);
+
+			// full_size == 0 for large strings that occupy the whole page
+			assert(full_size < (1 << 16) || (page->busy_size == full_size && page_offset == 0));
+			header->full_size = static_cast<uint16_t>(full_size < (1 << 16) ? full_size : 0);
+
+			// round-trip through void* to avoid 'cast increases required alignment of target type' warning
+			// header is guaranteed a pointer-sized alignment, which should be enough for char_t
+			return static_cast<char_t*>(static_cast<void*>(header + 1));
+		}
+
+		void deallocate_string(char_t* string)
+		{
+			// this function casts pointers through void* to avoid 'cast increases required alignment of target type' warnings
+			// we're guaranteed the proper (pointer-sized) alignment on the input string if it was allocated via allocate_string
+
+			// get header
+			xml_memory_string_header* header = static_cast<xml_memory_string_header*>(static_cast<void*>(string)) - 1;
+			assert(header);
+
+			// deallocate
+			size_t page_offset = sizeof(xml_memory_page) + header->page_offset;
+			xml_memory_page* page = reinterpret_cast<xml_memory_page*>(static_cast<void*>(reinterpret_cast<char*>(header) - page_offset));
+
+			// if full_size == 0 then this string occupies the whole page
+			size_t full_size = header->full_size == 0 ? page->busy_size : header->full_size;
+
+			deallocate_memory(header, full_size, page);
+		}
+
+		xml_memory_page* _root;
+		size_t _busy_size;
+	};
+
+	PUGI__FN_NO_INLINE void* xml_allocator::allocate_memory_oob(size_t size, xml_memory_page*& out_page)
+	{
+		const size_t large_allocation_threshold = xml_memory_page_size / 4;
+
+		xml_memory_page* page = allocate_page(size <= large_allocation_threshold ? xml_memory_page_size : size);
+		out_page = page;
+
+		if (!page) return 0;
+
+		if (size <= large_allocation_threshold)
+		{
+			_root->busy_size = _busy_size;
+
+			// insert page at the end of linked list
+			page->prev = _root;
+			_root->next = page;
+			_root = page;
+
+			_busy_size = size;
+		}
+		else
+		{
+			// insert page before the end of linked list, so that it is deleted as soon as possible
+			// the last page is not deleted even if it's empty (see deallocate_memory)
+			assert(_root->prev);
+
+			page->prev = _root->prev;
+			page->next = _root;
+
+			_root->prev->next = page;
+			_root->prev = page;
+		}
+
+		// allocate inside page
+		page->busy_size = size;
+
+		return reinterpret_cast<char*>(page) + sizeof(xml_memory_page);
+	}
+PUGI__NS_END
+
+namespace pugi
+{
+	/// A 'name=value' XML attribute structure.
+	struct xml_attribute_struct
+	{
+		/// Default ctor
+		xml_attribute_struct(impl::xml_memory_page* page): header(reinterpret_cast<uintptr_t>(page)), name(0), value(0), prev_attribute_c(0), next_attribute(0)
+		{
+		}
+
+		uintptr_t header;
+
+		char_t* name;	///< Pointer to attribute name.
+		char_t*	value;	///< Pointer to attribute value.
+
+		xml_attribute_struct* prev_attribute_c;	///< Previous attribute (cyclic list)
+		xml_attribute_struct* next_attribute;	///< Next attribute
+	};
+
+	/// An XML document tree node.
+	struct xml_node_struct
+	{
+		/// Default ctor
+		/// \param type - node type
+		xml_node_struct(impl::xml_memory_page* page, xml_node_type type): header(reinterpret_cast<uintptr_t>(page) | (type - 1)), parent(0), name(0), value(0), first_child(0), prev_sibling_c(0), next_sibling(0), first_attribute(0)
+		{
+		}
+
+		uintptr_t header;
+
+		xml_node_struct*		parent;					///< Pointer to parent
+
+		char_t*					name;					///< Pointer to element name.
+		char_t*					value;					///< Pointer to any associated string data.
+
+		xml_node_struct*		first_child;			///< First child
+		
+		xml_node_struct*		prev_sibling_c;			///< Left brother (cyclic list)
+		xml_node_struct*		next_sibling;			///< Right brother
+		
+		xml_attribute_struct*	first_attribute;		///< First attribute
+	};
+}
+
+PUGI__NS_BEGIN
+	struct xml_extra_buffer
+	{
+		char_t* buffer;
+		xml_extra_buffer* next;
+	};
+
+	struct xml_document_struct: public xml_node_struct, public xml_allocator
+	{
+		xml_document_struct(xml_memory_page* page): xml_node_struct(page, node_document), xml_allocator(page), buffer(0), extra_buffers(0)
+		{
+		}
+
+		const char_t* buffer;
+
+		xml_extra_buffer* extra_buffers;
+	};
+
+	inline xml_allocator& get_allocator(const xml_node_struct* node)
+	{
+		assert(node);
+
+		return *reinterpret_cast<xml_memory_page*>(node->header & xml_memory_page_pointer_mask)->allocator;
+	}
+
+	template <typename Object> inline xml_document_struct& get_document(const Object* object)
+	{
+		assert(object);
+
+		return *static_cast<xml_document_struct*>(reinterpret_cast<xml_memory_page*>(object->header & xml_memory_page_pointer_mask)->allocator);
+	}
+PUGI__NS_END
+
+// Low-level DOM operations
+PUGI__NS_BEGIN
+	inline xml_attribute_struct* allocate_attribute(xml_allocator& alloc)
+	{
+		xml_memory_page* page;
+		void* memory = alloc.allocate_memory(sizeof(xml_attribute_struct), page);
+
+		return new (memory) xml_attribute_struct(page);
+	}
+
+	inline xml_node_struct* allocate_node(xml_allocator& alloc, xml_node_type type)
+	{
+		xml_memory_page* page;
+		void* memory = alloc.allocate_memory(sizeof(xml_node_struct), page);
+
+		return new (memory) xml_node_struct(page, type);
+	}
+
+	inline void destroy_attribute(xml_attribute_struct* a, xml_allocator& alloc)
+	{
+		uintptr_t header = a->header;
+
+		if (header & impl::xml_memory_page_name_allocated_mask) alloc.deallocate_string(a->name);
+		if (header & impl::xml_memory_page_value_allocated_mask) alloc.deallocate_string(a->value);
+
+		alloc.deallocate_memory(a, sizeof(xml_attribute_struct), reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask));
+	}
+
+	inline void destroy_node(xml_node_struct* n, xml_allocator& alloc)
+	{
+		uintptr_t header = n->header;
+
+		if (header & impl::xml_memory_page_name_allocated_mask) alloc.deallocate_string(n->name);
+		if (header & impl::xml_memory_page_value_allocated_mask) alloc.deallocate_string(n->value);
+
+		for (xml_attribute_struct* attr = n->first_attribute; attr; )
+		{
+			xml_attribute_struct* next = attr->next_attribute;
+
+			destroy_attribute(attr, alloc);
+
+			attr = next;
+		}
+
+		for (xml_node_struct* child = n->first_child; child; )
+		{
+			xml_node_struct* next = child->next_sibling;
+
+			destroy_node(child, alloc);
+
+			child = next;
+		}
+
+		alloc.deallocate_memory(n, sizeof(xml_node_struct), reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask));
+	}
+
+	inline void append_node(xml_node_struct* child, xml_node_struct* node)
+	{
+		child->parent = node;
+
+		xml_node_struct* head = node->first_child;
+
+		if (head)
+		{
+			xml_node_struct* tail = head->prev_sibling_c;
+
+			tail->next_sibling = child;
+			child->prev_sibling_c = tail;
+			head->prev_sibling_c = child;
+		}
+		else
+		{
+			node->first_child = child;
+			child->prev_sibling_c = child;
+		}
+	}
+
+	inline void prepend_node(xml_node_struct* child, xml_node_struct* node)
+	{
+		child->parent = node;
+
+		xml_node_struct* head = node->first_child;
+
+		if (head)
+		{
+			child->prev_sibling_c = head->prev_sibling_c;
+			head->prev_sibling_c = child;
+		}
+		else
+			child->prev_sibling_c = child;
+
+		child->next_sibling = head;
+		node->first_child = child;
+	}
+
+	inline void insert_node_after(xml_node_struct* child, xml_node_struct* node)
+	{
+		xml_node_struct* parent = node->parent;
+
+		child->parent = parent;
+
+		if (node->next_sibling)
+			node->next_sibling->prev_sibling_c = child;
+		else
+			parent->first_child->prev_sibling_c = child;
+
+		child->next_sibling = node->next_sibling;
+		child->prev_sibling_c = node;
+
+		node->next_sibling = child;
+	}
+
+	inline void insert_node_before(xml_node_struct* child, xml_node_struct* node)
+	{
+		xml_node_struct* parent = node->parent;
+
+		child->parent = parent;
+
+		if (node->prev_sibling_c->next_sibling)
+			node->prev_sibling_c->next_sibling = child;
+		else
+			parent->first_child = child;
+
+		child->prev_sibling_c = node->prev_sibling_c;
+		child->next_sibling = node;
+
+		node->prev_sibling_c = child;
+	}
+
+	inline void remove_node(xml_node_struct* node)
+	{
+		xml_node_struct* parent = node->parent;
+
+		if (node->next_sibling)
+			node->next_sibling->prev_sibling_c = node->prev_sibling_c;
+		else
+			parent->first_child->prev_sibling_c = node->prev_sibling_c;
+
+		if (node->prev_sibling_c->next_sibling)
+			node->prev_sibling_c->next_sibling = node->next_sibling;
+		else
+			parent->first_child = node->next_sibling;
+
+		node->parent = 0;
+		node->prev_sibling_c = 0;
+		node->next_sibling = 0;
+	}
+
+	inline void append_attribute(xml_attribute_struct* attr, xml_node_struct* node)
+	{
+		xml_attribute_struct* head = node->first_attribute;
+
+		if (head)
+		{
+			xml_attribute_struct* tail = head->prev_attribute_c;
+
+			tail->next_attribute = attr;
+			attr->prev_attribute_c = tail;
+			head->prev_attribute_c = attr;
+		}
+		else
+		{
+			node->first_attribute = attr;
+			attr->prev_attribute_c = attr;
+		}
+	}
+
+	inline void prepend_attribute(xml_attribute_struct* attr, xml_node_struct* node)
+	{
+		xml_attribute_struct* head = node->first_attribute;
+
+		if (head)
+		{
+			attr->prev_attribute_c = head->prev_attribute_c;
+			head->prev_attribute_c = attr;
+		}
+		else
+			attr->prev_attribute_c = attr;
+
+		attr->next_attribute = head;
+		node->first_attribute = attr;
+	}
+
+	inline void insert_attribute_after(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node)
+	{
+		if (place->next_attribute)
+			place->next_attribute->prev_attribute_c = attr;
+		else
+			node->first_attribute->prev_attribute_c = attr;
+
+		attr->next_attribute = place->next_attribute;
+		attr->prev_attribute_c = place;
+		place->next_attribute = attr;
+	}
+
+	inline void insert_attribute_before(xml_attribute_struct* attr, xml_attribute_struct* place, xml_node_struct* node)
+	{
+		if (place->prev_attribute_c->next_attribute)
+			place->prev_attribute_c->next_attribute = attr;
+		else
+			node->first_attribute = attr;
+
+		attr->prev_attribute_c = place->prev_attribute_c;
+		attr->next_attribute = place;
+		place->prev_attribute_c = attr;
+	}
+
+	inline void remove_attribute(xml_attribute_struct* attr, xml_node_struct* node)
+	{
+		if (attr->next_attribute)
+			attr->next_attribute->prev_attribute_c = attr->prev_attribute_c;
+		else
+			node->first_attribute->prev_attribute_c = attr->prev_attribute_c;
+
+		if (attr->prev_attribute_c->next_attribute)
+			attr->prev_attribute_c->next_attribute = attr->next_attribute;
+		else
+			node->first_attribute = attr->next_attribute;
+
+		attr->prev_attribute_c = 0;
+		attr->next_attribute = 0;
+	}
+
+	PUGI__FN_NO_INLINE xml_node_struct* append_new_node(xml_node_struct* node, xml_allocator& alloc, xml_node_type type = node_element)
+	{
+		xml_node_struct* child = allocate_node(alloc, type);
+		if (!child) return 0;
+
+		append_node(child, node);
+
+		return child;
+	}
+
+	PUGI__FN_NO_INLINE xml_attribute_struct* append_new_attribute(xml_node_struct* node, xml_allocator& alloc)
+	{
+		xml_attribute_struct* attr = allocate_attribute(alloc);
+		if (!attr) return 0;
+
+		append_attribute(attr, node);
+
+		return attr;
+	}
+PUGI__NS_END
+
+// Helper classes for code generation
+PUGI__NS_BEGIN
+	struct opt_false
+	{
+		enum { value = 0 };
+	};
+
+	struct opt_true
+	{
+		enum { value = 1 };
+	};
+PUGI__NS_END
+
+// Unicode utilities
+PUGI__NS_BEGIN
+	inline uint16_t endian_swap(uint16_t value)
+	{
+		return static_cast<uint16_t>(((value & 0xff) << 8) | (value >> 8));
+	}
+
+	inline uint32_t endian_swap(uint32_t value)
+	{
+		return ((value & 0xff) << 24) | ((value & 0xff00) << 8) | ((value & 0xff0000) >> 8) | (value >> 24);
+	}
+
+	struct utf8_counter
+	{
+		typedef size_t value_type;
+
+		static value_type low(value_type result, uint32_t ch)
+		{
+			// U+0000..U+007F
+			if (ch < 0x80) return result + 1;
+			// U+0080..U+07FF
+			else if (ch < 0x800) return result + 2;
+			// U+0800..U+FFFF
+			else return result + 3;
+		}
+
+		static value_type high(value_type result, uint32_t)
+		{
+			// U+10000..U+10FFFF
+			return result + 4;
+		}
+	};
+
+	struct utf8_writer
+	{
+		typedef uint8_t* value_type;
+
+		static value_type low(value_type result, uint32_t ch)
+		{
+			// U+0000..U+007F
+			if (ch < 0x80)
+			{
+				*result = static_cast<uint8_t>(ch);
+				return result + 1;
+			}
+			// U+0080..U+07FF
+			else if (ch < 0x800)
+			{
+				result[0] = static_cast<uint8_t>(0xC0 | (ch >> 6));
+				result[1] = static_cast<uint8_t>(0x80 | (ch & 0x3F));
+				return result + 2;
+			}
+			// U+0800..U+FFFF
+			else
+			{
+				result[0] = static_cast<uint8_t>(0xE0 | (ch >> 12));
+				result[1] = static_cast<uint8_t>(0x80 | ((ch >> 6) & 0x3F));
+				result[2] = static_cast<uint8_t>(0x80 | (ch & 0x3F));
+				return result + 3;
+			}
+		}
+
+		static value_type high(value_type result, uint32_t ch)
+		{
+			// U+10000..U+10FFFF
+			result[0] = static_cast<uint8_t>(0xF0 | (ch >> 18));
+			result[1] = static_cast<uint8_t>(0x80 | ((ch >> 12) & 0x3F));
+			result[2] = static_cast<uint8_t>(0x80 | ((ch >> 6) & 0x3F));
+			result[3] = static_cast<uint8_t>(0x80 | (ch & 0x3F));
+			return result + 4;
+		}
+
+		static value_type any(value_type result, uint32_t ch)
+		{
+			return (ch < 0x10000) ? low(result, ch) : high(result, ch);
+		}
+	};
+
+	struct utf16_counter
+	{
+		typedef size_t value_type;
+
+		static value_type low(value_type result, uint32_t)
+		{
+			return result + 1;
+		}
+
+		static value_type high(value_type result, uint32_t)
+		{
+			return result + 2;
+		}
+	};
+
+	struct utf16_writer
+	{
+		typedef uint16_t* value_type;
+
+		static value_type low(value_type result, uint32_t ch)
+		{
+			*result = static_cast<uint16_t>(ch);
+
+			return result + 1;
+		}
+
+		static value_type high(value_type result, uint32_t ch)
+		{
+			uint32_t msh = static_cast<uint32_t>(ch - 0x10000) >> 10;
+			uint32_t lsh = static_cast<uint32_t>(ch - 0x10000) & 0x3ff;
+
+			result[0] = static_cast<uint16_t>(0xD800 + msh);
+			result[1] = static_cast<uint16_t>(0xDC00 + lsh);
+
+			return result + 2;
+		}
+
+		static value_type any(value_type result, uint32_t ch)
+		{
+			return (ch < 0x10000) ? low(result, ch) : high(result, ch);
+		}
+	};
+
+	struct utf32_counter
+	{
+		typedef size_t value_type;
+
+		static value_type low(value_type result, uint32_t)
+		{
+			return result + 1;
+		}
+
+		static value_type high(value_type result, uint32_t)
+		{
+			return result + 1;
+		}
+	};
+
+	struct utf32_writer
+	{
+		typedef uint32_t* value_type;
+
+		static value_type low(value_type result, uint32_t ch)
+		{
+			*result = ch;
+
+			return result + 1;
+		}
+
+		static value_type high(value_type result, uint32_t ch)
+		{
+			*result = ch;
+
+			return result + 1;
+		}
+
+		static value_type any(value_type result, uint32_t ch)
+		{
+			*result = ch;
+
+			return result + 1;
+		}
+	};
+
+	struct latin1_writer
+	{
+		typedef uint8_t* value_type;
+
+		static value_type low(value_type result, uint32_t ch)
+		{
+			*result = static_cast<uint8_t>(ch > 255 ? '?' : ch);
+
+			return result + 1;
+		}
+
+		static value_type high(value_type result, uint32_t ch)
+		{
+			(void)ch;
+
+			*result = '?';
+
+			return result + 1;
+		}
+	};
+
+	template <size_t size> struct wchar_selector;
+
+	template <> struct wchar_selector<2>
+	{
+		typedef uint16_t type;
+		typedef utf16_counter counter;
+		typedef utf16_writer writer;
+	};
+
+	template <> struct wchar_selector<4>
+	{
+		typedef uint32_t type;
+		typedef utf32_counter counter;
+		typedef utf32_writer writer;
+	};
+
+	typedef wchar_selector<sizeof(wchar_t)>::counter wchar_counter;
+	typedef wchar_selector<sizeof(wchar_t)>::writer wchar_writer;
+
+	template <typename Traits, typename opt_swap = opt_false> struct utf_decoder
+	{
+		static inline typename Traits::value_type decode_utf8_block(const uint8_t* data, size_t size, typename Traits::value_type result)
+		{
+			const uint8_t utf8_byte_mask = 0x3f;
+
+			while (size)
+			{
+				uint8_t lead = *data;
+
+				// 0xxxxxxx -> U+0000..U+007F
+				if (lead < 0x80)
+				{
+					result = Traits::low(result, lead);
+					data += 1;
+					size -= 1;
+
+					// process aligned single-byte (ascii) blocks
+					if ((reinterpret_cast<uintptr_t>(data) & 3) == 0)
+					{
+						// round-trip through void* to silence 'cast increases required alignment of target type' warnings
+						while (size >= 4 && (*static_cast<const uint32_t*>(static_cast<const void*>(data)) & 0x80808080) == 0)
+						{
+							result = Traits::low(result, data[0]);
+							result = Traits::low(result, data[1]);
+							result = Traits::low(result, data[2]);
+							result = Traits::low(result, data[3]);
+							data += 4;
+							size -= 4;
+						}
+					}
+				}
+				// 110xxxxx -> U+0080..U+07FF
+				else if (static_cast<unsigned int>(lead - 0xC0) < 0x20 && size >= 2 && (data[1] & 0xc0) == 0x80)
+				{
+					result = Traits::low(result, ((lead & ~0xC0) << 6) | (data[1] & utf8_byte_mask));
+					data += 2;
+					size -= 2;
+				}
+				// 1110xxxx -> U+0800-U+FFFF
+				else if (static_cast<unsigned int>(lead - 0xE0) < 0x10 && size >= 3 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80)
+				{
+					result = Traits::low(result, ((lead & ~0xE0) << 12) | ((data[1] & utf8_byte_mask) << 6) | (data[2] & utf8_byte_mask));
+					data += 3;
+					size -= 3;
+				}
+				// 11110xxx -> U+10000..U+10FFFF
+				else if (static_cast<unsigned int>(lead - 0xF0) < 0x08 && size >= 4 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80 && (data[3] & 0xc0) == 0x80)
+				{
+					result = Traits::high(result, ((lead & ~0xF0) << 18) | ((data[1] & utf8_byte_mask) << 12) | ((data[2] & utf8_byte_mask) << 6) | (data[3] & utf8_byte_mask));
+					data += 4;
+					size -= 4;
+				}
+				// 10xxxxxx or 11111xxx -> invalid
+				else
+				{
+					data += 1;
+					size -= 1;
+				}
+			}
+
+			return result;
+		}
+
+		static inline typename Traits::value_type decode_utf16_block(const uint16_t* data, size_t size, typename Traits::value_type result)
+		{
+			const uint16_t* end = data + size;
+
+			while (data < end)
+			{
+				unsigned int lead = opt_swap::value ? endian_swap(*data) : *data;
+
+				// U+0000..U+D7FF
+				if (lead < 0xD800)
+				{
+					result = Traits::low(result, lead);
+					data += 1;
+				}
+				// U+E000..U+FFFF
+				else if (static_cast<unsigned int>(lead - 0xE000) < 0x2000)
+				{
+					result = Traits::low(result, lead);
+					data += 1;
+				}
+				// surrogate pair lead
+				else if (static_cast<unsigned int>(lead - 0xD800) < 0x400 && data + 1 < end)
+				{
+					uint16_t next = opt_swap::value ? endian_swap(data[1]) : data[1];
+
+					if (static_cast<unsigned int>(next - 0xDC00) < 0x400)
+					{
+						result = Traits::high(result, 0x10000 + ((lead & 0x3ff) << 10) + (next & 0x3ff));
+						data += 2;
+					}
+					else
+					{
+						data += 1;
+					}
+				}
+				else
+				{
+					data += 1;
+				}
+			}
+
+			return result;
+		}
+
+		static inline typename Traits::value_type decode_utf32_block(const uint32_t* data, size_t size, typename Traits::value_type result)
+		{
+			const uint32_t* end = data + size;
+
+			while (data < end)
+			{
+				uint32_t lead = opt_swap::value ? endian_swap(*data) : *data;
+
+				// U+0000..U+FFFF
+				if (lead < 0x10000)
+				{
+					result = Traits::low(result, lead);
+					data += 1;
+				}
+				// U+10000..U+10FFFF
+				else
+				{
+					result = Traits::high(result, lead);
+					data += 1;
+				}
+			}
+
+			return result;
+		}
+
+		static inline typename Traits::value_type decode_latin1_block(const uint8_t* data, size_t size, typename Traits::value_type result)
+		{
+			for (size_t i = 0; i < size; ++i)
+			{
+				result = Traits::low(result, data[i]);
+			}
+
+			return result;
+		}
+
+		static inline typename Traits::value_type decode_wchar_block_impl(const uint16_t* data, size_t size, typename Traits::value_type result)
+		{
+			return decode_utf16_block(data, size, result);
+		}
+
+		static inline typename Traits::value_type decode_wchar_block_impl(const uint32_t* data, size_t size, typename Traits::value_type result)
+		{
+			return decode_utf32_block(data, size, result);
+		}
+
+		static inline typename Traits::value_type decode_wchar_block(const wchar_t* data, size_t size, typename Traits::value_type result)
+		{
+			return decode_wchar_block_impl(reinterpret_cast<const wchar_selector<sizeof(wchar_t)>::type*>(data), size, result);
+		}
+	};
+
+	template <typename T> PUGI__FN void convert_utf_endian_swap(T* result, const T* data, size_t length)
+	{
+		for (size_t i = 0; i < length; ++i) result[i] = endian_swap(data[i]);
+	}
+
+#ifdef PUGIXML_WCHAR_MODE
+	PUGI__FN void convert_wchar_endian_swap(wchar_t* result, const wchar_t* data, size_t length)
+	{
+		for (size_t i = 0; i < length; ++i) result[i] = static_cast<wchar_t>(endian_swap(static_cast<wchar_selector<sizeof(wchar_t)>::type>(data[i])));
+	}
+#endif
+PUGI__NS_END
+
+PUGI__NS_BEGIN
+	enum chartype_t
+	{
+		ct_parse_pcdata = 1,	// \0, &, \r, <
+		ct_parse_attr = 2,		// \0, &, \r, ', "
+		ct_parse_attr_ws = 4,	// \0, &, \r, ', ", \n, tab
+		ct_space = 8,			// \r, \n, space, tab
+		ct_parse_cdata = 16,	// \0, ], >, \r
+		ct_parse_comment = 32,	// \0, -, >, \r
+		ct_symbol = 64,			// Any symbol > 127, a-z, A-Z, 0-9, _, :, -, .
+		ct_start_symbol = 128	// Any symbol > 127, a-z, A-Z, _, :
+	};
+
+	static const unsigned char chartype_table[256] =
+	{
+		55,  0,   0,   0,   0,   0,   0,   0,      0,   12,  12,  0,   0,   63,  0,   0,   // 0-15
+		0,   0,   0,   0,   0,   0,   0,   0,      0,   0,   0,   0,   0,   0,   0,   0,   // 16-31
+		8,   0,   6,   0,   0,   0,   7,   6,      0,   0,   0,   0,   0,   96,  64,  0,   // 32-47
+		64,  64,  64,  64,  64,  64,  64,  64,     64,  64,  192, 0,   1,   0,   48,  0,   // 48-63
+		0,   192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192, // 64-79
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 0,   0,   16,  0,   192, // 80-95
+		0,   192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192, // 96-111
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 0, 0, 0, 0, 0,           // 112-127
+
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192, // 128+
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192,
+		192, 192, 192, 192, 192, 192, 192, 192,    192, 192, 192, 192, 192, 192, 192, 192
+	};
+
+	enum chartypex_t
+	{
+		ctx_special_pcdata = 1,   // Any symbol >= 0 and < 32 (except \t, \r, \n), &, <, >
+		ctx_special_attr = 2,     // Any symbol >= 0 and < 32 (except \t), &, <, >, "
+		ctx_start_symbol = 4,	  // Any symbol > 127, a-z, A-Z, _
+		ctx_digit = 8,			  // 0-9
+		ctx_symbol = 16			  // Any symbol > 127, a-z, A-Z, 0-9, _, -, .
+	};
+	
+	static const unsigned char chartypex_table[256] =
+	{
+		3,  3,  3,  3,  3,  3,  3,  3,     3,  0,  2,  3,  3,  2,  3,  3,     // 0-15
+		3,  3,  3,  3,  3,  3,  3,  3,     3,  3,  3,  3,  3,  3,  3,  3,     // 16-31
+		0,  0,  2,  0,  0,  0,  3,  0,     0,  0,  0,  0,  0, 16, 16,  0,     // 32-47
+		24, 24, 24, 24, 24, 24, 24, 24,    24, 24, 0,  0,  3,  0,  3,  0,     // 48-63
+
+		0,  20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,    // 64-79
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 0,  0,  0,  0,  20,    // 80-95
+		0,  20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,    // 96-111
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 0,  0,  0,  0,  0,     // 112-127
+
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,    // 128+
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20,
+		20, 20, 20, 20, 20, 20, 20, 20,    20, 20, 20, 20, 20, 20, 20, 20
+	};
+	
+#ifdef PUGIXML_WCHAR_MODE
+	#define PUGI__IS_CHARTYPE_IMPL(c, ct, table) ((static_cast<unsigned int>(c) < 128 ? table[static_cast<unsigned int>(c)] : table[128]) & (ct))
+#else
+	#define PUGI__IS_CHARTYPE_IMPL(c, ct, table) (table[static_cast<unsigned char>(c)] & (ct))
+#endif
+
+	#define PUGI__IS_CHARTYPE(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartype_table)
+	#define PUGI__IS_CHARTYPEX(c, ct) PUGI__IS_CHARTYPE_IMPL(c, ct, chartypex_table)
+
+	PUGI__FN bool is_little_endian()
+	{
+		unsigned int ui = 1;
+
+		return *reinterpret_cast<unsigned char*>(&ui) == 1;
+	}
+
+	PUGI__FN xml_encoding get_wchar_encoding()
+	{
+		PUGI__STATIC_ASSERT(sizeof(wchar_t) == 2 || sizeof(wchar_t) == 4);
+
+		if (sizeof(wchar_t) == 2)
+			return is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+		else 
+			return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+	}
+
+	PUGI__FN xml_encoding guess_buffer_encoding(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
+	{
+		// look for BOM in first few bytes
+		if (d0 == 0 && d1 == 0 && d2 == 0xfe && d3 == 0xff) return encoding_utf32_be;
+		if (d0 == 0xff && d1 == 0xfe && d2 == 0 && d3 == 0) return encoding_utf32_le;
+		if (d0 == 0xfe && d1 == 0xff) return encoding_utf16_be;
+		if (d0 == 0xff && d1 == 0xfe) return encoding_utf16_le;
+		if (d0 == 0xef && d1 == 0xbb && d2 == 0xbf) return encoding_utf8;
+
+		// look for <, <? or <?xm in various encodings
+		if (d0 == 0 && d1 == 0 && d2 == 0 && d3 == 0x3c) return encoding_utf32_be;
+		if (d0 == 0x3c && d1 == 0 && d2 == 0 && d3 == 0) return encoding_utf32_le;
+		if (d0 == 0 && d1 == 0x3c && d2 == 0 && d3 == 0x3f) return encoding_utf16_be;
+		if (d0 == 0x3c && d1 == 0 && d2 == 0x3f && d3 == 0) return encoding_utf16_le;
+		if (d0 == 0x3c && d1 == 0x3f && d2 == 0x78 && d3 == 0x6d) return encoding_utf8;
+
+		// look for utf16 < followed by node name (this may fail, but is better than utf8 since it's zero terminated so early)
+		if (d0 == 0 && d1 == 0x3c) return encoding_utf16_be;
+		if (d0 == 0x3c && d1 == 0) return encoding_utf16_le;
+
+		// no known BOM detected, assume utf8
+		return encoding_utf8;
+	}
+
+	PUGI__FN xml_encoding get_buffer_encoding(xml_encoding encoding, const void* contents, size_t size)
+	{
+		// replace wchar encoding with utf implementation
+		if (encoding == encoding_wchar) return get_wchar_encoding();
+
+		// replace utf16 encoding with utf16 with specific endianness
+		if (encoding == encoding_utf16) return is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+		// replace utf32 encoding with utf32 with specific endianness
+		if (encoding == encoding_utf32) return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+		// only do autodetection if no explicit encoding is requested
+		if (encoding != encoding_auto) return encoding;
+
+		// skip encoding autodetection if input buffer is too small
+		if (size < 4) return encoding_utf8;
+
+		// try to guess encoding (based on XML specification, Appendix F.1)
+		const uint8_t* data = static_cast<const uint8_t*>(contents);
+
+		PUGI__DMC_VOLATILE uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3];
+
+		return guess_buffer_encoding(d0, d1, d2, d3);
+	}
+
+	PUGI__FN bool get_mutable_buffer(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)
+	{
+		size_t length = size / sizeof(char_t);
+
+		if (is_mutable)
+		{
+			out_buffer = static_cast<char_t*>(const_cast<void*>(contents));
+			out_length = length;
+		}
+		else
+		{
+			char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+			if (!buffer) return false;
+
+			if (contents)
+				memcpy(buffer, contents, length * sizeof(char_t));
+			else
+				assert(length == 0);
+
+			buffer[length] = 0;
+
+			out_buffer = buffer;
+			out_length = length + 1;
+		}
+
+		return true;
+	}
+
+#ifdef PUGIXML_WCHAR_MODE
+	PUGI__FN bool need_endian_swap_utf(xml_encoding le, xml_encoding re)
+	{
+		return (le == encoding_utf16_be && re == encoding_utf16_le) || (le == encoding_utf16_le && re == encoding_utf16_be) ||
+			   (le == encoding_utf32_be && re == encoding_utf32_le) || (le == encoding_utf32_le && re == encoding_utf32_be);
+	}
+
+	PUGI__FN bool convert_buffer_endian_swap(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)
+	{
+		const char_t* data = static_cast<const char_t*>(contents);
+		size_t length = size / sizeof(char_t);
+
+		if (is_mutable)
+		{
+			char_t* buffer = const_cast<char_t*>(data);
+
+			convert_wchar_endian_swap(buffer, data, length);
+
+			out_buffer = buffer;
+			out_length = length;
+		}
+		else
+		{
+			char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+			if (!buffer) return false;
+
+			convert_wchar_endian_swap(buffer, data, length);
+			buffer[length] = 0;
+
+			out_buffer = buffer;
+			out_length = length + 1;
+		}
+
+		return true;
+	}
+
+	PUGI__FN bool convert_buffer_utf8(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size)
+	{
+		const uint8_t* data = static_cast<const uint8_t*>(contents);
+		size_t data_length = size;
+
+		// first pass: get length in wchar_t units
+		size_t length = utf_decoder<wchar_counter>::decode_utf8_block(data, data_length, 0);
+
+		// allocate buffer of suitable length
+		char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+		if (!buffer) return false;
+
+		// second pass: convert utf8 input to wchar_t
+		wchar_writer::value_type obegin = reinterpret_cast<wchar_writer::value_type>(buffer);
+		wchar_writer::value_type oend = utf_decoder<wchar_writer>::decode_utf8_block(data, data_length, obegin);
+
+		assert(oend == obegin + length);
+		*oend = 0;
+
+		out_buffer = buffer;
+		out_length = length + 1;
+
+		return true;
+	}
+
+	template <typename opt_swap> PUGI__FN bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)
+	{
+		const uint16_t* data = static_cast<const uint16_t*>(contents);
+		size_t data_length = size / sizeof(uint16_t);
+
+		// first pass: get length in wchar_t units
+		size_t length = utf_decoder<wchar_counter, opt_swap>::decode_utf16_block(data, data_length, 0);
+
+		// allocate buffer of suitable length
+		char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+		if (!buffer) return false;
+
+		// second pass: convert utf16 input to wchar_t
+		wchar_writer::value_type obegin = reinterpret_cast<wchar_writer::value_type>(buffer);
+		wchar_writer::value_type oend = utf_decoder<wchar_writer, opt_swap>::decode_utf16_block(data, data_length, obegin);
+
+		assert(oend == obegin + length);
+		*oend = 0;
+
+		out_buffer = buffer;
+		out_length = length + 1;
+
+		return true;
+	}
+
+	template <typename opt_swap> PUGI__FN bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)
+	{
+		const uint32_t* data = static_cast<const uint32_t*>(contents);
+		size_t data_length = size / sizeof(uint32_t);
+
+		// first pass: get length in wchar_t units
+		size_t length = utf_decoder<wchar_counter, opt_swap>::decode_utf32_block(data, data_length, 0);
+
+		// allocate buffer of suitable length
+		char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+		if (!buffer) return false;
+
+		// second pass: convert utf32 input to wchar_t
+		wchar_writer::value_type obegin = reinterpret_cast<wchar_writer::value_type>(buffer);
+		wchar_writer::value_type oend = utf_decoder<wchar_writer, opt_swap>::decode_utf32_block(data, data_length, obegin);
+
+		assert(oend == obegin + length);
+		*oend = 0;
+
+		out_buffer = buffer;
+		out_length = length + 1;
+
+		return true;
+	}
+
+	PUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size)
+	{
+		const uint8_t* data = static_cast<const uint8_t*>(contents);
+		size_t data_length = size;
+
+		// get length in wchar_t units
+		size_t length = data_length;
+
+		// allocate buffer of suitable length
+		char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+		if (!buffer) return false;
+
+		// convert latin1 input to wchar_t
+		wchar_writer::value_type obegin = reinterpret_cast<wchar_writer::value_type>(buffer);
+		wchar_writer::value_type oend = utf_decoder<wchar_writer>::decode_latin1_block(data, data_length, obegin);
+
+		assert(oend == obegin + length);
+		*oend = 0;
+
+		out_buffer = buffer;
+		out_length = length + 1;
+
+		return true;
+	}
+
+	PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable)
+	{
+		// get native encoding
+		xml_encoding wchar_encoding = get_wchar_encoding();
+
+		// fast path: no conversion required
+		if (encoding == wchar_encoding) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable);
+
+		// only endian-swapping is required
+		if (need_endian_swap_utf(encoding, wchar_encoding)) return convert_buffer_endian_swap(out_buffer, out_length, contents, size, is_mutable);
+
+		// source encoding is utf8
+		if (encoding == encoding_utf8) return convert_buffer_utf8(out_buffer, out_length, contents, size);
+
+		// source encoding is utf16
+		if (encoding == encoding_utf16_be || encoding == encoding_utf16_le)
+		{
+			xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+			return (native_encoding == encoding) ?
+				convert_buffer_utf16(out_buffer, out_length, contents, size, opt_false()) :
+				convert_buffer_utf16(out_buffer, out_length, contents, size, opt_true());
+		}
+
+		// source encoding is utf32
+		if (encoding == encoding_utf32_be || encoding == encoding_utf32_le)
+		{
+			xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+			return (native_encoding == encoding) ?
+				convert_buffer_utf32(out_buffer, out_length, contents, size, opt_false()) :
+				convert_buffer_utf32(out_buffer, out_length, contents, size, opt_true());
+		}
+
+		// source encoding is latin1
+		if (encoding == encoding_latin1) return convert_buffer_latin1(out_buffer, out_length, contents, size);
+
+		assert(!"Invalid encoding");
+		return false;
+	}
+#else
+	template <typename opt_swap> PUGI__FN bool convert_buffer_utf16(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)
+	{
+		const uint16_t* data = static_cast<const uint16_t*>(contents);
+		size_t data_length = size / sizeof(uint16_t);
+
+		// first pass: get length in utf8 units
+		size_t length = utf_decoder<utf8_counter, opt_swap>::decode_utf16_block(data, data_length, 0);
+
+		// allocate buffer of suitable length
+		char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+		if (!buffer) return false;
+
+		// second pass: convert utf16 input to utf8
+		uint8_t* obegin = reinterpret_cast<uint8_t*>(buffer);
+		uint8_t* oend = utf_decoder<utf8_writer, opt_swap>::decode_utf16_block(data, data_length, obegin);
+
+		assert(oend == obegin + length);
+		*oend = 0;
+
+		out_buffer = buffer;
+		out_length = length + 1;
+
+		return true;
+	}
+
+	template <typename opt_swap> PUGI__FN bool convert_buffer_utf32(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, opt_swap)
+	{
+		const uint32_t* data = static_cast<const uint32_t*>(contents);
+		size_t data_length = size / sizeof(uint32_t);
+
+		// first pass: get length in utf8 units
+		size_t length = utf_decoder<utf8_counter, opt_swap>::decode_utf32_block(data, data_length, 0);
+
+		// allocate buffer of suitable length
+		char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+		if (!buffer) return false;
+
+		// second pass: convert utf32 input to utf8
+		uint8_t* obegin = reinterpret_cast<uint8_t*>(buffer);
+		uint8_t* oend = utf_decoder<utf8_writer, opt_swap>::decode_utf32_block(data, data_length, obegin);
+
+		assert(oend == obegin + length);
+		*oend = 0;
+
+		out_buffer = buffer;
+		out_length = length + 1;
+
+		return true;
+	}
+
+	PUGI__FN size_t get_latin1_7bit_prefix_length(const uint8_t* data, size_t size)
+	{
+		for (size_t i = 0; i < size; ++i)
+			if (data[i] > 127)
+				return i;
+
+		return size;
+	}
+
+	PUGI__FN bool convert_buffer_latin1(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)
+	{
+		const uint8_t* data = static_cast<const uint8_t*>(contents);
+		size_t data_length = size;
+
+		// get size of prefix that does not need utf8 conversion
+		size_t prefix_length = get_latin1_7bit_prefix_length(data, data_length);
+		assert(prefix_length <= data_length);
+
+		const uint8_t* postfix = data + prefix_length;
+		size_t postfix_length = data_length - prefix_length;
+
+		// if no conversion is needed, just return the original buffer
+		if (postfix_length == 0) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable);
+
+		// first pass: get length in utf8 units
+		size_t length = prefix_length + utf_decoder<utf8_counter>::decode_latin1_block(postfix, postfix_length, 0);
+
+		// allocate buffer of suitable length
+		char_t* buffer = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+		if (!buffer) return false;
+
+		// second pass: convert latin1 input to utf8
+		memcpy(buffer, data, prefix_length);
+
+		uint8_t* obegin = reinterpret_cast<uint8_t*>(buffer);
+		uint8_t* oend = utf_decoder<utf8_writer>::decode_latin1_block(postfix, postfix_length, obegin + prefix_length);
+
+		assert(oend == obegin + length);
+		*oend = 0;
+
+		out_buffer = buffer;
+		out_length = length + 1;
+
+		return true;
+	}
+
+	PUGI__FN bool convert_buffer(char_t*& out_buffer, size_t& out_length, xml_encoding encoding, const void* contents, size_t size, bool is_mutable)
+	{
+		// fast path: no conversion required
+		if (encoding == encoding_utf8) return get_mutable_buffer(out_buffer, out_length, contents, size, is_mutable);
+
+		// source encoding is utf16
+		if (encoding == encoding_utf16_be || encoding == encoding_utf16_le)
+		{
+			xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+			return (native_encoding == encoding) ?
+				convert_buffer_utf16(out_buffer, out_length, contents, size, opt_false()) :
+				convert_buffer_utf16(out_buffer, out_length, contents, size, opt_true());
+		}
+
+		// source encoding is utf32
+		if (encoding == encoding_utf32_be || encoding == encoding_utf32_le)
+		{
+			xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+			return (native_encoding == encoding) ?
+				convert_buffer_utf32(out_buffer, out_length, contents, size, opt_false()) :
+				convert_buffer_utf32(out_buffer, out_length, contents, size, opt_true());
+		}
+
+		// source encoding is latin1
+		if (encoding == encoding_latin1) return convert_buffer_latin1(out_buffer, out_length, contents, size, is_mutable);
+
+		assert(!"Invalid encoding");
+		return false;
+	}
+#endif
+
+	PUGI__FN size_t as_utf8_begin(const wchar_t* str, size_t length)
+	{
+		// get length in utf8 characters
+		return utf_decoder<utf8_counter>::decode_wchar_block(str, length, 0);
+	}
+
+	PUGI__FN void as_utf8_end(char* buffer, size_t size, const wchar_t* str, size_t length)
+	{
+		// convert to utf8
+		uint8_t* begin = reinterpret_cast<uint8_t*>(buffer);
+		uint8_t* end = utf_decoder<utf8_writer>::decode_wchar_block(str, length, begin);
+	
+		assert(begin + size == end);
+		(void)!end;
+
+		// zero-terminate
+		buffer[size] = 0;
+	}
+	
+#ifndef PUGIXML_NO_STL
+	PUGI__FN std::string as_utf8_impl(const wchar_t* str, size_t length)
+	{
+		// first pass: get length in utf8 characters
+		size_t size = as_utf8_begin(str, length);
+
+		// allocate resulting string
+		std::string result;
+		result.resize(size);
+
+		// second pass: convert to utf8
+		if (size > 0) as_utf8_end(&result[0], size, str, length);
+
+		return result;
+	}
+
+	PUGI__FN std::basic_string<wchar_t> as_wide_impl(const char* str, size_t size)
+	{
+		const uint8_t* data = reinterpret_cast<const uint8_t*>(str);
+
+		// first pass: get length in wchar_t units
+		size_t length = utf_decoder<wchar_counter>::decode_utf8_block(data, size, 0);
+
+		// allocate resulting string
+		std::basic_string<wchar_t> result;
+		result.resize(length);
+
+		// second pass: convert to wchar_t
+		if (length > 0)
+		{
+			wchar_writer::value_type begin = reinterpret_cast<wchar_writer::value_type>(&result[0]);
+			wchar_writer::value_type end = utf_decoder<wchar_writer>::decode_utf8_block(data, size, begin);
+
+			assert(begin + length == end);
+			(void)!end;
+		}
+
+		return result;
+	}
+#endif
+
+	inline bool strcpy_insitu_allow(size_t length, uintptr_t header, uintptr_t header_mask, char_t* target)
+	{
+		// never reuse shared memory
+		if (header & xml_memory_page_contents_shared_mask) return false;
+
+		size_t target_length = strlength(target);
+
+		// always reuse document buffer memory if possible
+		if ((header & header_mask) == 0) return target_length >= length;
+
+		// reuse heap memory if waste is not too great
+		const size_t reuse_threshold = 32;
+
+		return target_length >= length && (target_length < reuse_threshold || target_length - length < target_length / 2);
+	}
+
+	PUGI__FN bool strcpy_insitu(char_t*& dest, uintptr_t& header, uintptr_t header_mask, const char_t* source)
+	{
+		assert(header);
+
+		size_t source_length = strlength(source);
+
+		if (source_length == 0)
+		{
+			// empty string and null pointer are equivalent, so just deallocate old memory
+			xml_allocator* alloc = reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask)->allocator;
+
+			if (header & header_mask) alloc->deallocate_string(dest);
+			
+			// mark the string as not allocated
+			dest = 0;
+			header &= ~header_mask;
+
+			return true;
+		}
+		else if (dest && strcpy_insitu_allow(source_length, header, header_mask, dest))
+		{
+			// we can reuse old buffer, so just copy the new data (including zero terminator)
+			memcpy(dest, source, (source_length + 1) * sizeof(char_t));
+			
+			return true;
+		}
+		else
+		{
+			xml_allocator* alloc = reinterpret_cast<xml_memory_page*>(header & xml_memory_page_pointer_mask)->allocator;
+
+			// allocate new buffer
+			char_t* buf = alloc->allocate_string(source_length + 1);
+			if (!buf) return false;
+
+			// copy the string (including zero terminator)
+			memcpy(buf, source, (source_length + 1) * sizeof(char_t));
+
+			// deallocate old buffer (*after* the above to protect against overlapping memory and/or allocation failures)
+			if (header & header_mask) alloc->deallocate_string(dest);
+			
+			// the string is now allocated, so set the flag
+			dest = buf;
+			header |= header_mask;
+
+			return true;
+		}
+	}
+
+	struct gap
+	{
+		char_t* end;
+		size_t size;
+			
+		gap(): end(0), size(0)
+		{
+		}
+			
+		// Push new gap, move s count bytes further (skipping the gap).
+		// Collapse previous gap.
+		void push(char_t*& s, size_t count)
+		{
+			if (end) // there was a gap already; collapse it
+			{
+				// Move [old_gap_end, new_gap_start) to [old_gap_start, ...)
+				assert(s >= end);
+				memmove(end - size, end, reinterpret_cast<char*>(s) - reinterpret_cast<char*>(end));
+			}
+				
+			s += count; // end of current gap
+				
+			// "merge" two gaps
+			end = s;
+			size += count;
+		}
+			
+		// Collapse all gaps, return past-the-end pointer
+		char_t* flush(char_t* s)
+		{
+			if (end)
+			{
+				// Move [old_gap_end, current_pos) to [old_gap_start, ...)
+				assert(s >= end);
+				memmove(end - size, end, reinterpret_cast<char*>(s) - reinterpret_cast<char*>(end));
+
+				return s - size;
+			}
+			else return s;
+		}
+	};
+	
+	PUGI__FN char_t* strconv_escape(char_t* s, gap& g)
+	{
+		char_t* stre = s + 1;
+
+		switch (*stre)
+		{
+			case '#':	// &#...
+			{
+				unsigned int ucsc = 0;
+
+				if (stre[1] == 'x') // &#x... (hex code)
+				{
+					stre += 2;
+
+					char_t ch = *stre;
+
+					if (ch == ';') return stre;
+
+					for (;;)
+					{
+						if (static_cast<unsigned int>(ch - '0') <= 9)
+							ucsc = 16 * ucsc + (ch - '0');
+						else if (static_cast<unsigned int>((ch | ' ') - 'a') <= 5)
+							ucsc = 16 * ucsc + ((ch | ' ') - 'a' + 10);
+						else if (ch == ';')
+							break;
+						else // cancel
+							return stre;
+
+						ch = *++stre;
+					}
+					
+					++stre;
+				}
+				else	// &#... (dec code)
+				{
+					char_t ch = *++stre;
+
+					if (ch == ';') return stre;
+
+					for (;;)
+					{
+						if (static_cast<unsigned int>(static_cast<unsigned int>(ch) - '0') <= 9)
+							ucsc = 10 * ucsc + (ch - '0');
+						else if (ch == ';')
+							break;
+						else // cancel
+							return stre;
+
+						ch = *++stre;
+					}
+					
+					++stre;
+				}
+
+			#ifdef PUGIXML_WCHAR_MODE
+				s = reinterpret_cast<char_t*>(wchar_writer::any(reinterpret_cast<wchar_writer::value_type>(s), ucsc));
+			#else
+				s = reinterpret_cast<char_t*>(utf8_writer::any(reinterpret_cast<uint8_t*>(s), ucsc));
+			#endif
+					
+				g.push(s, stre - s);
+				return stre;
+			}
+
+			case 'a':	// &a
+			{
+				++stre;
+
+				if (*stre == 'm') // &am
+				{
+					if (*++stre == 'p' && *++stre == ';') // &
+					{
+						*s++ = '&';
+						++stre;
+							
+						g.push(s, stre - s);
+						return stre;
+					}
+				}
+				else if (*stre == 'p') // &ap
+				{
+					if (*++stre == 'o' && *++stre == 's' && *++stre == ';') // '
+					{
+						*s++ = '\'';
+						++stre;
+
+						g.push(s, stre - s);
+						return stre;
+					}
+				}
+				break;
+			}
+
+			case 'g': // &g
+			{
+				if (*++stre == 't' && *++stre == ';') // >
+				{
+					*s++ = '>';
+					++stre;
+					
+					g.push(s, stre - s);
+					return stre;
+				}
+				break;
+			}
+
+			case 'l': // &l
+			{
+				if (*++stre == 't' && *++stre == ';') // <
+				{
+					*s++ = '<';
+					++stre;
+						
+					g.push(s, stre - s);
+					return stre;
+				}
+				break;
+			}
+
+			case 'q': // &q
+			{
+				if (*++stre == 'u' && *++stre == 'o' && *++stre == 't' && *++stre == ';') // "
+				{
+					*s++ = '"';
+					++stre;
+					
+					g.push(s, stre - s);
+					return stre;
+				}
+				break;
+			}
+
+			default:
+				break;
+		}
+		
+		return stre;
+	}
+
+	// Parser utilities
+	#define PUGI__ENDSWITH(c, e)        ((c) == (e) || ((c) == 0 && endch == (e)))
+	#define PUGI__SKIPWS()              { while (PUGI__IS_CHARTYPE(*s, ct_space)) ++s; }
+	#define PUGI__OPTSET(OPT)           ( optmsk & (OPT) )
+	#define PUGI__PUSHNODE(TYPE)        { cursor = append_new_node(cursor, alloc, TYPE); if (!cursor) PUGI__THROW_ERROR(status_out_of_memory, s); }
+	#define PUGI__POPNODE()             { cursor = cursor->parent; }
+	#define PUGI__SCANFOR(X)            { while (*s != 0 && !(X)) ++s; }
+	#define PUGI__SCANWHILE(X)          { while (X) ++s; }
+	#define PUGI__SCANWHILE_UNROLL(X)   { for (;;) { char_t ss = s[0]; if (PUGI__UNLIKELY(!(X))) { break; } ss = s[1]; if (PUGI__UNLIKELY(!(X))) { s += 1; break; } ss = s[2]; if (PUGI__UNLIKELY(!(X))) { s += 2; break; } ss = s[3]; if (PUGI__UNLIKELY(!(X))) { s += 3; break; } s += 4; } }
+	#define PUGI__ENDSEG()              { ch = *s; *s = 0; ++s; }
+	#define PUGI__THROW_ERROR(err, m)   return error_offset = m, error_status = err, static_cast<char_t*>(0)
+	#define PUGI__CHECK_ERROR(err, m)   { if (*s == 0) PUGI__THROW_ERROR(err, m); }
+
+	PUGI__FN char_t* strconv_comment(char_t* s, char_t endch)
+	{
+		gap g;
+		
+		while (true)
+		{
+			PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_comment));
+		
+			if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
+			{
+				*s++ = '\n'; // replace first one with 0x0a
+				
+				if (*s == '\n') g.push(s, 1);
+			}
+			else if (s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>')) // comment ends here
+			{
+				*g.flush(s) = 0;
+				
+				return s + (s[2] == '>' ? 3 : 2);
+			}
+			else if (*s == 0)
+			{
+				return 0;
+			}
+			else ++s;
+		}
+	}
+
+	PUGI__FN char_t* strconv_cdata(char_t* s, char_t endch)
+	{
+		gap g;
+			
+		while (true)
+		{
+			PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_cdata));
+			
+			if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
+			{
+				*s++ = '\n'; // replace first one with 0x0a
+				
+				if (*s == '\n') g.push(s, 1);
+			}
+			else if (s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>')) // CDATA ends here
+			{
+				*g.flush(s) = 0;
+				
+				return s + 1;
+			}
+			else if (*s == 0)
+			{
+				return 0;
+			}
+			else ++s;
+		}
+	}
+	
+	typedef char_t* (*strconv_pcdata_t)(char_t*);
+		
+	template <typename opt_trim, typename opt_eol, typename opt_escape> struct strconv_pcdata_impl
+	{
+		static char_t* parse(char_t* s)
+		{
+			gap g;
+
+			char_t* begin = s;
+
+			while (true)
+			{
+				PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_pcdata));
+
+				if (*s == '<') // PCDATA ends here
+				{
+					char_t* end = g.flush(s);
+
+					if (opt_trim::value)
+						while (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space))
+							--end;
+
+					*end = 0;
+					
+					return s + 1;
+				}
+				else if (opt_eol::value && *s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
+				{
+					*s++ = '\n'; // replace first one with 0x0a
+					
+					if (*s == '\n') g.push(s, 1);
+				}
+				else if (opt_escape::value && *s == '&')
+				{
+					s = strconv_escape(s, g);
+				}
+				else if (*s == 0)
+				{
+					char_t* end = g.flush(s);
+
+					if (opt_trim::value)
+						while (end > begin && PUGI__IS_CHARTYPE(end[-1], ct_space))
+							--end;
+
+					*end = 0;
+
+					return s;
+				}
+				else ++s;
+			}
+		}
+	};
+	
+	PUGI__FN strconv_pcdata_t get_strconv_pcdata(unsigned int optmask)
+	{
+		PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_trim_pcdata == 0x0800);
+
+		switch (((optmask >> 4) & 3) | ((optmask >> 9) & 4)) // get bitmask for flags (eol escapes trim)
+		{
+		case 0: return strconv_pcdata_impl<opt_false, opt_false, opt_false>::parse;
+		case 1: return strconv_pcdata_impl<opt_false, opt_false, opt_true>::parse;
+		case 2: return strconv_pcdata_impl<opt_false, opt_true, opt_false>::parse;
+		case 3: return strconv_pcdata_impl<opt_false, opt_true, opt_true>::parse;
+		case 4: return strconv_pcdata_impl<opt_true, opt_false, opt_false>::parse;
+		case 5: return strconv_pcdata_impl<opt_true, opt_false, opt_true>::parse;
+		case 6: return strconv_pcdata_impl<opt_true, opt_true, opt_false>::parse;
+		case 7: return strconv_pcdata_impl<opt_true, opt_true, opt_true>::parse;
+		default: assert(false); return 0; // should not get here
+		}
+	}
+
+	typedef char_t* (*strconv_attribute_t)(char_t*, char_t);
+	
+	template <typename opt_escape> struct strconv_attribute_impl
+	{
+		static char_t* parse_wnorm(char_t* s, char_t end_quote)
+		{
+			gap g;
+
+			// trim leading whitespaces
+			if (PUGI__IS_CHARTYPE(*s, ct_space))
+			{
+				char_t* str = s;
+				
+				do ++str;
+				while (PUGI__IS_CHARTYPE(*str, ct_space));
+				
+				g.push(s, str - s);
+			}
+
+			while (true)
+			{
+				PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws | ct_space));
+				
+				if (*s == end_quote)
+				{
+					char_t* str = g.flush(s);
+					
+					do *str-- = 0;
+					while (PUGI__IS_CHARTYPE(*str, ct_space));
+				
+					return s + 1;
+				}
+				else if (PUGI__IS_CHARTYPE(*s, ct_space))
+				{
+					*s++ = ' ';
+		
+					if (PUGI__IS_CHARTYPE(*s, ct_space))
+					{
+						char_t* str = s + 1;
+						while (PUGI__IS_CHARTYPE(*str, ct_space)) ++str;
+						
+						g.push(s, str - s);
+					}
+				}
+				else if (opt_escape::value && *s == '&')
+				{
+					s = strconv_escape(s, g);
+				}
+				else if (!*s)
+				{
+					return 0;
+				}
+				else ++s;
+			}
+		}
+
+		static char_t* parse_wconv(char_t* s, char_t end_quote)
+		{
+			gap g;
+
+			while (true)
+			{
+				PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr_ws));
+				
+				if (*s == end_quote)
+				{
+					*g.flush(s) = 0;
+				
+					return s + 1;
+				}
+				else if (PUGI__IS_CHARTYPE(*s, ct_space))
+				{
+					if (*s == '\r')
+					{
+						*s++ = ' ';
+				
+						if (*s == '\n') g.push(s, 1);
+					}
+					else *s++ = ' ';
+				}
+				else if (opt_escape::value && *s == '&')
+				{
+					s = strconv_escape(s, g);
+				}
+				else if (!*s)
+				{
+					return 0;
+				}
+				else ++s;
+			}
+		}
+
+		static char_t* parse_eol(char_t* s, char_t end_quote)
+		{
+			gap g;
+
+			while (true)
+			{
+				PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr));
+				
+				if (*s == end_quote)
+				{
+					*g.flush(s) = 0;
+				
+					return s + 1;
+				}
+				else if (*s == '\r')
+				{
+					*s++ = '\n';
+					
+					if (*s == '\n') g.push(s, 1);
+				}
+				else if (opt_escape::value && *s == '&')
+				{
+					s = strconv_escape(s, g);
+				}
+				else if (!*s)
+				{
+					return 0;
+				}
+				else ++s;
+			}
+		}
+
+		static char_t* parse_simple(char_t* s, char_t end_quote)
+		{
+			gap g;
+
+			while (true)
+			{
+				PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPE(ss, ct_parse_attr));
+				
+				if (*s == end_quote)
+				{
+					*g.flush(s) = 0;
+				
+					return s + 1;
+				}
+				else if (opt_escape::value && *s == '&')
+				{
+					s = strconv_escape(s, g);
+				}
+				else if (!*s)
+				{
+					return 0;
+				}
+				else ++s;
+			}
+		}
+	};
+
+	PUGI__FN strconv_attribute_t get_strconv_attribute(unsigned int optmask)
+	{
+		PUGI__STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_wconv_attribute == 0x40 && parse_wnorm_attribute == 0x80);
+		
+		switch ((optmask >> 4) & 15) // get bitmask for flags (wconv wnorm eol escapes)
+		{
+		case 0:  return strconv_attribute_impl<opt_false>::parse_simple;
+		case 1:  return strconv_attribute_impl<opt_true>::parse_simple;
+		case 2:  return strconv_attribute_impl<opt_false>::parse_eol;
+		case 3:  return strconv_attribute_impl<opt_true>::parse_eol;
+		case 4:  return strconv_attribute_impl<opt_false>::parse_wconv;
+		case 5:  return strconv_attribute_impl<opt_true>::parse_wconv;
+		case 6:  return strconv_attribute_impl<opt_false>::parse_wconv;
+		case 7:  return strconv_attribute_impl<opt_true>::parse_wconv;
+		case 8:  return strconv_attribute_impl<opt_false>::parse_wnorm;
+		case 9:  return strconv_attribute_impl<opt_true>::parse_wnorm;
+		case 10: return strconv_attribute_impl<opt_false>::parse_wnorm;
+		case 11: return strconv_attribute_impl<opt_true>::parse_wnorm;
+		case 12: return strconv_attribute_impl<opt_false>::parse_wnorm;
+		case 13: return strconv_attribute_impl<opt_true>::parse_wnorm;
+		case 14: return strconv_attribute_impl<opt_false>::parse_wnorm;
+		case 15: return strconv_attribute_impl<opt_true>::parse_wnorm;
+		default: assert(false); return 0; // should not get here
+		}
+	}
+
+	inline xml_parse_result make_parse_result(xml_parse_status status, ptrdiff_t offset = 0)
+	{
+		xml_parse_result result;
+		result.status = status;
+		result.offset = offset;
+
+		return result;
+	}
+
+	struct xml_parser
+	{
+		xml_allocator alloc;
+		char_t* error_offset;
+		xml_parse_status error_status;
+		
+		xml_parser(const xml_allocator& alloc_): alloc(alloc_), error_offset(0), error_status(status_ok)
+		{
+		}
+
+		// DOCTYPE consists of nested sections of the following possible types:
+		// <!-- ... -->, <? ... ?>, "...", '...'
+		// <![...]]>
+		// <!...>
+		// First group can not contain nested groups
+		// Second group can contain nested groups of the same type
+		// Third group can contain all other groups
+		char_t* parse_doctype_primitive(char_t* s)
+		{
+			if (*s == '"' || *s == '\'')
+			{
+				// quoted string
+				char_t ch = *s++;
+				PUGI__SCANFOR(*s == ch);
+				if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);
+
+				s++;
+			}
+			else if (s[0] == '<' && s[1] == '?')
+			{
+				// <? ... ?>
+				s += 2;
+				PUGI__SCANFOR(s[0] == '?' && s[1] == '>'); // no need for ENDSWITH because ?> can't terminate proper doctype
+				if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);
+
+				s += 2;
+			}
+			else if (s[0] == '<' && s[1] == '!' && s[2] == '-' && s[3] == '-')
+			{
+				s += 4;
+				PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && s[2] == '>'); // no need for ENDSWITH because --> can't terminate proper doctype
+				if (!*s) PUGI__THROW_ERROR(status_bad_doctype, s);
+
+				s += 4;
+			}
+			else PUGI__THROW_ERROR(status_bad_doctype, s);
+
+			return s;
+		}
+
+		char_t* parse_doctype_ignore(char_t* s)
+		{
+			size_t depth = 0;
+
+			assert(s[0] == '<' && s[1] == '!' && s[2] == '[');
+			s += 3;
+
+			while (*s)
+			{
+				if (s[0] == '<' && s[1] == '!' && s[2] == '[')
+				{
+					// nested ignore section
+					s += 3;
+					depth++;
+				}
+				else if (s[0] == ']' && s[1] == ']' && s[2] == '>')
+				{
+					// ignore section end
+					s += 3;
+
+					if (depth == 0)
+						return s;
+
+					depth--;
+				}
+				else s++;
+			}
+
+			PUGI__THROW_ERROR(status_bad_doctype, s);
+		}
+
+		char_t* parse_doctype_group(char_t* s, char_t endch)
+		{
+			size_t depth = 0;
+
+			assert((s[0] == '<' || s[0] == 0) && s[1] == '!');
+			s += 2;
+
+			while (*s)
+			{
+				if (s[0] == '<' && s[1] == '!' && s[2] != '-')
+				{
+					if (s[2] == '[')
+					{
+						// ignore
+						s = parse_doctype_ignore(s);
+						if (!s) return s;
+					}
+					else
+					{
+						// some control group
+						s += 2;
+						depth++;
+					}
+				}
+				else if (s[0] == '<' || s[0] == '"' || s[0] == '\'')
+				{
+					// unknown tag (forbidden), or some primitive group
+					s = parse_doctype_primitive(s);
+					if (!s) return s;
+				}
+				else if (*s == '>')
+				{
+					if (depth == 0)
+						return s;
+
+					depth--;
+					s++;
+				}
+				else s++;
+			}
+
+			if (depth != 0 || endch != '>') PUGI__THROW_ERROR(status_bad_doctype, s);
+
+			return s;
+		}
+
+		char_t* parse_exclamation(char_t* s, xml_node_struct* cursor, unsigned int optmsk, char_t endch)
+		{
+			// parse node contents, starting with exclamation mark
+			++s;
+
+			if (*s == '-') // '<!-...'
+			{
+				++s;
+
+				if (*s == '-') // '<!--...'
+				{
+					++s;
+
+					if (PUGI__OPTSET(parse_comments))
+					{
+						PUGI__PUSHNODE(node_comment); // Append a new node on the tree.
+						cursor->value = s; // Save the offset.
+					}
+
+					if (PUGI__OPTSET(parse_eol) && PUGI__OPTSET(parse_comments))
+					{
+						s = strconv_comment(s, endch);
+
+						if (!s) PUGI__THROW_ERROR(status_bad_comment, cursor->value);
+					}
+					else
+					{
+						// Scan for terminating '-->'.
+						PUGI__SCANFOR(s[0] == '-' && s[1] == '-' && PUGI__ENDSWITH(s[2], '>'));
+						PUGI__CHECK_ERROR(status_bad_comment, s);
+
+						if (PUGI__OPTSET(parse_comments))
+							*s = 0; // Zero-terminate this segment at the first terminating '-'.
+
+						s += (s[2] == '>' ? 3 : 2); // Step over the '\0->'.
+					}
+				}
+				else PUGI__THROW_ERROR(status_bad_comment, s);
+			}
+			else if (*s == '[')
+			{
+				// '<![CDATA[...'
+				if (*++s=='C' && *++s=='D' && *++s=='A' && *++s=='T' && *++s=='A' && *++s == '[')
+				{
+					++s;
+
+					if (PUGI__OPTSET(parse_cdata))
+					{
+						PUGI__PUSHNODE(node_cdata); // Append a new node on the tree.
+						cursor->value = s; // Save the offset.
+
+						if (PUGI__OPTSET(parse_eol))
+						{
+							s = strconv_cdata(s, endch);
+
+							if (!s) PUGI__THROW_ERROR(status_bad_cdata, cursor->value);
+						}
+						else
+						{
+							// Scan for terminating ']]>'.
+							PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>'));
+							PUGI__CHECK_ERROR(status_bad_cdata, s);
+
+							*s++ = 0; // Zero-terminate this segment.
+						}
+					}
+					else // Flagged for discard, but we still have to scan for the terminator.
+					{
+						// Scan for terminating ']]>'.
+						PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>'));
+						PUGI__CHECK_ERROR(status_bad_cdata, s);
+
+						++s;
+					}
+
+					s += (s[1] == '>' ? 2 : 1); // Step over the last ']>'.
+				}
+				else PUGI__THROW_ERROR(status_bad_cdata, s);
+			}
+			else if (s[0] == 'D' && s[1] == 'O' && s[2] == 'C' && s[3] == 'T' && s[4] == 'Y' && s[5] == 'P' && PUGI__ENDSWITH(s[6], 'E'))
+			{
+				s -= 2;
+
+				if (cursor->parent) PUGI__THROW_ERROR(status_bad_doctype, s);
+
+				char_t* mark = s + 9;
+
+				s = parse_doctype_group(s, endch);
+				if (!s) return s;
+
+				assert((*s == 0 && endch == '>') || *s == '>');
+				if (*s) *s++ = 0;
+
+				if (PUGI__OPTSET(parse_doctype))
+				{
+					while (PUGI__IS_CHARTYPE(*mark, ct_space)) ++mark;
+
+					PUGI__PUSHNODE(node_doctype);
+
+					cursor->value = mark;
+				}
+			}
+			else if (*s == 0 && endch == '-') PUGI__THROW_ERROR(status_bad_comment, s);
+			else if (*s == 0 && endch == '[') PUGI__THROW_ERROR(status_bad_cdata, s);
+			else PUGI__THROW_ERROR(status_unrecognized_tag, s);
+
+			return s;
+		}
+
+		char_t* parse_question(char_t* s, xml_node_struct*& ref_cursor, unsigned int optmsk, char_t endch)
+		{
+			// load into registers
+			xml_node_struct* cursor = ref_cursor;
+			char_t ch = 0;
+
+			// parse node contents, starting with question mark
+			++s;
+
+			// read PI target
+			char_t* target = s;
+
+			if (!PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_pi, s);
+
+			PUGI__SCANWHILE(PUGI__IS_CHARTYPE(*s, ct_symbol));
+			PUGI__CHECK_ERROR(status_bad_pi, s);
+
+			// determine node type; stricmp / strcasecmp is not portable
+			bool declaration = (target[0] | ' ') == 'x' && (target[1] | ' ') == 'm' && (target[2] | ' ') == 'l' && target + 3 == s;
+
+			if (declaration ? PUGI__OPTSET(parse_declaration) : PUGI__OPTSET(parse_pi))
+			{
+				if (declaration)
+				{
+					// disallow non top-level declarations
+					if (cursor->parent) PUGI__THROW_ERROR(status_bad_pi, s);
+
+					PUGI__PUSHNODE(node_declaration);
+				}
+				else
+				{
+					PUGI__PUSHNODE(node_pi);
+				}
+
+				cursor->name = target;
+
+				PUGI__ENDSEG();
+
+				// parse value/attributes
+				if (ch == '?')
+				{
+					// empty node
+					if (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_pi, s);
+					s += (*s == '>');
+
+					PUGI__POPNODE();
+				}
+				else if (PUGI__IS_CHARTYPE(ch, ct_space))
+				{
+					PUGI__SKIPWS();
+
+					// scan for tag end
+					char_t* value = s;
+
+					PUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>'));
+					PUGI__CHECK_ERROR(status_bad_pi, s);
+
+					if (declaration)
+					{
+						// replace ending ? with / so that 'element' terminates properly
+						*s = '/';
+
+						// we exit from this function with cursor at node_declaration, which is a signal to parse() to go to LOC_ATTRIBUTES
+						s = value;
+					}
+					else
+					{
+						// store value and step over >
+						cursor->value = value;
+						PUGI__POPNODE();
+
+						PUGI__ENDSEG();
+
+						s += (*s == '>');
+					}
+				}
+				else PUGI__THROW_ERROR(status_bad_pi, s);
+			}
+			else
+			{
+				// scan for tag end
+				PUGI__SCANFOR(s[0] == '?' && PUGI__ENDSWITH(s[1], '>'));
+				PUGI__CHECK_ERROR(status_bad_pi, s);
+
+				s += (s[1] == '>' ? 2 : 1);
+			}
+
+			// store from registers
+			ref_cursor = cursor;
+
+			return s;
+		}
+
+		char_t* parse_tree(char_t* s, xml_node_struct* root, unsigned int optmsk, char_t endch)
+		{
+			strconv_attribute_t strconv_attribute = get_strconv_attribute(optmsk);
+			strconv_pcdata_t strconv_pcdata = get_strconv_pcdata(optmsk);
+			
+			char_t ch = 0;
+			xml_node_struct* cursor = root;
+			char_t* mark = s;
+
+			while (*s != 0)
+			{
+				if (*s == '<')
+				{
+					++s;
+
+				LOC_TAG:
+					if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // '<#...'
+					{
+						PUGI__PUSHNODE(node_element); // Append a new node to the tree.
+
+						cursor->name = s;
+
+						PUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator.
+						PUGI__ENDSEG(); // Save char in 'ch', terminate & step over.
+
+						if (ch == '>')
+						{
+							// end of tag
+						}
+						else if (PUGI__IS_CHARTYPE(ch, ct_space))
+						{
+						LOC_ATTRIBUTES:
+							while (true)
+							{
+								PUGI__SKIPWS(); // Eat any whitespace.
+						
+								if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) // <... #...
+								{
+									xml_attribute_struct* a = append_new_attribute(cursor, alloc); // Make space for this attribute.
+									if (!a) PUGI__THROW_ERROR(status_out_of_memory, s);
+
+									a->name = s; // Save the offset.
+
+									PUGI__SCANWHILE_UNROLL(PUGI__IS_CHARTYPE(ss, ct_symbol)); // Scan for a terminator.
+									PUGI__ENDSEG(); // Save char in 'ch', terminate & step over.
+
+									if (PUGI__IS_CHARTYPE(ch, ct_space))
+									{
+										PUGI__SKIPWS(); // Eat any whitespace.
+
+										ch = *s;
+										++s;
+									}
+									
+									if (ch == '=') // '<... #=...'
+									{
+										PUGI__SKIPWS(); // Eat any whitespace.
+
+										if (*s == '"' || *s == '\'') // '<... #="...'
+										{
+											ch = *s; // Save quote char to avoid breaking on "''" -or- '""'.
+											++s; // Step over the quote.
+											a->value = s; // Save the offset.
+
+											s = strconv_attribute(s, ch);
+										
+											if (!s) PUGI__THROW_ERROR(status_bad_attribute, a->value);
+
+											// After this line the loop continues from the start;
+											// Whitespaces, / and > are ok, symbols and EOF are wrong,
+											// everything else will be detected
+											if (PUGI__IS_CHARTYPE(*s, ct_start_symbol)) PUGI__THROW_ERROR(status_bad_attribute, s);
+										}
+										else PUGI__THROW_ERROR(status_bad_attribute, s);
+									}
+									else PUGI__THROW_ERROR(status_bad_attribute, s);
+								}
+								else if (*s == '/')
+								{
+									++s;
+									
+									if (*s == '>')
+									{
+										PUGI__POPNODE();
+										s++;
+										break;
+									}
+									else if (*s == 0 && endch == '>')
+									{
+										PUGI__POPNODE();
+										break;
+									}
+									else PUGI__THROW_ERROR(status_bad_start_element, s);
+								}
+								else if (*s == '>')
+								{
+									++s;
+
+									break;
+								}
+								else if (*s == 0 && endch == '>')
+								{
+									break;
+								}
+								else PUGI__THROW_ERROR(status_bad_start_element, s);
+							}
+
+							// !!!
+						}
+						else if (ch == '/') // '<#.../'
+						{
+							if (!PUGI__ENDSWITH(*s, '>')) PUGI__THROW_ERROR(status_bad_start_element, s);
+
+							PUGI__POPNODE(); // Pop.
+
+							s += (*s == '>');
+						}
+						else if (ch == 0)
+						{
+							// we stepped over null terminator, backtrack & handle closing tag
+							--s;
+							
+							if (endch != '>') PUGI__THROW_ERROR(status_bad_start_element, s);
+						}
+						else PUGI__THROW_ERROR(status_bad_start_element, s);
+					}
+					else if (*s == '/')
+					{
+						++s;
+
+						char_t* name = cursor->name;
+						if (!name) PUGI__THROW_ERROR(status_end_element_mismatch, s);
+						
+						while (PUGI__IS_CHARTYPE(*s, ct_symbol))
+						{
+							if (*s++ != *name++) PUGI__THROW_ERROR(status_end_element_mismatch, s);
+						}
+
+						if (*name)
+						{
+							if (*s == 0 && name[0] == endch && name[1] == 0) PUGI__THROW_ERROR(status_bad_end_element, s);
+							else PUGI__THROW_ERROR(status_end_element_mismatch, s);
+						}
+							
+						PUGI__POPNODE(); // Pop.
+
+						PUGI__SKIPWS();
+
+						if (*s == 0)
+						{
+							if (endch != '>') PUGI__THROW_ERROR(status_bad_end_element, s);
+						}
+						else
+						{
+							if (*s != '>') PUGI__THROW_ERROR(status_bad_end_element, s);
+							++s;
+						}
+					}
+					else if (*s == '?') // '<?...'
+					{
+						s = parse_question(s, cursor, optmsk, endch);
+						if (!s) return s;
+
+						assert(cursor);
+						if (PUGI__NODETYPE(cursor) == node_declaration) goto LOC_ATTRIBUTES;
+					}
+					else if (*s == '!') // '<!...'
+					{
+						s = parse_exclamation(s, cursor, optmsk, endch);
+						if (!s) return s;
+					}
+					else if (*s == 0 && endch == '?') PUGI__THROW_ERROR(status_bad_pi, s);
+					else PUGI__THROW_ERROR(status_unrecognized_tag, s);
+				}
+				else
+				{
+					mark = s; // Save this offset while searching for a terminator.
+
+					PUGI__SKIPWS(); // Eat whitespace if no genuine PCDATA here.
+
+					if (*s == '<' || !*s)
+					{
+						// We skipped some whitespace characters because otherwise we would take the tag branch instead of PCDATA one
+						assert(mark != s);
+
+						if (!PUGI__OPTSET(parse_ws_pcdata | parse_ws_pcdata_single) || PUGI__OPTSET(parse_trim_pcdata))
+						{
+							continue;
+						}
+						else if (PUGI__OPTSET(parse_ws_pcdata_single))
+						{
+							if (s[0] != '<' || s[1] != '/' || cursor->first_child) continue;
+						}
+					}
+
+					if (!PUGI__OPTSET(parse_trim_pcdata))
+						s = mark;
+							
+					if (cursor->parent || PUGI__OPTSET(parse_fragment))
+					{
+						PUGI__PUSHNODE(node_pcdata); // Append a new node on the tree.
+						cursor->value = s; // Save the offset.
+
+						s = strconv_pcdata(s);
+								
+						PUGI__POPNODE(); // Pop since this is a standalone.
+						
+						if (!*s) break;
+					}
+					else
+					{
+						PUGI__SCANFOR(*s == '<'); // '...<'
+						if (!*s) break;
+						
+						++s;
+					}
+
+					// We're after '<'
+					goto LOC_TAG;
+				}
+			}
+
+			// check that last tag is closed
+			if (cursor != root) PUGI__THROW_ERROR(status_end_element_mismatch, s);
+
+			return s;
+		}
+
+	#ifdef PUGIXML_WCHAR_MODE
+		static char_t* parse_skip_bom(char_t* s)
+		{
+			unsigned int bom = 0xfeff;
+			return (s[0] == static_cast<wchar_t>(bom)) ? s + 1 : s;
+		}
+	#else
+		static char_t* parse_skip_bom(char_t* s)
+		{
+			return (s[0] == '\xef' && s[1] == '\xbb' && s[2] == '\xbf') ? s + 3 : s;
+		}
+	#endif
+
+		static bool has_element_node_siblings(xml_node_struct* node)
+		{
+			while (node)
+			{
+				if (PUGI__NODETYPE(node) == node_element) return true;
+
+				node = node->next_sibling;
+			}
+
+			return false;
+		}
+
+		static xml_parse_result parse(char_t* buffer, size_t length, xml_document_struct* xmldoc, xml_node_struct* root, unsigned int optmsk)
+		{
+			// allocator object is a part of document object
+			xml_allocator& alloc_ = *static_cast<xml_allocator*>(xmldoc);
+
+			// early-out for empty documents
+			if (length == 0)
+				return make_parse_result(PUGI__OPTSET(parse_fragment) ? status_ok : status_no_document_element);
+
+			// get last child of the root before parsing
+			xml_node_struct* last_root_child = root->first_child ? root->first_child->prev_sibling_c : 0;
+	
+			// create parser on stack
+			xml_parser parser(alloc_);
+
+			// save last character and make buffer zero-terminated (speeds up parsing)
+			char_t endch = buffer[length - 1];
+			buffer[length - 1] = 0;
+			
+			// skip BOM to make sure it does not end up as part of parse output
+			char_t* buffer_data = parse_skip_bom(buffer);
+
+			// perform actual parsing
+			parser.parse_tree(buffer_data, root, optmsk, endch);
+
+			// update allocator state
+			alloc_ = parser.alloc;
+
+			xml_parse_result result = make_parse_result(parser.error_status, parser.error_offset ? parser.error_offset - buffer : 0);
+			assert(result.offset >= 0 && static_cast<size_t>(result.offset) <= length);
+
+			if (result)
+			{
+				// since we removed last character, we have to handle the only possible false positive (stray <)
+				if (endch == '<')
+					return make_parse_result(status_unrecognized_tag, length - 1);
+
+				// check if there are any element nodes parsed
+				xml_node_struct* first_root_child_parsed = last_root_child ? last_root_child->next_sibling : root->first_child;
+
+				if (!PUGI__OPTSET(parse_fragment) && !has_element_node_siblings(first_root_child_parsed))
+					return make_parse_result(status_no_document_element, length - 1);
+			}
+			else
+			{
+				// roll back offset if it occurs on a null terminator in the source buffer
+				if (result.offset > 0 && static_cast<size_t>(result.offset) == length - 1 && endch == 0)
+					result.offset--;
+			}
+
+			return result;
+		}
+	};
+
+	// Output facilities
+	PUGI__FN xml_encoding get_write_native_encoding()
+	{
+	#ifdef PUGIXML_WCHAR_MODE
+		return get_wchar_encoding();
+	#else
+		return encoding_utf8;
+	#endif
+	}
+
+	PUGI__FN xml_encoding get_write_encoding(xml_encoding encoding)
+	{
+		// replace wchar encoding with utf implementation
+		if (encoding == encoding_wchar) return get_wchar_encoding();
+
+		// replace utf16 encoding with utf16 with specific endianness
+		if (encoding == encoding_utf16) return is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+		// replace utf32 encoding with utf32 with specific endianness
+		if (encoding == encoding_utf32) return is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+		// only do autodetection if no explicit encoding is requested
+		if (encoding != encoding_auto) return encoding;
+
+		// assume utf8 encoding
+		return encoding_utf8;
+	}
+
+#ifdef PUGIXML_WCHAR_MODE
+	PUGI__FN size_t get_valid_length(const char_t* data, size_t length)
+	{
+		if (length < 1) return 0;
+
+		// discard last character if it's the lead of a surrogate pair 
+		return (sizeof(wchar_t) == 2 && static_cast<unsigned int>(static_cast<uint16_t>(data[length - 1]) - 0xD800) < 0x400) ? length - 1 : length;
+	}
+
+	PUGI__FN size_t convert_buffer_output(char_t* r_char, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding)
+	{
+		// only endian-swapping is required
+		if (need_endian_swap_utf(encoding, get_wchar_encoding()))
+		{
+			convert_wchar_endian_swap(r_char, data, length);
+
+			return length * sizeof(char_t);
+		}
+	
+		// convert to utf8
+		if (encoding == encoding_utf8)
+		{
+			uint8_t* dest = r_u8;
+			uint8_t* end = utf_decoder<utf8_writer>::decode_wchar_block(data, length, dest);
+
+			return static_cast<size_t>(end - dest);
+		}
+
+		// convert to utf16
+		if (encoding == encoding_utf16_be || encoding == encoding_utf16_le)
+		{
+			uint16_t* dest = r_u16;
+
+			// convert to native utf16
+			uint16_t* end = utf_decoder<utf16_writer>::decode_wchar_block(data, length, dest);
+
+			// swap if necessary
+			xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+			if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast<size_t>(end - dest));
+
+			return static_cast<size_t>(end - dest) * sizeof(uint16_t);
+		}
+
+		// convert to utf32
+		if (encoding == encoding_utf32_be || encoding == encoding_utf32_le)
+		{
+			uint32_t* dest = r_u32;
+
+			// convert to native utf32
+			uint32_t* end = utf_decoder<utf32_writer>::decode_wchar_block(data, length, dest);
+
+			// swap if necessary
+			xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+			if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast<size_t>(end - dest));
+
+			return static_cast<size_t>(end - dest) * sizeof(uint32_t);
+		}
+
+		// convert to latin1
+		if (encoding == encoding_latin1)
+		{
+			uint8_t* dest = r_u8;
+			uint8_t* end = utf_decoder<latin1_writer>::decode_wchar_block(data, length, dest);
+
+			return static_cast<size_t>(end - dest);
+		}
+
+		assert(!"Invalid encoding");
+		return 0;
+	}
+#else
+	PUGI__FN size_t get_valid_length(const char_t* data, size_t length)
+	{
+		if (length < 5) return 0;
+
+		for (size_t i = 1; i <= 4; ++i)
+		{
+			uint8_t ch = static_cast<uint8_t>(data[length - i]);
+
+			// either a standalone character or a leading one
+			if ((ch & 0xc0) != 0x80) return length - i;
+		}
+
+		// there are four non-leading characters at the end, sequence tail is broken so might as well process the whole chunk
+		return length;
+	}
+
+	PUGI__FN size_t convert_buffer_output(char_t* /* r_char */, uint8_t* r_u8, uint16_t* r_u16, uint32_t* r_u32, const char_t* data, size_t length, xml_encoding encoding)
+	{
+		if (encoding == encoding_utf16_be || encoding == encoding_utf16_le)
+		{
+			uint16_t* dest = r_u16;
+
+			// convert to native utf16
+			uint16_t* end = utf_decoder<utf16_writer>::decode_utf8_block(reinterpret_cast<const uint8_t*>(data), length, dest);
+
+			// swap if necessary
+			xml_encoding native_encoding = is_little_endian() ? encoding_utf16_le : encoding_utf16_be;
+
+			if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast<size_t>(end - dest));
+
+			return static_cast<size_t>(end - dest) * sizeof(uint16_t);
+		}
+
+		if (encoding == encoding_utf32_be || encoding == encoding_utf32_le)
+		{
+			uint32_t* dest = r_u32;
+
+			// convert to native utf32
+			uint32_t* end = utf_decoder<utf32_writer>::decode_utf8_block(reinterpret_cast<const uint8_t*>(data), length, dest);
+
+			// swap if necessary
+			xml_encoding native_encoding = is_little_endian() ? encoding_utf32_le : encoding_utf32_be;
+
+			if (native_encoding != encoding) convert_utf_endian_swap(dest, dest, static_cast<size_t>(end - dest));
+
+			return static_cast<size_t>(end - dest) * sizeof(uint32_t);
+		}
+
+		if (encoding == encoding_latin1)
+		{
+			uint8_t* dest = r_u8;
+			uint8_t* end = utf_decoder<latin1_writer>::decode_utf8_block(reinterpret_cast<const uint8_t*>(data), length, dest);
+
+			return static_cast<size_t>(end - dest);
+		}
+
+		assert(!"Invalid encoding");
+		return 0;
+	}
+#endif
+
+	class xml_buffered_writer
+	{
+		xml_buffered_writer(const xml_buffered_writer&);
+		xml_buffered_writer& operator=(const xml_buffered_writer&);
+
+	public:
+		xml_buffered_writer(xml_writer& writer_, xml_encoding user_encoding): writer(writer_), bufsize(0), encoding(get_write_encoding(user_encoding))
+		{
+			PUGI__STATIC_ASSERT(bufcapacity >= 8);
+		}
+
+		~xml_buffered_writer()
+		{
+			flush();
+		}
+
+		size_t flush()
+		{
+			flush(buffer, bufsize);
+			bufsize = 0;
+			return 0;
+		}
+
+		void flush(const char_t* data, size_t size)
+		{
+			if (size == 0) return;
+
+			// fast path, just write data
+			if (encoding == get_write_native_encoding())
+				writer.write(data, size * sizeof(char_t));
+			else
+			{
+				// convert chunk
+				size_t result = convert_buffer_output(scratch.data_char, scratch.data_u8, scratch.data_u16, scratch.data_u32, data, size, encoding);
+				assert(result <= sizeof(scratch));
+
+				// write data
+				writer.write(scratch.data_u8, result);
+			}
+		}
+
+		void write_direct(const char_t* data, size_t length)
+		{
+			// flush the remaining buffer contents
+			flush();
+
+			// handle large chunks
+			if (length > bufcapacity)
+			{
+				if (encoding == get_write_native_encoding())
+				{
+					// fast path, can just write data chunk
+					writer.write(data, length * sizeof(char_t));
+					return;
+				}
+
+				// need to convert in suitable chunks
+				while (length > bufcapacity)
+				{
+					// get chunk size by selecting such number of characters that are guaranteed to fit into scratch buffer
+					// and form a complete codepoint sequence (i.e. discard start of last codepoint if necessary)
+					size_t chunk_size = get_valid_length(data, bufcapacity);
+					assert(chunk_size);
+
+					// convert chunk and write
+					flush(data, chunk_size);
+
+					// iterate
+					data += chunk_size;
+					length -= chunk_size;
+				}
+
+				// small tail is copied below
+				bufsize = 0;
+			}
+
+			memcpy(buffer + bufsize, data, length * sizeof(char_t));
+			bufsize += length;
+		}
+
+		void write_buffer(const char_t* data, size_t length)
+		{
+			size_t offset = bufsize;
+
+			if (offset + length <= bufcapacity)
+			{
+				memcpy(buffer + offset, data, length * sizeof(char_t));
+				bufsize = offset + length;
+			}
+			else
+			{
+				write_direct(data, length);
+			}
+		}
+
+		void write_string(const char_t* data)
+		{
+			// write the part of the string that fits in the buffer
+			size_t offset = bufsize;
+
+			while (*data && offset < bufcapacity)
+				buffer[offset++] = *data++;
+
+			// write the rest
+			if (offset < bufcapacity)
+			{
+				bufsize = offset;
+			}
+			else
+			{
+				// backtrack a bit if we have split the codepoint
+				size_t length = offset - bufsize;
+				size_t extra = length - get_valid_length(data - length, length);
+
+				bufsize = offset - extra;
+
+				write_direct(data - extra, strlength(data) + extra);
+			}
+		}
+
+		void write(char_t d0)
+		{
+			size_t offset = bufsize;
+			if (offset > bufcapacity - 1) offset = flush();
+
+			buffer[offset + 0] = d0;
+			bufsize = offset + 1;
+		}
+
+		void write(char_t d0, char_t d1)
+		{
+			size_t offset = bufsize;
+			if (offset > bufcapacity - 2) offset = flush();
+
+			buffer[offset + 0] = d0;
+			buffer[offset + 1] = d1;
+			bufsize = offset + 2;
+		}
+
+		void write(char_t d0, char_t d1, char_t d2)
+		{
+			size_t offset = bufsize;
+			if (offset > bufcapacity - 3) offset = flush();
+
+			buffer[offset + 0] = d0;
+			buffer[offset + 1] = d1;
+			buffer[offset + 2] = d2;
+			bufsize = offset + 3;
+		}
+
+		void write(char_t d0, char_t d1, char_t d2, char_t d3)
+		{
+			size_t offset = bufsize;
+			if (offset > bufcapacity - 4) offset = flush();
+
+			buffer[offset + 0] = d0;
+			buffer[offset + 1] = d1;
+			buffer[offset + 2] = d2;
+			buffer[offset + 3] = d3;
+			bufsize = offset + 4;
+		}
+
+		void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4)
+		{
+			size_t offset = bufsize;
+			if (offset > bufcapacity - 5) offset = flush();
+
+			buffer[offset + 0] = d0;
+			buffer[offset + 1] = d1;
+			buffer[offset + 2] = d2;
+			buffer[offset + 3] = d3;
+			buffer[offset + 4] = d4;
+			bufsize = offset + 5;
+		}
+
+		void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4, char_t d5)
+		{
+			size_t offset = bufsize;
+			if (offset > bufcapacity - 6) offset = flush();
+
+			buffer[offset + 0] = d0;
+			buffer[offset + 1] = d1;
+			buffer[offset + 2] = d2;
+			buffer[offset + 3] = d3;
+			buffer[offset + 4] = d4;
+			buffer[offset + 5] = d5;
+			bufsize = offset + 6;
+		}
+
+		// utf8 maximum expansion: x4 (-> utf32)
+		// utf16 maximum expansion: x2 (-> utf32)
+		// utf32 maximum expansion: x1
+		enum
+		{
+			bufcapacitybytes =
+			#ifdef PUGIXML_MEMORY_OUTPUT_STACK
+				PUGIXML_MEMORY_OUTPUT_STACK
+			#else
+				10240
+			#endif
+			,
+			bufcapacity = bufcapacitybytes / (sizeof(char_t) + 4)
+		};
+
+		char_t buffer[bufcapacity];
+
+		union
+		{
+			uint8_t data_u8[4 * bufcapacity];
+			uint16_t data_u16[2 * bufcapacity];
+			uint32_t data_u32[bufcapacity];
+			char_t data_char[bufcapacity];
+		} scratch;
+
+		xml_writer& writer;
+		size_t bufsize;
+		xml_encoding encoding;
+	};
+
+	PUGI__FN void text_output_escaped(xml_buffered_writer& writer, const char_t* s, chartypex_t type)
+	{
+		while (*s)
+		{
+			const char_t* prev = s;
+			
+			// While *s is a usual symbol
+			PUGI__SCANWHILE_UNROLL(!PUGI__IS_CHARTYPEX(ss, type));
+		
+			writer.write_buffer(prev, static_cast<size_t>(s - prev));
+
+			switch (*s)
+			{
+				case 0: break;
+				case '&':
+					writer.write('&', 'a', 'm', 'p', ';');
+					++s;
+					break;
+				case '<':
+					writer.write('&', 'l', 't', ';');
+					++s;
+					break;
+				case '>':
+					writer.write('&', 'g', 't', ';');
+					++s;
+					break;
+				case '"':
+					writer.write('&', 'q', 'u', 'o', 't', ';');
+					++s;
+					break;
+				default: // s is not a usual symbol
+				{
+					unsigned int ch = static_cast<unsigned int>(*s++);
+					assert(ch < 32);
+
+					writer.write('&', '#', static_cast<char_t>((ch / 10) + '0'), static_cast<char_t>((ch % 10) + '0'), ';');
+				}
+			}
+		}
+	}
+
+	PUGI__FN void text_output(xml_buffered_writer& writer, const char_t* s, chartypex_t type, unsigned int flags)
+	{
+		if (flags & format_no_escapes)
+			writer.write_string(s);
+		else
+			text_output_escaped(writer, s, type);
+	}
+
+	PUGI__FN void text_output_cdata(xml_buffered_writer& writer, const char_t* s)
+	{
+		do
+		{
+			writer.write('<', '!', '[', 'C', 'D');
+			writer.write('A', 'T', 'A', '[');
+
+			const char_t* prev = s;
+
+			// look for ]]> sequence - we can't output it as is since it terminates CDATA
+			while (*s && !(s[0] == ']' && s[1] == ']' && s[2] == '>')) ++s;
+
+			// skip ]] if we stopped at ]]>, > will go to the next CDATA section
+			if (*s) s += 2;
+
+			writer.write_buffer(prev, static_cast<size_t>(s - prev));
+
+			writer.write(']', ']', '>');
+		}
+		while (*s);
+	}
+
+	PUGI__FN void text_output_indent(xml_buffered_writer& writer, const char_t* indent, size_t indent_length, unsigned int depth)
+	{
+		switch (indent_length)
+		{
+		case 1:
+		{
+			for (unsigned int i = 0; i < depth; ++i)
+				writer.write(indent[0]);
+			break;
+		}
+
+		case 2:
+		{
+			for (unsigned int i = 0; i < depth; ++i)
+				writer.write(indent[0], indent[1]);
+			break;
+		}
+
+		case 3:
+		{
+			for (unsigned int i = 0; i < depth; ++i)
+				writer.write(indent[0], indent[1], indent[2]);
+			break;
+		}
+
+		case 4:
+		{
+			for (unsigned int i = 0; i < depth; ++i)
+				writer.write(indent[0], indent[1], indent[2], indent[3]);
+			break;
+		}
+
+		default:
+		{
+			for (unsigned int i = 0; i < depth; ++i)
+				writer.write_buffer(indent, indent_length);
+		}
+		}
+	}
+
+	PUGI__FN void node_output_comment(xml_buffered_writer& writer, const char_t* s)
+	{
+		writer.write('<', '!', '-', '-');
+
+		while (*s)
+		{
+			const char_t* prev = s;
+
+			// look for -\0 or -- sequence - we can't output it since -- is illegal in comment body
+			while (*s && !(s[0] == '-' && (s[1] == '-' || s[1] == 0))) ++s;
+
+			writer.write_buffer(prev, static_cast<size_t>(s - prev));
+
+			if (*s)
+			{
+				assert(*s == '-');
+
+				writer.write('-', ' ');
+				++s;
+			}
+		}
+
+		writer.write('-', '-', '>');
+	}
+
+	PUGI__FN void node_output_attributes(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags)
+	{
+		const char_t* default_name = PUGIXML_TEXT(":anonymous");
+
+		for (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute)
+		{
+			writer.write(' ');
+			writer.write_string(a->name ? a->name : default_name);
+			writer.write('=', '"');
+
+			if (a->value)
+				text_output(writer, a->value, ctx_special_attr, flags);
+
+			writer.write('"');
+		}
+	}
+
+	PUGI__FN bool node_output_start(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags)
+	{
+		const char_t* default_name = PUGIXML_TEXT(":anonymous");
+		const char_t* name = node->name ? node->name : default_name;
+
+		writer.write('<');
+		writer.write_string(name);
+
+		if (node->first_attribute)
+			node_output_attributes(writer, node, flags);
+
+		if (flags & format_raw)
+		{
+			if (!node->first_child)
+				writer.write(' ', '/', '>');
+			else
+			{
+				writer.write('>');
+
+				return true;
+			}
+		}
+		else
+		{
+			xml_node_struct* first = node->first_child;
+
+			if (!first)
+				writer.write(' ', '/', '>', '\n');
+			else if (!first->next_sibling && (PUGI__NODETYPE(first) == node_pcdata || PUGI__NODETYPE(first) == node_cdata))
+			{
+				writer.write('>');
+
+				const char_t* value = first->value ? first->value : PUGIXML_TEXT("");
+
+				if (PUGI__NODETYPE(first) == node_pcdata)
+					text_output(writer, value, ctx_special_pcdata, flags);
+				else
+					text_output_cdata(writer, value);
+
+				writer.write('<', '/');
+				writer.write_string(name);
+				writer.write('>', '\n');
+			}
+			else
+			{
+				writer.write('>', '\n');
+
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	PUGI__FN void node_output_end(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags)
+	{
+		const char_t* default_name = PUGIXML_TEXT(":anonymous");
+		const char_t* name = node->name ? node->name : default_name;
+
+		writer.write('<', '/');
+		writer.write_string(name);
+
+		if (flags & format_raw)
+			writer.write('>');
+		else
+			writer.write('>', '\n');
+	}
+
+	PUGI__FN void node_output_simple(xml_buffered_writer& writer, xml_node_struct* node, unsigned int flags)
+	{
+		const char_t* default_name = PUGIXML_TEXT(":anonymous");
+
+		switch (PUGI__NODETYPE(node))
+		{
+			case node_pcdata:
+				text_output(writer, node->value ? node->value : PUGIXML_TEXT(""), ctx_special_pcdata, flags);
+				if ((flags & format_raw) == 0) writer.write('\n');
+				break;
+
+			case node_cdata:
+				text_output_cdata(writer, node->value ? node->value : PUGIXML_TEXT(""));
+				if ((flags & format_raw) == 0) writer.write('\n');
+				break;
+
+			case node_comment:
+				node_output_comment(writer, node->value ? node->value : PUGIXML_TEXT(""));
+				if ((flags & format_raw) == 0) writer.write('\n');
+				break;
+
+			case node_pi:
+				writer.write('<', '?');
+				writer.write_string(node->name ? node->name : default_name);
+
+				if (node->value)
+				{
+					writer.write(' ');
+					writer.write_string(node->value);
+				}
+
+				writer.write('?', '>');
+				if ((flags & format_raw) == 0) writer.write('\n');
+				break;
+
+			case node_declaration:
+				writer.write('<', '?');
+				writer.write_string(node->name ? node->name : default_name);
+				node_output_attributes(writer, node, flags);
+				writer.write('?', '>');
+				if ((flags & format_raw) == 0) writer.write('\n');
+				break;
+
+			case node_doctype:
+				writer.write('<', '!', 'D', 'O', 'C');
+				writer.write('T', 'Y', 'P', 'E');
+
+				if (node->value)
+				{
+					writer.write(' ');
+					writer.write_string(node->value);
+				}
+
+				writer.write('>');
+				if ((flags & format_raw) == 0) writer.write('\n');
+				break;
+
+			default:
+				assert(!"Invalid node type");
+		}
+	}
+
+	PUGI__FN void node_output(xml_buffered_writer& writer, xml_node_struct* root, const char_t* indent, unsigned int flags, unsigned int depth)
+	{
+		size_t indent_length = ((flags & (format_indent | format_raw)) == format_indent) ? strlength(indent) : 0;
+
+		xml_node_struct* node = root;
+
+		do
+		{
+			assert(node);
+
+			// begin writing current node
+			if (indent_length)
+				text_output_indent(writer, indent, indent_length, depth);
+
+			if (PUGI__NODETYPE(node) == node_element)
+			{
+				if (node_output_start(writer, node, flags))
+				{
+					node = node->first_child;
+					depth++;
+					continue;
+				}
+			}
+			else if (PUGI__NODETYPE(node) == node_document)
+			{
+				if (node->first_child)
+				{
+					node = node->first_child;
+					continue;
+				}
+			}
+			else
+			{
+				node_output_simple(writer, node, flags);
+			}
+
+			// continue to the next node
+			while (node != root)
+			{
+				if (node->next_sibling)
+				{
+					node = node->next_sibling;
+					break;
+				}
+
+				node = node->parent;
+
+				// write closing node
+				if (PUGI__NODETYPE(node) == node_element)
+				{
+					depth--;
+
+					if (indent_length)
+						text_output_indent(writer, indent, indent_length, depth);
+
+					node_output_end(writer, node, flags);
+				}
+			}
+		}
+		while (node != root);
+	}
+
+	PUGI__FN bool has_declaration(xml_node_struct* node)
+	{
+		for (xml_node_struct* child = node->first_child; child; child = child->next_sibling)
+		{
+			xml_node_type type = PUGI__NODETYPE(child);
+
+			if (type == node_declaration) return true;
+			if (type == node_element) return false;
+		}
+
+		return false;
+	}
+
+	PUGI__FN bool is_attribute_of(xml_attribute_struct* attr, xml_node_struct* node)
+	{
+		for (xml_attribute_struct* a = node->first_attribute; a; a = a->next_attribute)
+			if (a == attr)
+				return true;
+
+		return false;
+	}
+
+	PUGI__FN bool allow_insert_attribute(xml_node_type parent)
+	{
+		return parent == node_element || parent == node_declaration;
+	}
+
+	PUGI__FN bool allow_insert_child(xml_node_type parent, xml_node_type child)
+	{
+		if (parent != node_document && parent != node_element) return false;
+		if (child == node_document || child == node_null) return false;
+		if (parent != node_document && (child == node_declaration || child == node_doctype)) return false;
+
+		return true;
+	}
+
+	PUGI__FN bool allow_move(xml_node parent, xml_node child)
+	{
+		// check that child can be a child of parent
+		if (!allow_insert_child(parent.type(), child.type()))
+			return false;
+
+		// check that node is not moved between documents
+		if (parent.root() != child.root())
+			return false;
+
+		// check that new parent is not in the child subtree
+		xml_node cur = parent;
+
+		while (cur)
+		{
+			if (cur == child)
+				return false;
+
+			cur = cur.parent();
+		}
+
+		return true;
+	}
+
+	PUGI__FN void node_copy_string(char_t*& dest, uintptr_t& header, uintptr_t header_mask, char_t* source, uintptr_t& source_header, xml_allocator* alloc)
+	{
+		assert(!dest && (header & header_mask) == 0);
+
+		if (source)
+		{
+			if (alloc && (source_header & header_mask) == 0)
+			{
+				dest = source;
+
+				// since strcpy_insitu can reuse document buffer memory we need to mark both source and dest as shared
+				header |= xml_memory_page_contents_shared_mask;
+				source_header |= xml_memory_page_contents_shared_mask;
+			}
+			else
+				strcpy_insitu(dest, header, header_mask, source);
+		}
+	}
+
+	PUGI__FN void node_copy_contents(xml_node_struct* dn, xml_node_struct* sn, xml_allocator* shared_alloc)
+	{
+		node_copy_string(dn->name, dn->header, xml_memory_page_name_allocated_mask, sn->name, sn->header, shared_alloc);
+		node_copy_string(dn->value, dn->header, xml_memory_page_value_allocated_mask, sn->value, sn->header, shared_alloc);
+
+		for (xml_attribute_struct* sa = sn->first_attribute; sa; sa = sa->next_attribute)
+		{
+			xml_attribute_struct* da = append_new_attribute(dn, get_allocator(dn));
+
+			if (da)
+			{
+				node_copy_string(da->name, da->header, xml_memory_page_name_allocated_mask, sa->name, sa->header, shared_alloc);
+				node_copy_string(da->value, da->header, xml_memory_page_value_allocated_mask, sa->value, sa->header, shared_alloc);
+			}
+		}
+	}
+
+	PUGI__FN void node_copy_tree(xml_node_struct* dn, xml_node_struct* sn)
+	{
+		xml_allocator& alloc = get_allocator(dn);
+		xml_allocator* shared_alloc = (&alloc == &get_allocator(sn)) ? &alloc : 0;
+
+		node_copy_contents(dn, sn, shared_alloc);
+
+		xml_node_struct* dit = dn;
+		xml_node_struct* sit = sn->first_child;
+
+		while (sit && sit != sn)
+		{
+			if (sit != dn)
+			{
+				xml_node_struct* copy = append_new_node(dit, alloc, PUGI__NODETYPE(sit));
+
+				if (copy)
+				{
+					node_copy_contents(copy, sit, shared_alloc);
+
+					if (sit->first_child)
+					{
+						dit = copy;
+						sit = sit->first_child;
+						continue;
+					}
+				}
+			}
+
+			// continue to the next node
+			do
+			{
+				if (sit->next_sibling)
+				{
+					sit = sit->next_sibling;
+					break;
+				}
+
+				sit = sit->parent;
+				dit = dit->parent;
+			}
+			while (sit != sn);
+		}
+	}
+
+	inline bool is_text_node(xml_node_struct* node)
+	{
+		xml_node_type type = PUGI__NODETYPE(node);
+
+		return type == node_pcdata || type == node_cdata;
+	}
+
+	// get value with conversion functions
+	PUGI__FN int get_integer_base(const char_t* value)
+	{
+		const char_t* s = value;
+
+		while (PUGI__IS_CHARTYPE(*s, ct_space))
+			s++;
+
+		if (*s == '-')
+			s++;
+
+		return (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) ? 16 : 10;
+	}
+
+	PUGI__FN int get_value_int(const char_t* value, int def)
+	{
+		if (!value) return def;
+
+		int base = get_integer_base(value);
+
+	#ifdef PUGIXML_WCHAR_MODE
+		return static_cast<int>(wcstol(value, 0, base));
+	#else
+		return static_cast<int>(strtol(value, 0, base));
+	#endif
+	}
+
+	PUGI__FN unsigned int get_value_uint(const char_t* value, unsigned int def)
+	{
+		if (!value) return def;
+
+		int base = get_integer_base(value);
+
+	#ifdef PUGIXML_WCHAR_MODE
+		return static_cast<unsigned int>(wcstoul(value, 0, base));
+	#else
+		return static_cast<unsigned int>(strtoul(value, 0, base));
+	#endif
+	}
+
+	PUGI__FN double get_value_double(const char_t* value, double def)
+	{
+		if (!value) return def;
+
+	#ifdef PUGIXML_WCHAR_MODE
+		return wcstod(value, 0);
+	#else
+		return strtod(value, 0);
+	#endif
+	}
+
+	PUGI__FN float get_value_float(const char_t* value, float def)
+	{
+		if (!value) return def;
+
+	#ifdef PUGIXML_WCHAR_MODE
+		return static_cast<float>(wcstod(value, 0));
+	#else
+		return static_cast<float>(strtod(value, 0));
+	#endif
+	}
+
+	PUGI__FN bool get_value_bool(const char_t* value, bool def)
+	{
+		if (!value) return def;
+
+		// only look at first char
+		char_t first = *value;
+
+		// 1*, t* (true), T* (True), y* (yes), Y* (YES)
+		return (first == '1' || first == 't' || first == 'T' || first == 'y' || first == 'Y');
+	}
+
+#ifdef PUGIXML_HAS_LONG_LONG
+	PUGI__FN long long get_value_llong(const char_t* value, long long def)
+	{
+		if (!value) return def;
+
+		int base = get_integer_base(value);
+
+	#ifdef PUGIXML_WCHAR_MODE
+		#ifdef PUGI__MSVC_CRT_VERSION
+			return _wcstoi64(value, 0, base);
+		#else
+			return wcstoll(value, 0, base);
+		#endif
+	#else
+		#ifdef PUGI__MSVC_CRT_VERSION
+			return _strtoi64(value, 0, base);
+		#else
+			return strtoll(value, 0, base);
+		#endif
+	#endif
+	}
+
+	PUGI__FN unsigned long long get_value_ullong(const char_t* value, unsigned long long def)
+	{
+		if (!value) return def;
+
+		int base = get_integer_base(value);
+
+	#ifdef PUGIXML_WCHAR_MODE
+		#ifdef PUGI__MSVC_CRT_VERSION
+			return _wcstoui64(value, 0, base);
+		#else
+			return wcstoull(value, 0, base);
+		#endif
+	#else
+		#ifdef PUGI__MSVC_CRT_VERSION
+			return _strtoui64(value, 0, base);
+		#else
+			return strtoull(value, 0, base);
+		#endif
+	#endif
+	}
+#endif
+
+	// set value with conversion functions
+	PUGI__FN bool set_value_buffer(char_t*& dest, uintptr_t& header, uintptr_t header_mask, char (&buf)[128])
+	{
+	#ifdef PUGIXML_WCHAR_MODE
+		char_t wbuf[128];
+		impl::widen_ascii(wbuf, buf);
+
+		return strcpy_insitu(dest, header, header_mask, wbuf);
+	#else
+		return strcpy_insitu(dest, header, header_mask, buf);
+	#endif
+	}
+
+	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, int value)
+	{
+		char buf[128];
+		sprintf(buf, "%d", value);
+	
+		return set_value_buffer(dest, header, header_mask, buf);
+	}
+
+	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, unsigned int value)
+	{
+		char buf[128];
+		sprintf(buf, "%u", value);
+
+		return set_value_buffer(dest, header, header_mask, buf);
+	}
+
+	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, float value)
+	{
+		char buf[128];
+		sprintf(buf, "%.9g", value);
+
+		return set_value_buffer(dest, header, header_mask, buf);
+	}
+	
+	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, double value)
+	{
+		char buf[128];
+		sprintf(buf, "%.17g", value);
+
+		return set_value_buffer(dest, header, header_mask, buf);
+	}
+	
+	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, bool value)
+	{
+		return strcpy_insitu(dest, header, header_mask, value ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"));
+	}
+
+#ifdef PUGIXML_HAS_LONG_LONG
+	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, long long value)
+	{
+		char buf[128];
+		sprintf(buf, "%lld", value);
+	
+		return set_value_buffer(dest, header, header_mask, buf);
+	}
+
+	PUGI__FN bool set_value_convert(char_t*& dest, uintptr_t& header, uintptr_t header_mask, unsigned long long value)
+	{
+		char buf[128];
+		sprintf(buf, "%llu", value);
+	
+		return set_value_buffer(dest, header, header_mask, buf);
+	}
+#endif
+
+	// we need to get length of entire file to load it in memory; the only (relatively) sane way to do it is via seek/tell trick
+	PUGI__FN xml_parse_status get_file_size(FILE* file, size_t& out_result)
+	{
+	#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE)
+		// there are 64-bit versions of fseek/ftell, let's use them
+		typedef __int64 length_type;
+
+		_fseeki64(file, 0, SEEK_END);
+		length_type length = _ftelli64(file);
+		_fseeki64(file, 0, SEEK_SET);
+	#elif defined(__MINGW32__) && !defined(__NO_MINGW_LFS) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR))
+		// there are 64-bit versions of fseek/ftell, let's use them
+		typedef off64_t length_type;
+
+		fseeko64(file, 0, SEEK_END);
+		length_type length = ftello64(file);
+		fseeko64(file, 0, SEEK_SET);
+	#else
+		// if this is a 32-bit OS, long is enough; if this is a unix system, long is 64-bit, which is enough; otherwise we can't do anything anyway.
+		typedef long length_type;
+
+		fseek(file, 0, SEEK_END);
+		length_type length = ftell(file);
+		fseek(file, 0, SEEK_SET);
+	#endif
+
+		// check for I/O errors
+		if (length < 0) return status_io_error;
+		
+		// check for overflow
+		size_t result = static_cast<size_t>(length);
+
+		if (static_cast<length_type>(result) != length) return status_out_of_memory;
+
+		// finalize
+		out_result = result;
+
+		return status_ok;
+	}
+
+	PUGI__FN size_t zero_terminate_buffer(void* buffer, size_t size, xml_encoding encoding) 
+	{
+		// We only need to zero-terminate if encoding conversion does not do it for us
+	#ifdef PUGIXML_WCHAR_MODE
+		xml_encoding wchar_encoding = get_wchar_encoding();
+
+		if (encoding == wchar_encoding || need_endian_swap_utf(encoding, wchar_encoding))
+		{
+			size_t length = size / sizeof(char_t);
+
+			static_cast<char_t*>(buffer)[length] = 0;
+			return (length + 1) * sizeof(char_t);
+		}
+	#else
+		if (encoding == encoding_utf8)
+		{
+			static_cast<char*>(buffer)[size] = 0;
+			return size + 1;
+		}
+	#endif
+
+		return size;
+	}
+
+	PUGI__FN xml_parse_result load_file_impl(xml_document& doc, FILE* file, unsigned int options, xml_encoding encoding)
+	{
+		if (!file) return make_parse_result(status_file_not_found);
+
+		// get file size (can result in I/O errors)
+		size_t size = 0;
+		xml_parse_status size_status = get_file_size(file, size);
+
+		if (size_status != status_ok)
+		{
+			fclose(file);
+			return make_parse_result(size_status);
+		}
+		
+		size_t max_suffix_size = sizeof(char_t);
+
+		// allocate buffer for the whole file
+		char* contents = static_cast<char*>(xml_memory::allocate(size + max_suffix_size));
+
+		if (!contents)
+		{
+			fclose(file);
+			return make_parse_result(status_out_of_memory);
+		}
+
+		// read file in memory
+		size_t read_size = fread(contents, 1, size, file);
+		fclose(file);
+
+		if (read_size != size)
+		{
+			xml_memory::deallocate(contents);
+			return make_parse_result(status_io_error);
+		}
+
+		xml_encoding real_encoding = get_buffer_encoding(encoding, contents, size);
+		
+		return doc.load_buffer_inplace_own(contents, zero_terminate_buffer(contents, size, real_encoding), options, real_encoding);
+	}
+
+#ifndef PUGIXML_NO_STL
+	template <typename T> struct xml_stream_chunk
+	{
+		static xml_stream_chunk* create()
+		{
+			void* memory = xml_memory::allocate(sizeof(xml_stream_chunk));
+			
+			return new (memory) xml_stream_chunk();
+		}
+
+		static void destroy(void* ptr)
+		{
+			xml_stream_chunk* chunk = static_cast<xml_stream_chunk*>(ptr);
+
+			// free chunk chain
+			while (chunk)
+			{
+				xml_stream_chunk* next_ = chunk->next;
+
+				xml_memory::deallocate(chunk);
+
+				chunk = next_;
+			}
+		}
+
+		xml_stream_chunk(): next(0), size(0)
+		{
+		}
+
+		xml_stream_chunk* next;
+		size_t size;
+
+		T data[xml_memory_page_size / sizeof(T)];
+	};
+
+	template <typename T> PUGI__FN xml_parse_status load_stream_data_noseek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size)
+	{
+		buffer_holder chunks(0, xml_stream_chunk<T>::destroy);
+
+		// read file to a chunk list
+		size_t total = 0;
+		xml_stream_chunk<T>* last = 0;
+
+		while (!stream.eof())
+		{
+			// allocate new chunk
+			xml_stream_chunk<T>* chunk = xml_stream_chunk<T>::create();
+			if (!chunk) return status_out_of_memory;
+
+			// append chunk to list
+			if (last) last = last->next = chunk;
+			else chunks.data = last = chunk;
+
+			// read data to chunk
+			stream.read(chunk->data, static_cast<std::streamsize>(sizeof(chunk->data) / sizeof(T)));
+			chunk->size = static_cast<size_t>(stream.gcount()) * sizeof(T);
+
+			// read may set failbit | eofbit in case gcount() is less than read length, so check for other I/O errors
+			if (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error;
+
+			// guard against huge files (chunk size is small enough to make this overflow check work)
+			if (total + chunk->size < total) return status_out_of_memory;
+			total += chunk->size;
+		}
+
+		size_t max_suffix_size = sizeof(char_t);
+
+		// copy chunk list to a contiguous buffer
+		char* buffer = static_cast<char*>(xml_memory::allocate(total + max_suffix_size));
+		if (!buffer) return status_out_of_memory;
+
+		char* write = buffer;
+
+		for (xml_stream_chunk<T>* chunk = static_cast<xml_stream_chunk<T>*>(chunks.data); chunk; chunk = chunk->next)
+		{
+			assert(write + chunk->size <= buffer + total);
+			memcpy(write, chunk->data, chunk->size);
+			write += chunk->size;
+		}
+
+		assert(write == buffer + total);
+
+		// return buffer
+		*out_buffer = buffer;
+		*out_size = total;
+
+		return status_ok;
+	}
+
+	template <typename T> PUGI__FN xml_parse_status load_stream_data_seek(std::basic_istream<T>& stream, void** out_buffer, size_t* out_size)
+	{
+		// get length of remaining data in stream
+		typename std::basic_istream<T>::pos_type pos = stream.tellg();
+		stream.seekg(0, std::ios::end);
+		std::streamoff length = stream.tellg() - pos;
+		stream.seekg(pos);
+
+		if (stream.fail() || pos < 0) return status_io_error;
+
+		// guard against huge files
+		size_t read_length = static_cast<size_t>(length);
+
+		if (static_cast<std::streamsize>(read_length) != length || length < 0) return status_out_of_memory;
+
+		size_t max_suffix_size = sizeof(char_t);
+
+		// read stream data into memory (guard against stream exceptions with buffer holder)
+		buffer_holder buffer(xml_memory::allocate(read_length * sizeof(T) + max_suffix_size), xml_memory::deallocate);
+		if (!buffer.data) return status_out_of_memory;
+
+		stream.read(static_cast<T*>(buffer.data), static_cast<std::streamsize>(read_length));
+
+		// read may set failbit | eofbit in case gcount() is less than read_length (i.e. line ending conversion), so check for other I/O errors
+		if (stream.bad() || (!stream.eof() && stream.fail())) return status_io_error;
+
+		// return buffer
+		size_t actual_length = static_cast<size_t>(stream.gcount());
+		assert(actual_length <= read_length);
+		
+		*out_buffer = buffer.release();
+		*out_size = actual_length * sizeof(T);
+
+		return status_ok;
+	}
+
+	template <typename T> PUGI__FN xml_parse_result load_stream_impl(xml_document& doc, std::basic_istream<T>& stream, unsigned int options, xml_encoding encoding)
+	{
+		void* buffer = 0;
+		size_t size = 0;
+		xml_parse_status status = status_ok;
+
+		// if stream has an error bit set, bail out (otherwise tellg() can fail and we'll clear error bits)
+		if (stream.fail()) return make_parse_result(status_io_error);
+
+		// load stream to memory (using seek-based implementation if possible, since it's faster and takes less memory)
+		if (stream.tellg() < 0)
+		{
+			stream.clear(); // clear error flags that could be set by a failing tellg
+			status = load_stream_data_noseek(stream, &buffer, &size);
+		}
+		else
+			status = load_stream_data_seek(stream, &buffer, &size);
+
+		if (status != status_ok) return make_parse_result(status);
+
+		xml_encoding real_encoding = get_buffer_encoding(encoding, buffer, size);
+		
+		return doc.load_buffer_inplace_own(buffer, zero_terminate_buffer(buffer, size, real_encoding), options, real_encoding);
+	}
+#endif
+
+#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__) || (defined(__MINGW32__) && (!defined(__STRICT_ANSI__) || defined(__MINGW64_VERSION_MAJOR)))
+	PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode)
+	{
+		return _wfopen(path, mode);
+	}
+#else
+	PUGI__FN char* convert_path_heap(const wchar_t* str)
+	{
+		assert(str);
+
+		// first pass: get length in utf8 characters
+		size_t length = strlength_wide(str);
+		size_t size = as_utf8_begin(str, length);
+
+		// allocate resulting string
+		char* result = static_cast<char*>(xml_memory::allocate(size + 1));
+		if (!result) return 0;
+
+		// second pass: convert to utf8
+		as_utf8_end(result, size, str, length);
+
+		return result;
+	}
+
+	PUGI__FN FILE* open_file_wide(const wchar_t* path, const wchar_t* mode)
+	{
+		// there is no standard function to open wide paths, so our best bet is to try utf8 path
+		char* path_utf8 = convert_path_heap(path);
+		if (!path_utf8) return 0;
+
+		// convert mode to ASCII (we mirror _wfopen interface)
+		char mode_ascii[4] = {0};
+		for (size_t i = 0; mode[i]; ++i) mode_ascii[i] = static_cast<char>(mode[i]);
+
+		// try to open the utf8 path
+		FILE* result = fopen(path_utf8, mode_ascii);
+
+		// free dummy buffer
+		xml_memory::deallocate(path_utf8);
+
+		return result;
+	}
+#endif
+
+	PUGI__FN bool save_file_impl(const xml_document& doc, FILE* file, const char_t* indent, unsigned int flags, xml_encoding encoding)
+	{
+		if (!file) return false;
+
+		xml_writer_file writer(file);
+		doc.save(writer, indent, flags, encoding);
+
+		int result = ferror(file);
+
+		fclose(file);
+
+		return result == 0;
+	}
+
+	PUGI__FN xml_parse_result load_buffer_impl(xml_document_struct* doc, xml_node_struct* root, void* contents, size_t size, unsigned int options, xml_encoding encoding, bool is_mutable, bool own, char_t** out_buffer)
+	{
+		// check input buffer
+		assert(contents || size == 0);
+
+		// get actual encoding
+		xml_encoding buffer_encoding = impl::get_buffer_encoding(encoding, contents, size);
+
+		// get private buffer
+		char_t* buffer = 0;
+		size_t length = 0;
+
+		if (!impl::convert_buffer(buffer, length, buffer_encoding, contents, size, is_mutable)) return impl::make_parse_result(status_out_of_memory);
+		
+		// delete original buffer if we performed a conversion
+		if (own && buffer != contents && contents) impl::xml_memory::deallocate(contents);
+
+		// store buffer for offset_debug
+		doc->buffer = buffer;
+
+		// parse
+		xml_parse_result res = impl::xml_parser::parse(buffer, length, doc, root, options);
+
+		// remember encoding
+		res.encoding = buffer_encoding;
+
+		// grab onto buffer if it's our buffer, user is responsible for deallocating contents himself
+		if (own || buffer != contents) *out_buffer = buffer;
+
+		return res;
+	}
+PUGI__NS_END
+
+namespace pugi
+{
+	PUGI__FN xml_writer_file::xml_writer_file(void* file_): file(file_)
+	{
+	}
+
+	PUGI__FN void xml_writer_file::write(const void* data, size_t size)
+	{
+		size_t result = fwrite(data, 1, size, static_cast<FILE*>(file));
+		(void)!result; // unfortunately we can't do proper error handling here
+	}
+
+#ifndef PUGIXML_NO_STL
+	PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream): narrow_stream(&stream), wide_stream(0)
+	{
+	}
+
+	PUGI__FN xml_writer_stream::xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream): narrow_stream(0), wide_stream(&stream)
+	{
+	}
+
+	PUGI__FN void xml_writer_stream::write(const void* data, size_t size)
+	{
+		if (narrow_stream)
+		{
+			assert(!wide_stream);
+			narrow_stream->write(reinterpret_cast<const char*>(data), static_cast<std::streamsize>(size));
+		}
+		else
+		{
+			assert(wide_stream);
+			assert(size % sizeof(wchar_t) == 0);
+
+			wide_stream->write(reinterpret_cast<const wchar_t*>(data), static_cast<std::streamsize>(size / sizeof(wchar_t)));
+		}
+	}
+#endif
+
+	PUGI__FN xml_tree_walker::xml_tree_walker(): _depth(0)
+	{
+	}
+	
+	PUGI__FN xml_tree_walker::~xml_tree_walker()
+	{
+	}
+
+	PUGI__FN int xml_tree_walker::depth() const
+	{
+		return _depth;
+	}
+
+	PUGI__FN bool xml_tree_walker::begin(xml_node&)
+	{
+		return true;
+	}
+
+	PUGI__FN bool xml_tree_walker::end(xml_node&)
+	{
+		return true;
+	}
+
+	PUGI__FN xml_attribute::xml_attribute(): _attr(0)
+	{
+	}
+
+	PUGI__FN xml_attribute::xml_attribute(xml_attribute_struct* attr): _attr(attr)
+	{
+	}
+
+	PUGI__FN static void unspecified_bool_xml_attribute(xml_attribute***)
+	{
+	}
+
+	PUGI__FN xml_attribute::operator xml_attribute::unspecified_bool_type() const
+	{
+		return _attr ? unspecified_bool_xml_attribute : 0;
+	}
+
+	PUGI__FN bool xml_attribute::operator!() const
+	{
+		return !_attr;
+	}
+
+	PUGI__FN bool xml_attribute::operator==(const xml_attribute& r) const
+	{
+		return (_attr == r._attr);
+	}
+	
+	PUGI__FN bool xml_attribute::operator!=(const xml_attribute& r) const
+	{
+		return (_attr != r._attr);
+	}
+
+	PUGI__FN bool xml_attribute::operator<(const xml_attribute& r) const
+	{
+		return (_attr < r._attr);
+	}
+	
+	PUGI__FN bool xml_attribute::operator>(const xml_attribute& r) const
+	{
+		return (_attr > r._attr);
+	}
+	
+	PUGI__FN bool xml_attribute::operator<=(const xml_attribute& r) const
+	{
+		return (_attr <= r._attr);
+	}
+	
+	PUGI__FN bool xml_attribute::operator>=(const xml_attribute& r) const
+	{
+		return (_attr >= r._attr);
+	}
+
+	PUGI__FN xml_attribute xml_attribute::next_attribute() const
+	{
+		return _attr ? xml_attribute(_attr->next_attribute) : xml_attribute();
+	}
+
+	PUGI__FN xml_attribute xml_attribute::previous_attribute() const
+	{
+		return _attr && _attr->prev_attribute_c->next_attribute ? xml_attribute(_attr->prev_attribute_c) : xml_attribute();
+	}
+
+	PUGI__FN const char_t* xml_attribute::as_string(const char_t* def) const
+	{
+		return (_attr && _attr->value) ? _attr->value : def;
+	}
+
+	PUGI__FN int xml_attribute::as_int(int def) const
+	{
+		return impl::get_value_int(_attr ? _attr->value : 0, def);
+	}
+
+	PUGI__FN unsigned int xml_attribute::as_uint(unsigned int def) const
+	{
+		return impl::get_value_uint(_attr ? _attr->value : 0, def);
+	}
+
+	PUGI__FN double xml_attribute::as_double(double def) const
+	{
+		return impl::get_value_double(_attr ? _attr->value : 0, def);
+	}
+
+	PUGI__FN float xml_attribute::as_float(float def) const
+	{
+		return impl::get_value_float(_attr ? _attr->value : 0, def);
+	}
+
+	PUGI__FN bool xml_attribute::as_bool(bool def) const
+	{
+		return impl::get_value_bool(_attr ? _attr->value : 0, def);
+	}
+
+#ifdef PUGIXML_HAS_LONG_LONG
+	PUGI__FN long long xml_attribute::as_llong(long long def) const
+	{
+		return impl::get_value_llong(_attr ? _attr->value : 0, def);
+	}
+
+	PUGI__FN unsigned long long xml_attribute::as_ullong(unsigned long long def) const
+	{
+		return impl::get_value_ullong(_attr ? _attr->value : 0, def);
+	}
+#endif
+
+	PUGI__FN bool xml_attribute::empty() const
+	{
+		return !_attr;
+	}
+
+	PUGI__FN const char_t* xml_attribute::name() const
+	{
+		return (_attr && _attr->name) ? _attr->name : PUGIXML_TEXT("");
+	}
+
+	PUGI__FN const char_t* xml_attribute::value() const
+	{
+		return (_attr && _attr->value) ? _attr->value : PUGIXML_TEXT("");
+	}
+
+	PUGI__FN size_t xml_attribute::hash_value() const
+	{
+		return static_cast<size_t>(reinterpret_cast<uintptr_t>(_attr) / sizeof(xml_attribute_struct));
+	}
+
+	PUGI__FN xml_attribute_struct* xml_attribute::internal_object() const
+	{
+		return _attr;
+	}
+
+	PUGI__FN xml_attribute& xml_attribute::operator=(const char_t* rhs)
+	{
+		set_value(rhs);
+		return *this;
+	}
+	
+	PUGI__FN xml_attribute& xml_attribute::operator=(int rhs)
+	{
+		set_value(rhs);
+		return *this;
+	}
+
+	PUGI__FN xml_attribute& xml_attribute::operator=(unsigned int rhs)
+	{
+		set_value(rhs);
+		return *this;
+	}
+
+	PUGI__FN xml_attribute& xml_attribute::operator=(double rhs)
+	{
+		set_value(rhs);
+		return *this;
+	}
+	
+	PUGI__FN xml_attribute& xml_attribute::operator=(float rhs)
+	{
+		set_value(rhs);
+		return *this;
+	}
+	
+	PUGI__FN xml_attribute& xml_attribute::operator=(bool rhs)
+	{
+		set_value(rhs);
+		return *this;
+	}
+
+#ifdef PUGIXML_HAS_LONG_LONG
+	PUGI__FN xml_attribute& xml_attribute::operator=(long long rhs)
+	{
+		set_value(rhs);
+		return *this;
+	}
+
+	PUGI__FN xml_attribute& xml_attribute::operator=(unsigned long long rhs)
+	{
+		set_value(rhs);
+		return *this;
+	}
+#endif
+
+	PUGI__FN bool xml_attribute::set_name(const char_t* rhs)
+	{
+		if (!_attr) return false;
+		
+		return impl::strcpy_insitu(_attr->name, _attr->header, impl::xml_memory_page_name_allocated_mask, rhs);
+	}
+		
+	PUGI__FN bool xml_attribute::set_value(const char_t* rhs)
+	{
+		if (!_attr) return false;
+
+		return impl::strcpy_insitu(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+	}
+
+	PUGI__FN bool xml_attribute::set_value(int rhs)
+	{
+		if (!_attr) return false;
+
+		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+	}
+
+	PUGI__FN bool xml_attribute::set_value(unsigned int rhs)
+	{
+		if (!_attr) return false;
+
+		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+	}
+
+	PUGI__FN bool xml_attribute::set_value(double rhs)
+	{
+		if (!_attr) return false;
+
+		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+	}
+	
+	PUGI__FN bool xml_attribute::set_value(float rhs)
+	{
+		if (!_attr) return false;
+
+		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+	}
+	
+	PUGI__FN bool xml_attribute::set_value(bool rhs)
+	{
+		if (!_attr) return false;
+
+		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+	}
+
+#ifdef PUGIXML_HAS_LONG_LONG
+	PUGI__FN bool xml_attribute::set_value(long long rhs)
+	{
+		if (!_attr) return false;
+
+		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+	}
+
+	PUGI__FN bool xml_attribute::set_value(unsigned long long rhs)
+	{
+		if (!_attr) return false;
+
+		return impl::set_value_convert(_attr->value, _attr->header, impl::xml_memory_page_value_allocated_mask, rhs);
+	}
+#endif
+
+#ifdef __BORLANDC__
+	PUGI__FN bool operator&&(const xml_attribute& lhs, bool rhs)
+	{
+		return (bool)lhs && rhs;
+	}
+
+	PUGI__FN bool operator||(const xml_attribute& lhs, bool rhs)
+	{
+		return (bool)lhs || rhs;
+	}
+#endif
+
+	PUGI__FN xml_node::xml_node(): _root(0)
+	{
+	}
+
+	PUGI__FN xml_node::xml_node(xml_node_struct* p): _root(p)
+	{
+	}
+	
+	PUGI__FN static void unspecified_bool_xml_node(xml_node***)
+	{
+	}
+
+	PUGI__FN xml_node::operator xml_node::unspecified_bool_type() const
+	{
+		return _root ? unspecified_bool_xml_node : 0;
+	}
+
+	PUGI__FN bool xml_node::operator!() const
+	{
+		return !_root;
+	}
+
+	PUGI__FN xml_node::iterator xml_node::begin() const
+	{
+		return iterator(_root ? _root->first_child : 0, _root);
+	}
+
+	PUGI__FN xml_node::iterator xml_node::end() const
+	{
+		return iterator(0, _root);
+	}
+	
+	PUGI__FN xml_node::attribute_iterator xml_node::attributes_begin() const
+	{
+		return attribute_iterator(_root ? _root->first_attribute : 0, _root);
+	}
+
+	PUGI__FN xml_node::attribute_iterator xml_node::attributes_end() const
+	{
+		return attribute_iterator(0, _root);
+	}
+	
+	PUGI__FN xml_object_range<xml_node_iterator> xml_node::children() const
+	{
+		return xml_object_range<xml_node_iterator>(begin(), end());
+	}
+
+	PUGI__FN xml_object_range<xml_named_node_iterator> xml_node::children(const char_t* name_) const
+	{
+		return xml_object_range<xml_named_node_iterator>(xml_named_node_iterator(child(name_)._root, _root, name_), xml_named_node_iterator(0, _root, name_));
+	}
+
+	PUGI__FN xml_object_range<xml_attribute_iterator> xml_node::attributes() const
+	{
+		return xml_object_range<xml_attribute_iterator>(attributes_begin(), attributes_end());
+	}
+
+	PUGI__FN bool xml_node::operator==(const xml_node& r) const
+	{
+		return (_root == r._root);
+	}
+
+	PUGI__FN bool xml_node::operator!=(const xml_node& r) const
+	{
+		return (_root != r._root);
+	}
+
+	PUGI__FN bool xml_node::operator<(const xml_node& r) const
+	{
+		return (_root < r._root);
+	}
+	
+	PUGI__FN bool xml_node::operator>(const xml_node& r) const
+	{
+		return (_root > r._root);
+	}
+	
+	PUGI__FN bool xml_node::operator<=(const xml_node& r) const
+	{
+		return (_root <= r._root);
+	}
+	
+	PUGI__FN bool xml_node::operator>=(const xml_node& r) const
+	{
+		return (_root >= r._root);
+	}
+
+	PUGI__FN bool xml_node::empty() const
+	{
+		return !_root;
+	}
+	
+	PUGI__FN const char_t* xml_node::name() const
+	{
+		return (_root && _root->name) ? _root->name : PUGIXML_TEXT("");
+	}
+
+	PUGI__FN xml_node_type xml_node::type() const
+	{
+		return _root ? PUGI__NODETYPE(_root) : node_null;
+	}
+	
+	PUGI__FN const char_t* xml_node::value() const
+	{
+		return (_root && _root->value) ? _root->value : PUGIXML_TEXT("");
+	}
+	
+	PUGI__FN xml_node xml_node::child(const char_t* name_) const
+	{
+		if (!_root) return xml_node();
+
+		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+			if (i->name && impl::strequal(name_, i->name)) return xml_node(i);
+
+		return xml_node();
+	}
+
+	PUGI__FN xml_attribute xml_node::attribute(const char_t* name_) const
+	{
+		if (!_root) return xml_attribute();
+
+		for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute)
+			if (i->name && impl::strequal(name_, i->name))
+				return xml_attribute(i);
+		
+		return xml_attribute();
+	}
+	
+	PUGI__FN xml_node xml_node::next_sibling(const char_t* name_) const
+	{
+		if (!_root) return xml_node();
+		
+		for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling)
+			if (i->name && impl::strequal(name_, i->name)) return xml_node(i);
+
+		return xml_node();
+	}
+
+	PUGI__FN xml_node xml_node::next_sibling() const
+	{
+		return _root ? xml_node(_root->next_sibling) : xml_node();
+	}
+
+	PUGI__FN xml_node xml_node::previous_sibling(const char_t* name_) const
+	{
+		if (!_root) return xml_node();
+		
+		for (xml_node_struct* i = _root->prev_sibling_c; i->next_sibling; i = i->prev_sibling_c)
+			if (i->name && impl::strequal(name_, i->name)) return xml_node(i);
+
+		return xml_node();
+	}
+
+	PUGI__FN xml_node xml_node::previous_sibling() const
+	{
+		if (!_root) return xml_node();
+		
+		if (_root->prev_sibling_c->next_sibling) return xml_node(_root->prev_sibling_c);
+		else return xml_node();
+	}
+
+	PUGI__FN xml_node xml_node::parent() const
+	{
+		return _root ? xml_node(_root->parent) : xml_node();
+	}
+
+	PUGI__FN xml_node xml_node::root() const
+	{
+		return _root ? xml_node(&impl::get_document(_root)) : xml_node();
+	}
+
+	PUGI__FN xml_text xml_node::text() const
+	{
+		return xml_text(_root);
+	}
+
+	PUGI__FN const char_t* xml_node::child_value() const
+	{
+		if (!_root) return PUGIXML_TEXT("");
+		
+		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+			if (i->value && impl::is_text_node(i))
+				return i->value;
+
+		return PUGIXML_TEXT("");
+	}
+
+	PUGI__FN const char_t* xml_node::child_value(const char_t* name_) const
+	{
+		return child(name_).child_value();
+	}
+
+	PUGI__FN xml_attribute xml_node::first_attribute() const
+	{
+		return _root ? xml_attribute(_root->first_attribute) : xml_attribute();
+	}
+
+	PUGI__FN xml_attribute xml_node::last_attribute() const
+	{
+		return _root && _root->first_attribute ? xml_attribute(_root->first_attribute->prev_attribute_c) : xml_attribute();
+	}
+
+	PUGI__FN xml_node xml_node::first_child() const
+	{
+		return _root ? xml_node(_root->first_child) : xml_node();
+	}
+
+	PUGI__FN xml_node xml_node::last_child() const
+	{
+		return _root && _root->first_child ? xml_node(_root->first_child->prev_sibling_c) : xml_node();
+	}
+
+	PUGI__FN bool xml_node::set_name(const char_t* rhs)
+	{
+		switch (type())
+		{
+		case node_pi:
+		case node_declaration:
+		case node_element:
+			return impl::strcpy_insitu(_root->name, _root->header, impl::xml_memory_page_name_allocated_mask, rhs);
+
+		default:
+			return false;
+		}
+	}
+		
+	PUGI__FN bool xml_node::set_value(const char_t* rhs)
+	{
+		switch (type())
+		{
+		case node_pi:
+		case node_cdata:
+		case node_pcdata:
+		case node_comment:
+		case node_doctype:
+			return impl::strcpy_insitu(_root->value, _root->header, impl::xml_memory_page_value_allocated_mask, rhs);
+
+		default:
+			return false;
+		}
+	}
+
+	PUGI__FN xml_attribute xml_node::append_attribute(const char_t* name_)
+	{
+		if (!impl::allow_insert_attribute(type())) return xml_attribute();
+		
+		xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));
+		if (!a) return xml_attribute();
+
+		impl::append_attribute(a._attr, _root);
+
+		a.set_name(name_);
+		
+		return a;
+	}
+
+	PUGI__FN xml_attribute xml_node::prepend_attribute(const char_t* name_)
+	{
+		if (!impl::allow_insert_attribute(type())) return xml_attribute();
+		
+		xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));
+		if (!a) return xml_attribute();
+
+		impl::prepend_attribute(a._attr, _root);
+
+		a.set_name(name_);
+
+		return a;
+	}
+
+	PUGI__FN xml_attribute xml_node::insert_attribute_after(const char_t* name_, const xml_attribute& attr)
+	{
+		if (!impl::allow_insert_attribute(type())) return xml_attribute();
+		if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute();
+		
+		xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));
+		if (!a) return xml_attribute();
+
+		impl::insert_attribute_after(a._attr, attr._attr, _root);
+
+		a.set_name(name_);
+
+		return a;
+	}
+
+	PUGI__FN xml_attribute xml_node::insert_attribute_before(const char_t* name_, const xml_attribute& attr)
+	{
+		if (!impl::allow_insert_attribute(type())) return xml_attribute();
+		if (!attr || !impl::is_attribute_of(attr._attr, _root)) return xml_attribute();
+		
+		xml_attribute a(impl::allocate_attribute(impl::get_allocator(_root)));
+		if (!a) return xml_attribute();
+
+		impl::insert_attribute_before(a._attr, attr._attr, _root);
+
+		a.set_name(name_);
+
+		return a;
+	}
+
+	PUGI__FN xml_attribute xml_node::append_copy(const xml_attribute& proto)
+	{
+		if (!proto) return xml_attribute();
+
+		xml_attribute result = append_attribute(proto.name());
+		result.set_value(proto.value());
+
+		return result;
+	}
+
+	PUGI__FN xml_attribute xml_node::prepend_copy(const xml_attribute& proto)
+	{
+		if (!proto) return xml_attribute();
+
+		xml_attribute result = prepend_attribute(proto.name());
+		result.set_value(proto.value());
+
+		return result;
+	}
+
+	PUGI__FN xml_attribute xml_node::insert_copy_after(const xml_attribute& proto, const xml_attribute& attr)
+	{
+		if (!proto) return xml_attribute();
+
+		xml_attribute result = insert_attribute_after(proto.name(), attr);
+		result.set_value(proto.value());
+
+		return result;
+	}
+
+	PUGI__FN xml_attribute xml_node::insert_copy_before(const xml_attribute& proto, const xml_attribute& attr)
+	{
+		if (!proto) return xml_attribute();
+
+		xml_attribute result = insert_attribute_before(proto.name(), attr);
+		result.set_value(proto.value());
+
+		return result;
+	}
+
+	PUGI__FN xml_node xml_node::append_child(xml_node_type type_)
+	{
+		if (!impl::allow_insert_child(type(), type_)) return xml_node();
+		
+		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+		if (!n) return xml_node();
+
+		impl::append_node(n._root, _root);
+
+		if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
+
+		return n;
+	}
+
+	PUGI__FN xml_node xml_node::prepend_child(xml_node_type type_)
+	{
+		if (!impl::allow_insert_child(type(), type_)) return xml_node();
+		
+		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+		if (!n) return xml_node();
+
+		impl::prepend_node(n._root, _root);
+				
+		if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
+
+		return n;
+	}
+
+	PUGI__FN xml_node xml_node::insert_child_before(xml_node_type type_, const xml_node& node)
+	{
+		if (!impl::allow_insert_child(type(), type_)) return xml_node();
+		if (!node._root || node._root->parent != _root) return xml_node();
+	
+		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+		if (!n) return xml_node();
+
+		impl::insert_node_before(n._root, node._root);
+
+		if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
+
+		return n;
+	}
+
+	PUGI__FN xml_node xml_node::insert_child_after(xml_node_type type_, const xml_node& node)
+	{
+		if (!impl::allow_insert_child(type(), type_)) return xml_node();
+		if (!node._root || node._root->parent != _root) return xml_node();
+	
+		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+		if (!n) return xml_node();
+
+		impl::insert_node_after(n._root, node._root);
+
+		if (type_ == node_declaration) n.set_name(PUGIXML_TEXT("xml"));
+
+		return n;
+	}
+
+	PUGI__FN xml_node xml_node::append_child(const char_t* name_)
+	{
+		xml_node result = append_child(node_element);
+
+		result.set_name(name_);
+
+		return result;
+	}
+
+	PUGI__FN xml_node xml_node::prepend_child(const char_t* name_)
+	{
+		xml_node result = prepend_child(node_element);
+
+		result.set_name(name_);
+
+		return result;
+	}
+
+	PUGI__FN xml_node xml_node::insert_child_after(const char_t* name_, const xml_node& node)
+	{
+		xml_node result = insert_child_after(node_element, node);
+
+		result.set_name(name_);
+
+		return result;
+	}
+
+	PUGI__FN xml_node xml_node::insert_child_before(const char_t* name_, const xml_node& node)
+	{
+		xml_node result = insert_child_before(node_element, node);
+
+		result.set_name(name_);
+
+		return result;
+	}
+
+	PUGI__FN xml_node xml_node::append_copy(const xml_node& proto)
+	{
+		xml_node_type type_ = proto.type();
+		if (!impl::allow_insert_child(type(), type_)) return xml_node();
+
+		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+		if (!n) return xml_node();
+
+		impl::append_node(n._root, _root);
+		impl::node_copy_tree(n._root, proto._root);
+
+		return n;
+	}
+
+	PUGI__FN xml_node xml_node::prepend_copy(const xml_node& proto)
+	{
+		xml_node_type type_ = proto.type();
+		if (!impl::allow_insert_child(type(), type_)) return xml_node();
+
+		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+		if (!n) return xml_node();
+
+		impl::prepend_node(n._root, _root);
+		impl::node_copy_tree(n._root, proto._root);
+
+		return n;
+	}
+
+	PUGI__FN xml_node xml_node::insert_copy_after(const xml_node& proto, const xml_node& node)
+	{
+		xml_node_type type_ = proto.type();
+		if (!impl::allow_insert_child(type(), type_)) return xml_node();
+		if (!node._root || node._root->parent != _root) return xml_node();
+
+		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+		if (!n) return xml_node();
+
+		impl::insert_node_after(n._root, node._root);
+		impl::node_copy_tree(n._root, proto._root);
+
+		return n;
+	}
+
+	PUGI__FN xml_node xml_node::insert_copy_before(const xml_node& proto, const xml_node& node)
+	{
+		xml_node_type type_ = proto.type();
+		if (!impl::allow_insert_child(type(), type_)) return xml_node();
+		if (!node._root || node._root->parent != _root) return xml_node();
+
+		xml_node n(impl::allocate_node(impl::get_allocator(_root), type_));
+		if (!n) return xml_node();
+
+		impl::insert_node_before(n._root, node._root);
+		impl::node_copy_tree(n._root, proto._root);
+
+		return n;
+	}
+
+	PUGI__FN xml_node xml_node::append_move(const xml_node& moved)
+	{
+		if (!impl::allow_move(*this, moved)) return xml_node();
+
+		// disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers
+		impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;
+
+		impl::remove_node(moved._root);
+		impl::append_node(moved._root, _root);
+
+		return moved;
+	}
+
+	PUGI__FN xml_node xml_node::prepend_move(const xml_node& moved)
+	{
+		if (!impl::allow_move(*this, moved)) return xml_node();
+
+		// disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers
+		impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;
+
+		impl::remove_node(moved._root);
+		impl::prepend_node(moved._root, _root);
+
+		return moved;
+	}
+
+	PUGI__FN xml_node xml_node::insert_move_after(const xml_node& moved, const xml_node& node)
+	{
+		if (!impl::allow_move(*this, moved)) return xml_node();
+		if (!node._root || node._root->parent != _root) return xml_node();
+		if (moved._root == node._root) return xml_node();
+
+		// disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers
+		impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;
+
+		impl::remove_node(moved._root);
+		impl::insert_node_after(moved._root, node._root);
+
+		return moved;
+	}
+
+	PUGI__FN xml_node xml_node::insert_move_before(const xml_node& moved, const xml_node& node)
+	{
+		if (!impl::allow_move(*this, moved)) return xml_node();
+		if (!node._root || node._root->parent != _root) return xml_node();
+		if (moved._root == node._root) return xml_node();
+
+		// disable document_buffer_order optimization since moving nodes around changes document order without changing buffer pointers
+		impl::get_document(_root).header |= impl::xml_memory_page_contents_shared_mask;
+
+		impl::remove_node(moved._root);
+		impl::insert_node_before(moved._root, node._root);
+
+		return moved;
+	}
+
+	PUGI__FN bool xml_node::remove_attribute(const char_t* name_)
+	{
+		return remove_attribute(attribute(name_));
+	}
+
+	PUGI__FN bool xml_node::remove_attribute(const xml_attribute& a)
+	{
+		if (!_root || !a._attr) return false;
+		if (!impl::is_attribute_of(a._attr, _root)) return false;
+
+		impl::remove_attribute(a._attr, _root);
+		impl::destroy_attribute(a._attr, impl::get_allocator(_root));
+
+		return true;
+	}
+
+	PUGI__FN bool xml_node::remove_child(const char_t* name_)
+	{
+		return remove_child(child(name_));
+	}
+
+	PUGI__FN bool xml_node::remove_child(const xml_node& n)
+	{
+		if (!_root || !n._root || n._root->parent != _root) return false;
+
+		impl::remove_node(n._root);
+		impl::destroy_node(n._root, impl::get_allocator(_root));
+
+		return true;
+	}
+
+	PUGI__FN xml_parse_result xml_node::append_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding)
+	{
+		// append_buffer is only valid for elements/documents
+		if (!impl::allow_insert_child(type(), node_element)) return impl::make_parse_result(status_append_invalid_root);
+
+		// get document node
+		impl::xml_document_struct* doc = &impl::get_document(_root);
+
+		// disable document_buffer_order optimization since in a document with multiple buffers comparing buffer pointers does not make sense
+		doc->header |= impl::xml_memory_page_contents_shared_mask;
+		
+		// get extra buffer element (we'll store the document fragment buffer there so that we can deallocate it later)
+		impl::xml_memory_page* page = 0;
+		impl::xml_extra_buffer* extra = static_cast<impl::xml_extra_buffer*>(doc->allocate_memory(sizeof(impl::xml_extra_buffer), page));
+		(void)page;
+
+		if (!extra) return impl::make_parse_result(status_out_of_memory);
+
+		// save name; name of the root has to be NULL before parsing - otherwise closing node mismatches will not be detected at the top level
+		char_t* rootname = _root->name;
+		_root->name = 0;
+
+		// parse
+		char_t* buffer = 0;
+		xml_parse_result res = impl::load_buffer_impl(doc, _root, const_cast<void*>(contents), size, options, encoding, false, false, &buffer);
+
+		// restore name
+		_root->name = rootname;
+
+		// add extra buffer to the list
+		extra->buffer = buffer;
+		extra->next = doc->extra_buffers;
+		doc->extra_buffers = extra;
+
+		return res;
+	}
+
+	PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* name_, const char_t* attr_name, const char_t* attr_value) const
+	{
+		if (!_root) return xml_node();
+		
+		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+			if (i->name && impl::strequal(name_, i->name))
+			{
+				for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute)
+					if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value : PUGIXML_TEXT("")))
+						return xml_node(i);
+			}
+
+		return xml_node();
+	}
+
+	PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const
+	{
+		if (!_root) return xml_node();
+		
+		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+			for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute)
+				if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value : PUGIXML_TEXT("")))
+					return xml_node(i);
+
+		return xml_node();
+	}
+
+#ifndef PUGIXML_NO_STL
+	PUGI__FN string_t xml_node::path(char_t delimiter) const
+	{
+		xml_node cursor = *this; // Make a copy.
+		
+		string_t result = cursor.name();
+
+		while (cursor.parent())
+		{
+			cursor = cursor.parent();
+			
+			string_t temp = cursor.name();
+			temp += delimiter;
+			temp += result;
+			result.swap(temp);
+		}
+
+		return result;
+	}
+#endif
+
+	PUGI__FN xml_node xml_node::first_element_by_path(const char_t* path_, char_t delimiter) const
+	{
+		xml_node found = *this; // Current search context.
+
+		if (!_root || !path_ || !path_[0]) return found;
+
+		if (path_[0] == delimiter)
+		{
+			// Absolute path; e.g. '/foo/bar'
+			found = found.root();
+			++path_;
+		}
+
+		const char_t* path_segment = path_;
+
+		while (*path_segment == delimiter) ++path_segment;
+
+		const char_t* path_segment_end = path_segment;
+
+		while (*path_segment_end && *path_segment_end != delimiter) ++path_segment_end;
+
+		if (path_segment == path_segment_end) return found;
+
+		const char_t* next_segment = path_segment_end;
+
+		while (*next_segment == delimiter) ++next_segment;
+
+		if (*path_segment == '.' && path_segment + 1 == path_segment_end)
+			return found.first_element_by_path(next_segment, delimiter);
+		else if (*path_segment == '.' && *(path_segment+1) == '.' && path_segment + 2 == path_segment_end)
+			return found.parent().first_element_by_path(next_segment, delimiter);
+		else
+		{
+			for (xml_node_struct* j = found._root->first_child; j; j = j->next_sibling)
+			{
+				if (j->name && impl::strequalrange(j->name, path_segment, static_cast<size_t>(path_segment_end - path_segment)))
+				{
+					xml_node subsearch = xml_node(j).first_element_by_path(next_segment, delimiter);
+
+					if (subsearch) return subsearch;
+				}
+			}
+
+			return xml_node();
+		}
+	}
+
+	PUGI__FN bool xml_node::traverse(xml_tree_walker& walker)
+	{
+		walker._depth = -1;
+		
+		xml_node arg_begin = *this;
+		if (!walker.begin(arg_begin)) return false;
+
+		xml_node cur = first_child();
+				
+		if (cur)
+		{
+			++walker._depth;
+
+			do 
+			{
+				xml_node arg_for_each = cur;
+				if (!walker.for_each(arg_for_each))
+					return false;
+						
+				if (cur.first_child())
+				{
+					++walker._depth;
+					cur = cur.first_child();
+				}
+				else if (cur.next_sibling())
+					cur = cur.next_sibling();
+				else
+				{
+					// Borland C++ workaround
+					while (!cur.next_sibling() && cur != *this && !cur.parent().empty())
+					{
+						--walker._depth;
+						cur = cur.parent();
+					}
+						
+					if (cur != *this)
+						cur = cur.next_sibling();
+				}
+			}
+			while (cur && cur != *this);
+		}
+
+		assert(walker._depth == -1);
+
+		xml_node arg_end = *this;
+		return walker.end(arg_end);
+	}
+
+	PUGI__FN size_t xml_node::hash_value() const
+	{
+		return static_cast<size_t>(reinterpret_cast<uintptr_t>(_root) / sizeof(xml_node_struct));
+	}
+
+	PUGI__FN xml_node_struct* xml_node::internal_object() const
+	{
+		return _root;
+	}
+
+	PUGI__FN void xml_node::print(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const
+	{
+		if (!_root) return;
+
+		impl::xml_buffered_writer buffered_writer(writer, encoding);
+
+		impl::node_output(buffered_writer, _root, indent, flags, depth);
+	}
+
+#ifndef PUGIXML_NO_STL
+	PUGI__FN void xml_node::print(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const
+	{
+		xml_writer_stream writer(stream);
+
+		print(writer, indent, flags, encoding, depth);
+	}
+
+	PUGI__FN void xml_node::print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags, unsigned int depth) const
+	{
+		xml_writer_stream writer(stream);
+
+		print(writer, indent, flags, encoding_wchar, depth);
+	}
+#endif
+
+	PUGI__FN ptrdiff_t xml_node::offset_debug() const
+	{
+		if (!_root) return -1;
+
+		impl::xml_document_struct& doc = impl::get_document(_root);
+
+		// we can determine the offset reliably only if there is exactly once parse buffer
+		if (!doc.buffer || doc.extra_buffers) return -1;
+
+		switch (type())
+		{
+		case node_document:
+			return 0;
+
+		case node_element:
+		case node_declaration:
+		case node_pi:
+			return _root->name && (_root->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0 ? _root->name - doc.buffer : -1;
+
+		case node_pcdata:
+		case node_cdata:
+		case node_comment:
+		case node_doctype:
+			return _root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0 ? _root->value - doc.buffer : -1;
+
+		default:
+			return -1;
+		}
+	}
+
+#ifdef __BORLANDC__
+	PUGI__FN bool operator&&(const xml_node& lhs, bool rhs)
+	{
+		return (bool)lhs && rhs;
+	}
+
+	PUGI__FN bool operator||(const xml_node& lhs, bool rhs)
+	{
+		return (bool)lhs || rhs;
+	}
+#endif
+
+	PUGI__FN xml_text::xml_text(xml_node_struct* root): _root(root)
+	{
+	}
+
+	PUGI__FN xml_node_struct* xml_text::_data() const
+	{
+		if (!_root || impl::is_text_node(_root)) return _root;
+
+		for (xml_node_struct* node = _root->first_child; node; node = node->next_sibling)
+			if (impl::is_text_node(node))
+				return node;
+
+		return 0;
+	}
+
+	PUGI__FN xml_node_struct* xml_text::_data_new()
+	{
+		xml_node_struct* d = _data();
+		if (d) return d;
+
+		return xml_node(_root).append_child(node_pcdata).internal_object();
+	}
+
+	PUGI__FN xml_text::xml_text(): _root(0)
+	{
+	}
+
+	PUGI__FN static void unspecified_bool_xml_text(xml_text***)
+	{
+	}
+
+	PUGI__FN xml_text::operator xml_text::unspecified_bool_type() const
+	{
+		return _data() ? unspecified_bool_xml_text : 0;
+	}
+
+	PUGI__FN bool xml_text::operator!() const
+	{
+		return !_data();
+	}
+
+	PUGI__FN bool xml_text::empty() const
+	{
+		return _data() == 0;
+	}
+
+	PUGI__FN const char_t* xml_text::get() const
+	{
+		xml_node_struct* d = _data();
+
+		return (d && d->value) ? d->value : PUGIXML_TEXT("");
+	}
+
+	PUGI__FN const char_t* xml_text::as_string(const char_t* def) const
+	{
+		xml_node_struct* d = _data();
+
+		return (d && d->value) ? d->value : def;
+	}
+
+	PUGI__FN int xml_text::as_int(int def) const
+	{
+		xml_node_struct* d = _data();
+
+		return impl::get_value_int(d ? d->value : 0, def);
+	}
+
+	PUGI__FN unsigned int xml_text::as_uint(unsigned int def) const
+	{
+		xml_node_struct* d = _data();
+
+		return impl::get_value_uint(d ? d->value : 0, def);
+	}
+
+	PUGI__FN double xml_text::as_double(double def) const
+	{
+		xml_node_struct* d = _data();
+
+		return impl::get_value_double(d ? d->value : 0, def);
+	}
+
+	PUGI__FN float xml_text::as_float(float def) const
+	{
+		xml_node_struct* d = _data();
+
+		return impl::get_value_float(d ? d->value : 0, def);
+	}
+
+	PUGI__FN bool xml_text::as_bool(bool def) const
+	{
+		xml_node_struct* d = _data();
+
+		return impl::get_value_bool(d ? d->value : 0, def);
+	}
+
+#ifdef PUGIXML_HAS_LONG_LONG
+	PUGI__FN long long xml_text::as_llong(long long def) const
+	{
+		xml_node_struct* d = _data();
+
+		return impl::get_value_llong(d ? d->value : 0, def);
+	}
+
+	PUGI__FN unsigned long long xml_text::as_ullong(unsigned long long def) const
+	{
+		xml_node_struct* d = _data();
+
+		return impl::get_value_ullong(d ? d->value : 0, def);
+	}
+#endif
+
+	PUGI__FN bool xml_text::set(const char_t* rhs)
+	{
+		xml_node_struct* dn = _data_new();
+
+		return dn ? impl::strcpy_insitu(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+	}
+
+	PUGI__FN bool xml_text::set(int rhs)
+	{
+		xml_node_struct* dn = _data_new();
+
+		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+	}
+
+	PUGI__FN bool xml_text::set(unsigned int rhs)
+	{
+		xml_node_struct* dn = _data_new();
+
+		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+	}
+
+	PUGI__FN bool xml_text::set(float rhs)
+	{
+		xml_node_struct* dn = _data_new();
+
+		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+	}
+
+	PUGI__FN bool xml_text::set(double rhs)
+	{
+		xml_node_struct* dn = _data_new();
+
+		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+	}
+
+	PUGI__FN bool xml_text::set(bool rhs)
+	{
+		xml_node_struct* dn = _data_new();
+
+		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+	}
+
+#ifdef PUGIXML_HAS_LONG_LONG
+	PUGI__FN bool xml_text::set(long long rhs)
+	{
+		xml_node_struct* dn = _data_new();
+
+		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+	}
+
+	PUGI__FN bool xml_text::set(unsigned long long rhs)
+	{
+		xml_node_struct* dn = _data_new();
+
+		return dn ? impl::set_value_convert(dn->value, dn->header, impl::xml_memory_page_value_allocated_mask, rhs) : false;
+	}
+#endif
+
+	PUGI__FN xml_text& xml_text::operator=(const char_t* rhs)
+	{
+		set(rhs);
+		return *this;
+	}
+
+	PUGI__FN xml_text& xml_text::operator=(int rhs)
+	{
+		set(rhs);
+		return *this;
+	}
+
+	PUGI__FN xml_text& xml_text::operator=(unsigned int rhs)
+	{
+		set(rhs);
+		return *this;
+	}
+
+	PUGI__FN xml_text& xml_text::operator=(double rhs)
+	{
+		set(rhs);
+		return *this;
+	}
+
+	PUGI__FN xml_text& xml_text::operator=(float rhs)
+	{
+		set(rhs);
+		return *this;
+	}
+
+	PUGI__FN xml_text& xml_text::operator=(bool rhs)
+	{
+		set(rhs);
+		return *this;
+	}
+
+#ifdef PUGIXML_HAS_LONG_LONG
+	PUGI__FN xml_text& xml_text::operator=(long long rhs)
+	{
+		set(rhs);
+		return *this;
+	}
+
+	PUGI__FN xml_text& xml_text::operator=(unsigned long long rhs)
+	{
+		set(rhs);
+		return *this;
+	}
+#endif
+
+	PUGI__FN xml_node xml_text::data() const
+	{
+		return xml_node(_data());
+	}
+
+#ifdef __BORLANDC__
+	PUGI__FN bool operator&&(const xml_text& lhs, bool rhs)
+	{
+		return (bool)lhs && rhs;
+	}
+
+	PUGI__FN bool operator||(const xml_text& lhs, bool rhs)
+	{
+		return (bool)lhs || rhs;
+	}
+#endif
+
+	PUGI__FN xml_node_iterator::xml_node_iterator()
+	{
+	}
+
+	PUGI__FN xml_node_iterator::xml_node_iterator(const xml_node& node): _wrap(node), _parent(node.parent())
+	{
+	}
+
+	PUGI__FN xml_node_iterator::xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent)
+	{
+	}
+
+	PUGI__FN bool xml_node_iterator::operator==(const xml_node_iterator& rhs) const
+	{
+		return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root;
+	}
+	
+	PUGI__FN bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const
+	{
+		return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root;
+	}
+
+	PUGI__FN xml_node& xml_node_iterator::operator*() const
+	{
+		assert(_wrap._root);
+		return _wrap;
+	}
+
+	PUGI__FN xml_node* xml_node_iterator::operator->() const
+	{
+		assert(_wrap._root);
+		return const_cast<xml_node*>(&_wrap); // BCC32 workaround
+	}
+
+	PUGI__FN const xml_node_iterator& xml_node_iterator::operator++()
+	{
+		assert(_wrap._root);
+		_wrap._root = _wrap._root->next_sibling;
+		return *this;
+	}
+
+	PUGI__FN xml_node_iterator xml_node_iterator::operator++(int)
+	{
+		xml_node_iterator temp = *this;
+		++*this;
+		return temp;
+	}
+
+	PUGI__FN const xml_node_iterator& xml_node_iterator::operator--()
+	{
+		_wrap = _wrap._root ? _wrap.previous_sibling() : _parent.last_child();
+		return *this;
+	}
+
+	PUGI__FN xml_node_iterator xml_node_iterator::operator--(int)
+	{
+		xml_node_iterator temp = *this;
+		--*this;
+		return temp;
+	}
+
+	PUGI__FN xml_attribute_iterator::xml_attribute_iterator()
+	{
+	}
+
+	PUGI__FN xml_attribute_iterator::xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent): _wrap(attr), _parent(parent)
+	{
+	}
+
+	PUGI__FN xml_attribute_iterator::xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent): _wrap(ref), _parent(parent)
+	{
+	}
+
+	PUGI__FN bool xml_attribute_iterator::operator==(const xml_attribute_iterator& rhs) const
+	{
+		return _wrap._attr == rhs._wrap._attr && _parent._root == rhs._parent._root;
+	}
+	
+	PUGI__FN bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const
+	{
+		return _wrap._attr != rhs._wrap._attr || _parent._root != rhs._parent._root;
+	}
+
+	PUGI__FN xml_attribute& xml_attribute_iterator::operator*() const
+	{
+		assert(_wrap._attr);
+		return _wrap;
+	}
+
+	PUGI__FN xml_attribute* xml_attribute_iterator::operator->() const
+	{
+		assert(_wrap._attr);
+		return const_cast<xml_attribute*>(&_wrap); // BCC32 workaround
+	}
+
+	PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator++()
+	{
+		assert(_wrap._attr);
+		_wrap._attr = _wrap._attr->next_attribute;
+		return *this;
+	}
+
+	PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator++(int)
+	{
+		xml_attribute_iterator temp = *this;
+		++*this;
+		return temp;
+	}
+
+	PUGI__FN const xml_attribute_iterator& xml_attribute_iterator::operator--()
+	{
+		_wrap = _wrap._attr ? _wrap.previous_attribute() : _parent.last_attribute();
+		return *this;
+	}
+
+	PUGI__FN xml_attribute_iterator xml_attribute_iterator::operator--(int)
+	{
+		xml_attribute_iterator temp = *this;
+		--*this;
+		return temp;
+	}
+
+	PUGI__FN xml_named_node_iterator::xml_named_node_iterator(): _name(0)
+	{
+	}
+
+	PUGI__FN xml_named_node_iterator::xml_named_node_iterator(const xml_node& node, const char_t* name): _wrap(node), _parent(node.parent()), _name(name)
+	{
+	}
+
+	PUGI__FN xml_named_node_iterator::xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name): _wrap(ref), _parent(parent), _name(name)
+	{
+	}
+
+	PUGI__FN bool xml_named_node_iterator::operator==(const xml_named_node_iterator& rhs) const
+	{
+		return _wrap._root == rhs._wrap._root && _parent._root == rhs._parent._root;
+	}
+
+	PUGI__FN bool xml_named_node_iterator::operator!=(const xml_named_node_iterator& rhs) const
+	{
+		return _wrap._root != rhs._wrap._root || _parent._root != rhs._parent._root;
+	}
+
+	PUGI__FN xml_node& xml_named_node_iterator::operator*() const
+	{
+		assert(_wrap._root);
+		return _wrap;
+	}
+
+	PUGI__FN xml_node* xml_named_node_iterator::operator->() const
+	{
+		assert(_wrap._root);
+		return const_cast<xml_node*>(&_wrap); // BCC32 workaround
+	}
+
+	PUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator++()
+	{
+		assert(_wrap._root);
+		_wrap = _wrap.next_sibling(_name);
+		return *this;
+	}
+
+	PUGI__FN xml_named_node_iterator xml_named_node_iterator::operator++(int)
+	{
+		xml_named_node_iterator temp = *this;
+		++*this;
+		return temp;
+	}
+
+	PUGI__FN const xml_named_node_iterator& xml_named_node_iterator::operator--()
+	{
+		if (_wrap._root)
+			_wrap = _wrap.previous_sibling(_name);
+		else
+		{
+			_wrap = _parent.last_child();
+
+			if (!impl::strequal(_wrap.name(), _name))
+				_wrap = _wrap.previous_sibling(_name);
+		}
+
+		return *this;
+	}
+
+	PUGI__FN xml_named_node_iterator xml_named_node_iterator::operator--(int)
+	{
+		xml_named_node_iterator temp = *this;
+		--*this;
+		return temp;
+	}
+
+	PUGI__FN xml_parse_result::xml_parse_result(): status(status_internal_error), offset(0), encoding(encoding_auto)
+	{
+	}
+
+	PUGI__FN xml_parse_result::operator bool() const
+	{
+		return status == status_ok;
+	}
+
+	PUGI__FN const char* xml_parse_result::description() const
+	{
+		switch (status)
+		{
+		case status_ok: return "No error";
+
+		case status_file_not_found: return "File was not found";
+		case status_io_error: return "Error reading from file/stream";
+		case status_out_of_memory: return "Could not allocate memory";
+		case status_internal_error: return "Internal error occurred";
+
+		case status_unrecognized_tag: return "Could not determine tag type";
+
+		case status_bad_pi: return "Error parsing document declaration/processing instruction";
+		case status_bad_comment: return "Error parsing comment";
+		case status_bad_cdata: return "Error parsing CDATA section";
+		case status_bad_doctype: return "Error parsing document type declaration";
+		case status_bad_pcdata: return "Error parsing PCDATA section";
+		case status_bad_start_element: return "Error parsing start element tag";
+		case status_bad_attribute: return "Error parsing element attribute";
+		case status_bad_end_element: return "Error parsing end element tag";
+		case status_end_element_mismatch: return "Start-end tags mismatch";
+
+		case status_append_invalid_root: return "Unable to append nodes: root is not an element or document";
+
+		case status_no_document_element: return "No document element found";
+
+		default: return "Unknown error";
+		}
+	}
+
+	PUGI__FN xml_document::xml_document(): _buffer(0)
+	{
+		create();
+	}
+
+	PUGI__FN xml_document::~xml_document()
+	{
+		destroy();
+	}
+
+	PUGI__FN void xml_document::reset()
+	{
+		destroy();
+		create();
+	}
+
+	PUGI__FN void xml_document::reset(const xml_document& proto)
+	{
+		reset();
+
+		for (xml_node cur = proto.first_child(); cur; cur = cur.next_sibling())
+			append_copy(cur);
+	}
+
+	PUGI__FN void xml_document::create()
+	{
+		assert(!_root);
+
+		// initialize sentinel page
+		PUGI__STATIC_ASSERT(sizeof(impl::xml_memory_page) + sizeof(impl::xml_document_struct) + impl::xml_memory_page_alignment - sizeof(void*) <= sizeof(_memory));
+
+		// align upwards to page boundary
+		void* page_memory = reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(_memory) + (impl::xml_memory_page_alignment - 1)) & ~(impl::xml_memory_page_alignment - 1));
+
+		// prepare page structure
+		impl::xml_memory_page* page = impl::xml_memory_page::construct(page_memory);
+		assert(page);
+
+		page->busy_size = impl::xml_memory_page_size;
+
+		// allocate new root
+		_root = new (reinterpret_cast<char*>(page) + sizeof(impl::xml_memory_page)) impl::xml_document_struct(page);
+		_root->prev_sibling_c = _root;
+
+		// setup sentinel page
+		page->allocator = static_cast<impl::xml_document_struct*>(_root);
+
+		// verify the document allocation
+		assert(reinterpret_cast<char*>(_root) + sizeof(impl::xml_document_struct) <= _memory + sizeof(_memory));
+	}
+
+	PUGI__FN void xml_document::destroy()
+	{
+		assert(_root);
+
+		// destroy static storage
+		if (_buffer)
+		{
+			impl::xml_memory::deallocate(_buffer);
+			_buffer = 0;
+		}
+
+		// destroy extra buffers (note: no need to destroy linked list nodes, they're allocated using document allocator)
+		for (impl::xml_extra_buffer* extra = static_cast<impl::xml_document_struct*>(_root)->extra_buffers; extra; extra = extra->next)
+		{
+			if (extra->buffer) impl::xml_memory::deallocate(extra->buffer);
+		}
+
+		// destroy dynamic storage, leave sentinel page (it's in static memory)
+		impl::xml_memory_page* root_page = reinterpret_cast<impl::xml_memory_page*>(_root->header & impl::xml_memory_page_pointer_mask);
+		assert(root_page && !root_page->prev);
+		assert(reinterpret_cast<char*>(root_page) >= _memory && reinterpret_cast<char*>(root_page) < _memory + sizeof(_memory));
+
+		for (impl::xml_memory_page* page = root_page->next; page; )
+		{
+			impl::xml_memory_page* next = page->next;
+
+			impl::xml_allocator::deallocate_page(page);
+
+			page = next;
+		}
+
+		_root = 0;
+	}
+
+#ifndef PUGIXML_NO_STL
+	PUGI__FN xml_parse_result xml_document::load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options, xml_encoding encoding)
+	{
+		reset();
+
+		return impl::load_stream_impl(*this, stream, options, encoding);
+	}
+
+	PUGI__FN xml_parse_result xml_document::load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options)
+	{
+		reset();
+
+		return impl::load_stream_impl(*this, stream, options, encoding_wchar);
+	}
+#endif
+
+	PUGI__FN xml_parse_result xml_document::load_string(const char_t* contents, unsigned int options)
+	{
+		// Force native encoding (skip autodetection)
+	#ifdef PUGIXML_WCHAR_MODE
+		xml_encoding encoding = encoding_wchar;
+	#else
+		xml_encoding encoding = encoding_utf8;
+	#endif
+
+		return load_buffer(contents, impl::strlength(contents) * sizeof(char_t), options, encoding);
+	}
+
+	PUGI__FN xml_parse_result xml_document::load(const char_t* contents, unsigned int options)
+	{
+		return load_string(contents, options);
+	}
+
+	PUGI__FN xml_parse_result xml_document::load_file(const char* path_, unsigned int options, xml_encoding encoding)
+	{
+		reset();
+
+		FILE* file = fopen(path_, "rb");
+
+		return impl::load_file_impl(*this, file, options, encoding);
+	}
+
+	PUGI__FN xml_parse_result xml_document::load_file(const wchar_t* path_, unsigned int options, xml_encoding encoding)
+	{
+		reset();
+
+		FILE* file = impl::open_file_wide(path_, L"rb");
+
+		return impl::load_file_impl(*this, file, options, encoding);
+	}
+
+	PUGI__FN xml_parse_result xml_document::load_buffer(const void* contents, size_t size, unsigned int options, xml_encoding encoding)
+	{
+		reset();
+
+		return impl::load_buffer_impl(static_cast<impl::xml_document_struct*>(_root), _root, const_cast<void*>(contents), size, options, encoding, false, false, &_buffer);
+	}
+
+	PUGI__FN xml_parse_result xml_document::load_buffer_inplace(void* contents, size_t size, unsigned int options, xml_encoding encoding)
+	{
+		reset();
+
+		return impl::load_buffer_impl(static_cast<impl::xml_document_struct*>(_root), _root, contents, size, options, encoding, true, false, &_buffer);
+	}
+
+	PUGI__FN xml_parse_result xml_document::load_buffer_inplace_own(void* contents, size_t size, unsigned int options, xml_encoding encoding)
+	{
+		reset();
+
+		return impl::load_buffer_impl(static_cast<impl::xml_document_struct*>(_root), _root, contents, size, options, encoding, true, true, &_buffer);
+	}
+
+	PUGI__FN void xml_document::save(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding) const
+	{
+		impl::xml_buffered_writer buffered_writer(writer, encoding);
+
+		if ((flags & format_write_bom) && encoding != encoding_latin1)
+		{
+			// BOM always represents the codepoint U+FEFF, so just write it in native encoding
+		#ifdef PUGIXML_WCHAR_MODE
+			unsigned int bom = 0xfeff;
+			buffered_writer.write(static_cast<wchar_t>(bom));
+		#else
+			buffered_writer.write('\xef', '\xbb', '\xbf');
+		#endif
+		}
+
+		if (!(flags & format_no_declaration) && !impl::has_declaration(_root))
+		{
+			buffered_writer.write_string(PUGIXML_TEXT("<?xml version=\"1.0\""));
+			if (encoding == encoding_latin1) buffered_writer.write_string(PUGIXML_TEXT(" encoding=\"ISO-8859-1\""));
+			buffered_writer.write('?', '>');
+			if (!(flags & format_raw)) buffered_writer.write('\n');
+		}
+
+		impl::node_output(buffered_writer, _root, indent, flags, 0);
+	}
+
+#ifndef PUGIXML_NO_STL
+	PUGI__FN void xml_document::save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent, unsigned int flags, xml_encoding encoding) const
+	{
+		xml_writer_stream writer(stream);
+
+		save(writer, indent, flags, encoding);
+	}
+
+	PUGI__FN void xml_document::save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent, unsigned int flags) const
+	{
+		xml_writer_stream writer(stream);
+
+		save(writer, indent, flags, encoding_wchar);
+	}
+#endif
+
+	PUGI__FN bool xml_document::save_file(const char* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const
+	{
+		FILE* file = fopen(path_, (flags & format_save_file_text) ? "w" : "wb");
+		return impl::save_file_impl(*this, file, indent, flags, encoding);
+	}
+
+	PUGI__FN bool xml_document::save_file(const wchar_t* path_, const char_t* indent, unsigned int flags, xml_encoding encoding) const
+	{
+		FILE* file = impl::open_file_wide(path_, (flags & format_save_file_text) ? L"w" : L"wb");
+		return impl::save_file_impl(*this, file, indent, flags, encoding);
+	}
+
+	PUGI__FN xml_node xml_document::document_element() const
+	{
+		assert(_root);
+
+		for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+			if (PUGI__NODETYPE(i) == node_element)
+				return xml_node(i);
+
+		return xml_node();
+	}
+
+#ifndef PUGIXML_NO_STL
+	PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const wchar_t* str)
+	{
+		assert(str);
+
+		return impl::as_utf8_impl(str, impl::strlength_wide(str));
+	}
+
+	PUGI__FN std::string PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t>& str)
+	{
+		return impl::as_utf8_impl(str.c_str(), str.size());
+	}
+	
+	PUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const char* str)
+	{
+		assert(str);
+
+		return impl::as_wide_impl(str, strlen(str));
+	}
+	
+	PUGI__FN std::basic_string<wchar_t> PUGIXML_FUNCTION as_wide(const std::string& str)
+	{
+		return impl::as_wide_impl(str.c_str(), str.size());
+	}
+#endif
+
+	PUGI__FN void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate)
+	{
+		impl::xml_memory::allocate = allocate;
+		impl::xml_memory::deallocate = deallocate;
+	}
+
+	PUGI__FN allocation_function PUGIXML_FUNCTION get_memory_allocation_function()
+	{
+		return impl::xml_memory::allocate;
+	}
+
+	PUGI__FN deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function()
+	{
+		return impl::xml_memory::deallocate;
+	}
+}
+
+#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
+namespace std
+{
+	// Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier)
+	PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_node_iterator&)
+	{
+		return std::bidirectional_iterator_tag();
+	}
+
+	PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_attribute_iterator&)
+	{
+		return std::bidirectional_iterator_tag();
+	}
+
+	PUGI__FN std::bidirectional_iterator_tag _Iter_cat(const pugi::xml_named_node_iterator&)
+	{
+		return std::bidirectional_iterator_tag();
+	}
+}
+#endif
+
+#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
+namespace std
+{
+	// Workarounds for (non-standard) iterator category detection
+	PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_node_iterator&)
+	{
+		return std::bidirectional_iterator_tag();
+	}
+
+	PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_attribute_iterator&)
+	{
+		return std::bidirectional_iterator_tag();
+	}
+
+	PUGI__FN std::bidirectional_iterator_tag __iterator_category(const pugi::xml_named_node_iterator&)
+	{
+		return std::bidirectional_iterator_tag();
+	}
+}
+#endif
+
+#ifndef PUGIXML_NO_XPATH
+// STL replacements
+PUGI__NS_BEGIN
+	struct equal_to
+	{
+		template <typename T> bool operator()(const T& lhs, const T& rhs) const
+		{
+			return lhs == rhs;
+		}
+	};
+
+	struct not_equal_to
+	{
+		template <typename T> bool operator()(const T& lhs, const T& rhs) const
+		{
+			return lhs != rhs;
+		}
+	};
+
+	struct less
+	{
+		template <typename T> bool operator()(const T& lhs, const T& rhs) const
+		{
+			return lhs < rhs;
+		}
+	};
+
+	struct less_equal
+	{
+		template <typename T> bool operator()(const T& lhs, const T& rhs) const
+		{
+			return lhs <= rhs;
+		}
+	};
+
+	template <typename T> void swap(T& lhs, T& rhs)
+	{
+		T temp = lhs;
+		lhs = rhs;
+		rhs = temp;
+	}
+
+	template <typename I, typename Pred> I min_element(I begin, I end, const Pred& pred)
+	{
+		I result = begin;
+
+		for (I it = begin + 1; it != end; ++it)
+			if (pred(*it, *result))
+				result = it;
+
+		return result;
+	}
+
+	template <typename I> void reverse(I begin, I end)
+	{
+		while (end - begin > 1) swap(*begin++, *--end);
+	}
+
+	template <typename I> I unique(I begin, I end)
+	{
+		// fast skip head
+		while (end - begin > 1 && *begin != *(begin + 1)) begin++;
+
+		if (begin == end) return begin;
+
+		// last written element
+		I write = begin++; 
+
+		// merge unique elements
+		while (begin != end)
+		{
+			if (*begin != *write)
+				*++write = *begin++;
+			else
+				begin++;
+		}
+
+		// past-the-end (write points to live element)
+		return write + 1;
+	}
+
+	template <typename I> void copy_backwards(I begin, I end, I target)
+	{
+		while (begin != end) *--target = *--end;
+	}
+
+	template <typename I, typename Pred, typename T> void insertion_sort(I begin, I end, const Pred& pred, T*)
+	{
+		assert(begin != end);
+
+		for (I it = begin + 1; it != end; ++it)
+		{
+			T val = *it;
+
+			if (pred(val, *begin))
+			{
+				// move to front
+				copy_backwards(begin, it, it + 1);
+				*begin = val;
+			}
+			else
+			{
+				I hole = it;
+
+				// move hole backwards
+				while (pred(val, *(hole - 1)))
+				{
+					*hole = *(hole - 1);
+					hole--;
+				}
+
+				// fill hole with element
+				*hole = val;
+			}
+		}
+	}
+
+	// std variant for elements with ==
+	template <typename I, typename Pred> void partition(I begin, I middle, I end, const Pred& pred, I* out_eqbeg, I* out_eqend)
+	{
+		I eqbeg = middle, eqend = middle + 1;
+
+		// expand equal range
+		while (eqbeg != begin && *(eqbeg - 1) == *eqbeg) --eqbeg;
+		while (eqend != end && *eqend == *eqbeg) ++eqend;
+
+		// process outer elements
+		I ltend = eqbeg, gtbeg = eqend;
+
+		for (;;)
+		{
+			// find the element from the right side that belongs to the left one
+			for (; gtbeg != end; ++gtbeg)
+				if (!pred(*eqbeg, *gtbeg))
+				{
+					if (*gtbeg == *eqbeg) swap(*gtbeg, *eqend++);
+					else break;
+				}
+
+			// find the element from the left side that belongs to the right one
+			for (; ltend != begin; --ltend)
+				if (!pred(*(ltend - 1), *eqbeg))
+				{
+					if (*eqbeg == *(ltend - 1)) swap(*(ltend - 1), *--eqbeg);
+					else break;
+				}
+
+			// scanned all elements
+			if (gtbeg == end && ltend == begin)
+			{
+				*out_eqbeg = eqbeg;
+				*out_eqend = eqend;
+				return;
+			}
+
+			// make room for elements by moving equal area
+			if (gtbeg == end)
+			{
+				if (--ltend != --eqbeg) swap(*ltend, *eqbeg);
+				swap(*eqbeg, *--eqend);
+			}
+			else if (ltend == begin)
+			{
+				if (eqend != gtbeg) swap(*eqbeg, *eqend);
+				++eqend;
+				swap(*gtbeg++, *eqbeg++);
+			}
+			else swap(*gtbeg++, *--ltend);
+		}
+	}
+
+	template <typename I, typename Pred> void median3(I first, I middle, I last, const Pred& pred)
+	{
+		if (pred(*middle, *first)) swap(*middle, *first);
+		if (pred(*last, *middle)) swap(*last, *middle);
+		if (pred(*middle, *first)) swap(*middle, *first);
+	}
+
+	template <typename I, typename Pred> void median(I first, I middle, I last, const Pred& pred)
+	{
+		if (last - first <= 40)
+		{
+			// median of three for small chunks
+			median3(first, middle, last, pred);
+		}
+		else
+		{
+			// median of nine
+			size_t step = (last - first + 1) / 8;
+
+			median3(first, first + step, first + 2 * step, pred);
+			median3(middle - step, middle, middle + step, pred);
+			median3(last - 2 * step, last - step, last, pred);
+			median3(first + step, middle, last - step, pred);
+		}
+	}
+
+	template <typename I, typename Pred> void sort(I begin, I end, const Pred& pred)
+	{
+		// sort large chunks
+		while (end - begin > 32)
+		{
+			// find median element
+			I middle = begin + (end - begin) / 2;
+			median(begin, middle, end - 1, pred);
+
+			// partition in three chunks (< = >)
+			I eqbeg, eqend;
+			partition(begin, middle, end, pred, &eqbeg, &eqend);
+
+			// loop on larger half
+			if (eqbeg - begin > end - eqend)
+			{
+				sort(eqend, end, pred);
+				end = eqbeg;
+			}
+			else
+			{
+				sort(begin, eqbeg, pred);
+				begin = eqend;
+			}
+		}
+
+		// insertion sort small chunk
+		if (begin != end) insertion_sort(begin, end, pred, &*begin);
+	}
+PUGI__NS_END
+
+// Allocator used for AST and evaluation stacks
+PUGI__NS_BEGIN
+	struct xpath_memory_block
+	{	
+		xpath_memory_block* next;
+		size_t capacity;
+
+		char data[
+	#ifdef PUGIXML_MEMORY_XPATH_PAGE_SIZE
+			PUGIXML_MEMORY_XPATH_PAGE_SIZE
+	#else
+			4096
+	#endif
+		];
+	};
+		
+	class xpath_allocator
+	{
+		xpath_memory_block* _root;
+		size_t _root_size;
+
+	public:
+	#ifdef PUGIXML_NO_EXCEPTIONS
+		jmp_buf* error_handler;
+	#endif
+
+		xpath_allocator(xpath_memory_block* root, size_t root_size = 0): _root(root), _root_size(root_size)
+		{
+		#ifdef PUGIXML_NO_EXCEPTIONS
+			error_handler = 0;
+		#endif
+		}
+		
+		void* allocate_nothrow(size_t size)
+		{
+			// align size so that we're able to store pointers in subsequent blocks
+			size = (size + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
+
+			if (_root_size + size <= _root->capacity)
+			{
+				void* buf = _root->data + _root_size;
+				_root_size += size;
+				return buf;
+			}
+			else
+			{
+				// make sure we have at least 1/4th of the page free after allocation to satisfy subsequent allocation requests
+				size_t block_capacity_base = sizeof(_root->data);
+				size_t block_capacity_req = size + block_capacity_base / 4;
+				size_t block_capacity = (block_capacity_base > block_capacity_req) ? block_capacity_base : block_capacity_req;
+
+				size_t block_size = block_capacity + offsetof(xpath_memory_block, data);
+
+				xpath_memory_block* block = static_cast<xpath_memory_block*>(xml_memory::allocate(block_size));
+				if (!block) return 0;
+				
+				block->next = _root;
+				block->capacity = block_capacity;
+				
+				_root = block;
+				_root_size = size;
+				
+				return block->data;
+			}
+		}
+
+		void* allocate(size_t size)
+		{
+			void* result = allocate_nothrow(size);
+
+			if (!result)
+			{
+			#ifdef PUGIXML_NO_EXCEPTIONS
+				assert(error_handler);
+				longjmp(*error_handler, 1);
+			#else
+				throw std::bad_alloc();
+			#endif
+			}
+
+			return result;
+		}
+
+		void* reallocate(void* ptr, size_t old_size, size_t new_size)
+		{
+			// align size so that we're able to store pointers in subsequent blocks
+			old_size = (old_size + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
+			new_size = (new_size + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
+
+			// we can only reallocate the last object
+			assert(ptr == 0 || static_cast<char*>(ptr) + old_size == _root->data + _root_size);
+
+			// adjust root size so that we have not allocated the object at all
+			bool only_object = (_root_size == old_size);
+
+			if (ptr) _root_size -= old_size;
+
+			// allocate a new version (this will obviously reuse the memory if possible)
+			void* result = allocate(new_size);
+			assert(result);
+
+			// we have a new block
+			if (result != ptr && ptr)
+			{
+				// copy old data
+				assert(new_size >= old_size);
+				memcpy(result, ptr, old_size);
+
+				// free the previous page if it had no other objects
+				if (only_object)
+				{
+					assert(_root->data == result);
+					assert(_root->next);
+
+					xpath_memory_block* next = _root->next->next;
+
+					if (next)
+					{
+						// deallocate the whole page, unless it was the first one
+						xml_memory::deallocate(_root->next);
+						_root->next = next;
+					}
+				}
+			}
+
+			return result;
+		}
+
+		void revert(const xpath_allocator& state)
+		{
+			// free all new pages
+			xpath_memory_block* cur = _root;
+
+			while (cur != state._root)
+			{
+				xpath_memory_block* next = cur->next;
+
+				xml_memory::deallocate(cur);
+
+				cur = next;
+			}
+
+			// restore state
+			_root = state._root;
+			_root_size = state._root_size;
+		}
+
+		void release()
+		{
+			xpath_memory_block* cur = _root;
+			assert(cur);
+
+			while (cur->next)
+			{
+				xpath_memory_block* next = cur->next;
+
+				xml_memory::deallocate(cur);
+
+				cur = next;
+			}
+		}
+	};
+
+	struct xpath_allocator_capture
+	{
+		xpath_allocator_capture(xpath_allocator* alloc): _target(alloc), _state(*alloc)
+		{
+		}
+
+		~xpath_allocator_capture()
+		{
+			_target->revert(_state);
+		}
+
+		xpath_allocator* _target;
+		xpath_allocator _state;
+	};
+
+	struct xpath_stack
+	{
+		xpath_allocator* result;
+		xpath_allocator* temp;
+	};
+
+	struct xpath_stack_data
+	{
+		xpath_memory_block blocks[2];
+		xpath_allocator result;
+		xpath_allocator temp;
+		xpath_stack stack;
+
+	#ifdef PUGIXML_NO_EXCEPTIONS
+		jmp_buf error_handler;
+	#endif
+
+		xpath_stack_data(): result(blocks + 0), temp(blocks + 1)
+		{
+			blocks[0].next = blocks[1].next = 0;
+			blocks[0].capacity = blocks[1].capacity = sizeof(blocks[0].data);
+
+			stack.result = &result;
+			stack.temp = &temp;
+
+		#ifdef PUGIXML_NO_EXCEPTIONS
+			result.error_handler = temp.error_handler = &error_handler;
+		#endif
+		}
+
+		~xpath_stack_data()
+		{
+			result.release();
+			temp.release();
+		}
+	};
+PUGI__NS_END
+
+// String class
+PUGI__NS_BEGIN
+	class xpath_string
+	{
+		const char_t* _buffer;
+		bool _uses_heap;
+		size_t _length_heap;
+
+		static char_t* duplicate_string(const char_t* string, size_t length, xpath_allocator* alloc)
+		{
+			char_t* result = static_cast<char_t*>(alloc->allocate((length + 1) * sizeof(char_t)));
+			assert(result);
+
+			memcpy(result, string, length * sizeof(char_t));
+			result[length] = 0;
+
+			return result;
+		}
+
+		xpath_string(const char_t* buffer, bool uses_heap_, size_t length_heap): _buffer(buffer), _uses_heap(uses_heap_), _length_heap(length_heap)
+		{
+		}
+
+	public:
+		static xpath_string from_const(const char_t* str)
+		{
+			return xpath_string(str, false, 0);
+		}
+
+		static xpath_string from_heap_preallocated(const char_t* begin, const char_t* end)
+		{
+			assert(begin <= end && *end == 0);
+
+			return xpath_string(begin, true, static_cast<size_t>(end - begin));
+		}
+
+		static xpath_string from_heap(const char_t* begin, const char_t* end, xpath_allocator* alloc)
+		{
+			assert(begin <= end);
+
+			size_t length = static_cast<size_t>(end - begin);
+
+			return length == 0 ? xpath_string() : xpath_string(duplicate_string(begin, length, alloc), true, length);
+		}
+
+		xpath_string(): _buffer(PUGIXML_TEXT("")), _uses_heap(false), _length_heap(0)
+		{
+		}
+
+		void append(const xpath_string& o, xpath_allocator* alloc)
+		{
+			// skip empty sources
+			if (!*o._buffer) return;
+
+			// fast append for constant empty target and constant source
+			if (!*_buffer && !_uses_heap && !o._uses_heap)
+			{
+				_buffer = o._buffer;
+			}
+			else
+			{
+				// need to make heap copy
+				size_t target_length = length();
+				size_t source_length = o.length();
+				size_t result_length = target_length + source_length;
+
+				// allocate new buffer
+				char_t* result = static_cast<char_t*>(alloc->reallocate(_uses_heap ? const_cast<char_t*>(_buffer) : 0, (target_length + 1) * sizeof(char_t), (result_length + 1) * sizeof(char_t)));
+				assert(result);
+
+				// append first string to the new buffer in case there was no reallocation
+				if (!_uses_heap) memcpy(result, _buffer, target_length * sizeof(char_t));
+
+				// append second string to the new buffer
+				memcpy(result + target_length, o._buffer, source_length * sizeof(char_t));
+				result[result_length] = 0;
+
+				// finalize
+				_buffer = result;
+				_uses_heap = true;
+				_length_heap = result_length;
+			}
+		}
+
+		const char_t* c_str() const
+		{
+			return _buffer;
+		}
+
+		size_t length() const
+		{
+			return _uses_heap ? _length_heap : strlength(_buffer);
+		}
+		
+		char_t* data(xpath_allocator* alloc)
+		{
+			// make private heap copy
+			if (!_uses_heap)
+			{
+				size_t length_ = strlength(_buffer);
+
+				_buffer = duplicate_string(_buffer, length_, alloc);
+				_uses_heap = true;
+				_length_heap = length_;
+			}
+
+			return const_cast<char_t*>(_buffer);
+		}
+
+		bool empty() const
+		{
+			return *_buffer == 0;
+		}
+
+		bool operator==(const xpath_string& o) const
+		{
+			return strequal(_buffer, o._buffer);
+		}
+
+		bool operator!=(const xpath_string& o) const
+		{
+			return !strequal(_buffer, o._buffer);
+		}
+
+		bool uses_heap() const
+		{
+			return _uses_heap;
+		}
+	};
+PUGI__NS_END
+
+PUGI__NS_BEGIN
+	PUGI__FN bool starts_with(const char_t* string, const char_t* pattern)
+	{
+		while (*pattern && *string == *pattern)
+		{
+			string++;
+			pattern++;
+		}
+
+		return *pattern == 0;
+	}
+
+	PUGI__FN const char_t* find_char(const char_t* s, char_t c)
+	{
+	#ifdef PUGIXML_WCHAR_MODE
+		return wcschr(s, c);
+	#else
+		return strchr(s, c);
+	#endif
+	}
+
+	PUGI__FN const char_t* find_substring(const char_t* s, const char_t* p)
+	{
+	#ifdef PUGIXML_WCHAR_MODE
+		// MSVC6 wcsstr bug workaround (if s is empty it always returns 0)
+		return (*p == 0) ? s : wcsstr(s, p);
+	#else
+		return strstr(s, p);
+	#endif
+	}
+
+	// Converts symbol to lower case, if it is an ASCII one
+	PUGI__FN char_t tolower_ascii(char_t ch)
+	{
+		return static_cast<unsigned int>(ch - 'A') < 26 ? static_cast<char_t>(ch | ' ') : ch;
+	}
+
+	PUGI__FN xpath_string string_value(const xpath_node& na, xpath_allocator* alloc)
+	{
+		if (na.attribute())
+			return xpath_string::from_const(na.attribute().value());
+		else
+		{
+			xml_node n = na.node();
+
+			switch (n.type())
+			{
+			case node_pcdata:
+			case node_cdata:
+			case node_comment:
+			case node_pi:
+				return xpath_string::from_const(n.value());
+			
+			case node_document:
+			case node_element:
+			{
+				xpath_string result;
+
+				xml_node cur = n.first_child();
+				
+				while (cur && cur != n)
+				{
+					if (cur.type() == node_pcdata || cur.type() == node_cdata)
+						result.append(xpath_string::from_const(cur.value()), alloc);
+
+					if (cur.first_child())
+						cur = cur.first_child();
+					else if (cur.next_sibling())
+						cur = cur.next_sibling();
+					else
+					{
+						while (!cur.next_sibling() && cur != n)
+							cur = cur.parent();
+
+						if (cur != n) cur = cur.next_sibling();
+					}
+				}
+				
+				return result;
+			}
+			
+			default:
+				return xpath_string();
+			}
+		}
+	}
+	
+	PUGI__FN bool node_is_before_sibling(xml_node_struct* ln, xml_node_struct* rn)
+	{
+		assert(ln->parent == rn->parent);
+
+		// there is no common ancestor (the shared parent is null), nodes are from different documents
+		if (!ln->parent) return ln < rn;
+
+		// determine sibling order
+		xml_node_struct* ls = ln;
+		xml_node_struct* rs = rn;
+
+		while (ls && rs)
+		{
+			if (ls == rn) return true;
+			if (rs == ln) return false;
+
+			ls = ls->next_sibling;
+			rs = rs->next_sibling;
+		}
+
+		// if rn sibling chain ended ln must be before rn
+		return !rs;
+	}
+	
+	PUGI__FN bool node_is_before(xml_node_struct* ln, xml_node_struct* rn)
+	{
+		// find common ancestor at the same depth, if any
+		xml_node_struct* lp = ln;
+		xml_node_struct* rp = rn;
+
+		while (lp && rp && lp->parent != rp->parent)
+		{
+			lp = lp->parent;
+			rp = rp->parent;
+		}
+
+		// parents are the same!
+		if (lp && rp) return node_is_before_sibling(lp, rp);
+
+		// nodes are at different depths, need to normalize heights
+		bool left_higher = !lp;
+
+		while (lp)
+		{
+			lp = lp->parent;
+			ln = ln->parent;
+		}
+
+		while (rp)
+		{
+			rp = rp->parent;
+			rn = rn->parent;
+		}
+
+		// one node is the ancestor of the other
+		if (ln == rn) return left_higher;
+
+		// find common ancestor... again
+		while (ln->parent != rn->parent)
+		{
+			ln = ln->parent;
+			rn = rn->parent;
+		}
+
+		return node_is_before_sibling(ln, rn);
+	}
+
+	PUGI__FN bool node_is_ancestor(xml_node_struct* parent, xml_node_struct* node)
+	{
+		while (node && node != parent) node = node->parent;
+
+		return parent && node == parent;
+	}
+
+	PUGI__FN const void* document_buffer_order(const xpath_node& xnode)
+	{
+		xml_node_struct* node = xnode.node().internal_object();
+
+		if (node)
+		{
+			if ((get_document(node).header & xml_memory_page_contents_shared_mask) == 0)
+			{
+				if (node->name && (node->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return node->name;
+				if (node->value && (node->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return node->value;
+			}
+
+			return 0;
+		}
+
+		xml_attribute_struct* attr = xnode.attribute().internal_object();
+
+		if (attr)
+		{
+			if ((get_document(attr).header & xml_memory_page_contents_shared_mask) == 0)
+			{
+				if ((attr->header & impl::xml_memory_page_name_allocated_or_shared_mask) == 0) return attr->name;
+				if ((attr->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0) return attr->value;
+			}
+
+			return 0;
+		}
+
+		return 0;
+	}
+	
+	struct document_order_comparator
+	{
+		bool operator()(const xpath_node& lhs, const xpath_node& rhs) const
+		{
+			// optimized document order based check
+			const void* lo = document_buffer_order(lhs);
+			const void* ro = document_buffer_order(rhs);
+
+			if (lo && ro) return lo < ro;
+
+			// slow comparison
+			xml_node ln = lhs.node(), rn = rhs.node();
+
+			// compare attributes
+			if (lhs.attribute() && rhs.attribute())
+			{
+				// shared parent
+				if (lhs.parent() == rhs.parent())
+				{
+					// determine sibling order
+					for (xml_attribute a = lhs.attribute(); a; a = a.next_attribute())
+						if (a == rhs.attribute())
+							return true;
+					
+					return false;
+				}
+				
+				// compare attribute parents
+				ln = lhs.parent();
+				rn = rhs.parent();
+			}
+			else if (lhs.attribute())
+			{
+				// attributes go after the parent element
+				if (lhs.parent() == rhs.node()) return false;
+				
+				ln = lhs.parent();
+			}
+			else if (rhs.attribute())
+			{
+				// attributes go after the parent element
+				if (rhs.parent() == lhs.node()) return true;
+				
+				rn = rhs.parent();
+			}
+
+			if (ln == rn) return false;
+
+			if (!ln || !rn) return ln < rn;
+			
+			return node_is_before(ln.internal_object(), rn.internal_object());
+		}
+	};
+
+	struct duplicate_comparator
+	{
+		bool operator()(const xpath_node& lhs, const xpath_node& rhs) const
+		{
+			if (lhs.attribute()) return rhs.attribute() ? lhs.attribute() < rhs.attribute() : true;
+			else return rhs.attribute() ? false : lhs.node() < rhs.node();
+		}
+	};
+	
+	PUGI__FN double gen_nan()
+	{
+	#if defined(__STDC_IEC_559__) || ((FLT_RADIX - 0 == 2) && (FLT_MAX_EXP - 0 == 128) && (FLT_MANT_DIG - 0 == 24))
+		union { float f; uint32_t i; } u[sizeof(float) == sizeof(uint32_t) ? 1 : -1];
+		u[0].i = 0x7fc00000;
+		return u[0].f;
+	#else
+		// fallback
+		const volatile double zero = 0.0;
+		return zero / zero;
+	#endif
+	}
+	
+	PUGI__FN bool is_nan(double value)
+	{
+	#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__)
+		return !!_isnan(value);
+	#elif defined(fpclassify) && defined(FP_NAN)
+		return fpclassify(value) == FP_NAN;
+	#else
+		// fallback
+		const volatile double v = value;
+		return v != v;
+	#endif
+	}
+	
+	PUGI__FN const char_t* convert_number_to_string_special(double value)
+	{
+	#if defined(PUGI__MSVC_CRT_VERSION) || defined(__BORLANDC__)
+		if (_finite(value)) return (value == 0) ? PUGIXML_TEXT("0") : 0;
+		if (_isnan(value)) return PUGIXML_TEXT("NaN");
+		return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity");
+	#elif defined(fpclassify) && defined(FP_NAN) && defined(FP_INFINITE) && defined(FP_ZERO)
+		switch (fpclassify(value))
+		{
+		case FP_NAN:
+			return PUGIXML_TEXT("NaN");
+
+		case FP_INFINITE:
+			return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity");
+
+		case FP_ZERO:
+			return PUGIXML_TEXT("0");
+
+		default:
+			return 0;
+		}
+	#else
+		// fallback
+		const volatile double v = value;
+
+		if (v == 0) return PUGIXML_TEXT("0");
+		if (v != v) return PUGIXML_TEXT("NaN");
+		if (v * 2 == v) return value > 0 ? PUGIXML_TEXT("Infinity") : PUGIXML_TEXT("-Infinity");
+		return 0;
+	#endif
+	}
+	
+	PUGI__FN bool convert_number_to_boolean(double value)
+	{
+		return (value != 0 && !is_nan(value));
+	}
+	
+	PUGI__FN void truncate_zeros(char* begin, char* end)
+	{
+		while (begin != end && end[-1] == '0') end--;
+
+		*end = 0;
+	}
+
+	// gets mantissa digits in the form of 0.xxxxx with 0. implied and the exponent
+#if defined(PUGI__MSVC_CRT_VERSION) && PUGI__MSVC_CRT_VERSION >= 1400 && !defined(_WIN32_WCE)
+	PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent)
+	{
+		// get base values
+		int sign, exponent;
+		_ecvt_s(buffer, buffer_size, value, DBL_DIG + 1, &exponent, &sign);
+
+		// truncate redundant zeros
+		truncate_zeros(buffer, buffer + strlen(buffer));
+
+		// fill results
+		*out_mantissa = buffer;
+		*out_exponent = exponent;
+	}
+#else
+	PUGI__FN void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent)
+	{
+		// get a scientific notation value with IEEE DBL_DIG decimals
+		sprintf(buffer, "%.*e", DBL_DIG, value);
+		assert(strlen(buffer) < buffer_size);
+		(void)!buffer_size;
+
+		// get the exponent (possibly negative)
+		char* exponent_string = strchr(buffer, 'e');
+		assert(exponent_string);
+
+		int exponent = atoi(exponent_string + 1);
+
+		// extract mantissa string: skip sign
+		char* mantissa = buffer[0] == '-' ? buffer + 1 : buffer;
+		assert(mantissa[0] != '0' && mantissa[1] == '.');
+
+		// divide mantissa by 10 to eliminate integer part
+		mantissa[1] = mantissa[0];
+		mantissa++;
+		exponent++;
+
+		// remove extra mantissa digits and zero-terminate mantissa
+		truncate_zeros(mantissa, exponent_string);
+
+		// fill results
+		*out_mantissa = mantissa;
+		*out_exponent = exponent;
+	}
+#endif
+
+	PUGI__FN xpath_string convert_number_to_string(double value, xpath_allocator* alloc)
+	{
+		// try special number conversion
+		const char_t* special = convert_number_to_string_special(value);
+		if (special) return xpath_string::from_const(special);
+
+		// get mantissa + exponent form
+		char mantissa_buffer[32];
+
+		char* mantissa;
+		int exponent;
+		convert_number_to_mantissa_exponent(value, mantissa_buffer, sizeof(mantissa_buffer), &mantissa, &exponent);
+
+		// allocate a buffer of suitable length for the number
+		size_t result_size = strlen(mantissa_buffer) + (exponent > 0 ? exponent : -exponent) + 4;
+		char_t* result = static_cast<char_t*>(alloc->allocate(sizeof(char_t) * result_size));
+		assert(result);
+
+		// make the number!
+		char_t* s = result;
+
+		// sign
+		if (value < 0) *s++ = '-';
+
+		// integer part
+		if (exponent <= 0)
+		{
+			*s++ = '0';
+		}
+		else
+		{
+			while (exponent > 0)
+			{
+				assert(*mantissa == 0 || static_cast<unsigned int>(static_cast<unsigned int>(*mantissa) - '0') <= 9);
+				*s++ = *mantissa ? *mantissa++ : '0';
+				exponent--;
+			}
+		}
+
+		// fractional part
+		if (*mantissa)
+		{
+			// decimal point
+			*s++ = '.';
+
+			// extra zeroes from negative exponent
+			while (exponent < 0)
+			{
+				*s++ = '0';
+				exponent++;
+			}
+
+			// extra mantissa digits
+			while (*mantissa)
+			{
+				assert(static_cast<unsigned int>(*mantissa - '0') <= 9);
+				*s++ = *mantissa++;
+			}
+		}
+
+		// zero-terminate
+		assert(s < result + result_size);
+		*s = 0;
+
+		return xpath_string::from_heap_preallocated(result, s);
+	}
+	
+	PUGI__FN bool check_string_to_number_format(const char_t* string)
+	{
+		// parse leading whitespace
+		while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string;
+
+		// parse sign
+		if (*string == '-') ++string;
+
+		if (!*string) return false;
+
+		// if there is no integer part, there should be a decimal part with at least one digit
+		if (!PUGI__IS_CHARTYPEX(string[0], ctx_digit) && (string[0] != '.' || !PUGI__IS_CHARTYPEX(string[1], ctx_digit))) return false;
+
+		// parse integer part
+		while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string;
+
+		// parse decimal part
+		if (*string == '.')
+		{
+			++string;
+
+			while (PUGI__IS_CHARTYPEX(*string, ctx_digit)) ++string;
+		}
+
+		// parse trailing whitespace
+		while (PUGI__IS_CHARTYPE(*string, ct_space)) ++string;
+
+		return *string == 0;
+	}
+
+	PUGI__FN double convert_string_to_number(const char_t* string)
+	{
+		// check string format
+		if (!check_string_to_number_format(string)) return gen_nan();
+
+		// parse string
+	#ifdef PUGIXML_WCHAR_MODE
+		return wcstod(string, 0);
+	#else
+		return atof(string);
+	#endif
+	}
+
+	PUGI__FN bool convert_string_to_number_scratch(char_t (&buffer)[32], const char_t* begin, const char_t* end, double* out_result)
+	{
+		size_t length = static_cast<size_t>(end - begin);
+		char_t* scratch = buffer;
+
+		if (length >= sizeof(buffer) / sizeof(buffer[0]))
+		{
+			// need to make dummy on-heap copy
+			scratch = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+			if (!scratch) return false;
+		}
+
+		// copy string to zero-terminated buffer and perform conversion
+		memcpy(scratch, begin, length * sizeof(char_t));
+		scratch[length] = 0;
+
+		*out_result = convert_string_to_number(scratch);
+
+		// free dummy buffer
+		if (scratch != buffer) xml_memory::deallocate(scratch);
+
+		return true;
+	}
+	
+	PUGI__FN double round_nearest(double value)
+	{
+		return floor(value + 0.5);
+	}
+
+	PUGI__FN double round_nearest_nzero(double value)
+	{
+		// same as round_nearest, but returns -0 for [-0.5, -0]
+		// ceil is used to differentiate between +0 and -0 (we return -0 for [-0.5, -0] and +0 for +0)
+		return (value >= -0.5 && value <= 0) ? ceil(value) : floor(value + 0.5);
+	}
+	
+	PUGI__FN const char_t* qualified_name(const xpath_node& node)
+	{
+		return node.attribute() ? node.attribute().name() : node.node().name();
+	}
+	
+	PUGI__FN const char_t* local_name(const xpath_node& node)
+	{
+		const char_t* name = qualified_name(node);
+		const char_t* p = find_char(name, ':');
+		
+		return p ? p + 1 : name;
+	}
+
+	struct namespace_uri_predicate
+	{
+		const char_t* prefix;
+		size_t prefix_length;
+
+		namespace_uri_predicate(const char_t* name)
+		{
+			const char_t* pos = find_char(name, ':');
+
+			prefix = pos ? name : 0;
+			prefix_length = pos ? static_cast<size_t>(pos - name) : 0;
+		}
+
+		bool operator()(xml_attribute a) const
+		{
+			const char_t* name = a.name();
+
+			if (!starts_with(name, PUGIXML_TEXT("xmlns"))) return false;
+
+			return prefix ? name[5] == ':' && strequalrange(name + 6, prefix, prefix_length) : name[5] == 0;
+		}
+	};
+
+	PUGI__FN const char_t* namespace_uri(xml_node node)
+	{
+		namespace_uri_predicate pred = node.name();
+		
+		xml_node p = node;
+		
+		while (p)
+		{
+			xml_attribute a = p.find_attribute(pred);
+			
+			if (a) return a.value();
+			
+			p = p.parent();
+		}
+		
+		return PUGIXML_TEXT("");
+	}
+
+	PUGI__FN const char_t* namespace_uri(xml_attribute attr, xml_node parent)
+	{
+		namespace_uri_predicate pred = attr.name();
+		
+		// Default namespace does not apply to attributes
+		if (!pred.prefix) return PUGIXML_TEXT("");
+		
+		xml_node p = parent;
+		
+		while (p)
+		{
+			xml_attribute a = p.find_attribute(pred);
+			
+			if (a) return a.value();
+			
+			p = p.parent();
+		}
+		
+		return PUGIXML_TEXT("");
+	}
+
+	PUGI__FN const char_t* namespace_uri(const xpath_node& node)
+	{
+		return node.attribute() ? namespace_uri(node.attribute(), node.parent()) : namespace_uri(node.node());
+	}
+
+	PUGI__FN void normalize_space(char_t* buffer)
+	{
+		char_t* write = buffer;
+
+		for (char_t* it = buffer; *it; )
+		{
+			char_t ch = *it++;
+
+			if (PUGI__IS_CHARTYPE(ch, ct_space))
+			{
+				// replace whitespace sequence with single space
+				while (PUGI__IS_CHARTYPE(*it, ct_space)) it++;
+
+				// avoid leading spaces
+				if (write != buffer) *write++ = ' ';
+			}
+			else *write++ = ch;
+		}
+
+		// remove trailing space
+		if (write != buffer && PUGI__IS_CHARTYPE(write[-1], ct_space)) write--;
+
+		// zero-terminate
+		*write = 0;
+	}
+
+	PUGI__FN void translate(char_t* buffer, const char_t* from, const char_t* to, size_t to_length)
+	{
+		char_t* write = buffer;
+
+		while (*buffer)
+		{
+			PUGI__DMC_VOLATILE char_t ch = *buffer++;
+
+			const char_t* pos = find_char(from, ch);
+
+			if (!pos)
+				*write++ = ch; // do not process
+			else if (static_cast<size_t>(pos - from) < to_length)
+				*write++ = to[pos - from]; // replace
+		}
+
+		// zero-terminate
+		*write = 0;
+	}
+
+	PUGI__FN unsigned char* translate_table_generate(xpath_allocator* alloc, const char_t* from, const char_t* to)
+	{
+		unsigned char table[128] = {0};
+
+		while (*from)
+		{
+			unsigned int fc = static_cast<unsigned int>(*from);
+			unsigned int tc = static_cast<unsigned int>(*to);
+
+			if (fc >= 128 || tc >= 128)
+				return 0;
+
+			// code=128 means "skip character"
+			if (!table[fc])
+				table[fc] = static_cast<unsigned char>(tc ? tc : 128);
+
+			from++;
+			if (tc) to++;
+		}
+
+		for (int i = 0; i < 128; ++i)
+			if (!table[i])
+				table[i] = static_cast<unsigned char>(i);
+
+		void* result = alloc->allocate_nothrow(sizeof(table));
+
+		if (result)
+		{
+			memcpy(result, table, sizeof(table));
+		}
+
+		return static_cast<unsigned char*>(result);
+	}
+
+	PUGI__FN void translate_table(char_t* buffer, const unsigned char* table)
+	{
+		char_t* write = buffer;
+
+		while (*buffer)
+		{
+			char_t ch = *buffer++;
+			unsigned int index = static_cast<unsigned int>(ch);
+
+			if (index < 128)
+			{
+				unsigned char code = table[index];
+
+				// code=128 means "skip character" (table size is 128 so 128 can be a special value)
+				// this code skips these characters without extra branches
+				*write = static_cast<char_t>(code);
+				write += 1 - (code >> 7);
+			}
+			else
+			{
+				*write++ = ch;
+			}
+		}
+
+		// zero-terminate
+		*write = 0;
+	}
+
+	inline bool is_xpath_attribute(const char_t* name)
+	{
+		return !(starts_with(name, PUGIXML_TEXT("xmlns")) && (name[5] == 0 || name[5] == ':'));
+	}
+
+	struct xpath_variable_boolean: xpath_variable
+	{
+		xpath_variable_boolean(): value(false)
+		{
+		}
+
+		bool value;
+		char_t name[1];
+	};
+
+	struct xpath_variable_number: xpath_variable
+	{
+		xpath_variable_number(): value(0)
+		{
+		}
+
+		double value;
+		char_t name[1];
+	};
+
+	struct xpath_variable_string: xpath_variable
+	{
+		xpath_variable_string(): value(0)
+		{
+		}
+
+		~xpath_variable_string()
+		{
+			if (value) xml_memory::deallocate(value);
+		}
+
+		char_t* value;
+		char_t name[1];
+	};
+
+	struct xpath_variable_node_set: xpath_variable
+	{
+		xpath_node_set value;
+		char_t name[1];
+	};
+
+	static const xpath_node_set dummy_node_set;
+
+	PUGI__FN unsigned int hash_string(const char_t* str)
+	{
+		// Jenkins one-at-a-time hash (http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time)
+		unsigned int result = 0;
+
+		while (*str)
+		{
+			result += static_cast<unsigned int>(*str++);
+			result += result << 10;
+			result ^= result >> 6;
+		}
+	
+		result += result << 3;
+		result ^= result >> 11;
+		result += result << 15;
+	
+		return result;
+	}
+
+	template <typename T> PUGI__FN T* new_xpath_variable(const char_t* name)
+	{
+		size_t length = strlength(name);
+		if (length == 0) return 0; // empty variable names are invalid
+
+		// $$ we can't use offsetof(T, name) because T is non-POD, so we just allocate additional length characters
+		void* memory = xml_memory::allocate(sizeof(T) + length * sizeof(char_t));
+		if (!memory) return 0;
+
+		T* result = new (memory) T();
+
+		memcpy(result->name, name, (length + 1) * sizeof(char_t));
+
+		return result;
+	}
+
+	PUGI__FN xpath_variable* new_xpath_variable(xpath_value_type type, const char_t* name)
+	{
+		switch (type)
+		{
+		case xpath_type_node_set:
+			return new_xpath_variable<xpath_variable_node_set>(name);
+
+		case xpath_type_number:
+			return new_xpath_variable<xpath_variable_number>(name);
+
+		case xpath_type_string:
+			return new_xpath_variable<xpath_variable_string>(name);
+
+		case xpath_type_boolean:
+			return new_xpath_variable<xpath_variable_boolean>(name);
+
+		default:
+			return 0;
+		}
+	}
+
+	template <typename T> PUGI__FN void delete_xpath_variable(T* var)
+	{
+		var->~T();
+		xml_memory::deallocate(var);
+	}
+
+	PUGI__FN void delete_xpath_variable(xpath_value_type type, xpath_variable* var)
+	{
+		switch (type)
+		{
+		case xpath_type_node_set:
+			delete_xpath_variable(static_cast<xpath_variable_node_set*>(var));
+			break;
+
+		case xpath_type_number:
+			delete_xpath_variable(static_cast<xpath_variable_number*>(var));
+			break;
+
+		case xpath_type_string:
+			delete_xpath_variable(static_cast<xpath_variable_string*>(var));
+			break;
+
+		case xpath_type_boolean:
+			delete_xpath_variable(static_cast<xpath_variable_boolean*>(var));
+			break;
+
+		default:
+			assert(!"Invalid variable type");
+		}
+	}
+
+	PUGI__FN xpath_variable* get_variable_scratch(char_t (&buffer)[32], xpath_variable_set* set, const char_t* begin, const char_t* end)
+	{
+		size_t length = static_cast<size_t>(end - begin);
+		char_t* scratch = buffer;
+
+		if (length >= sizeof(buffer) / sizeof(buffer[0]))
+		{
+			// need to make dummy on-heap copy
+			scratch = static_cast<char_t*>(xml_memory::allocate((length + 1) * sizeof(char_t)));
+			if (!scratch) return 0;
+		}
+
+		// copy string to zero-terminated buffer and perform lookup
+		memcpy(scratch, begin, length * sizeof(char_t));
+		scratch[length] = 0;
+
+		xpath_variable* result = set->get(scratch);
+
+		// free dummy buffer
+		if (scratch != buffer) xml_memory::deallocate(scratch);
+
+		return result;
+	}
+PUGI__NS_END
+
+// Internal node set class
+PUGI__NS_BEGIN
+	PUGI__FN xpath_node_set::type_t xpath_get_order(const xpath_node* begin, const xpath_node* end)
+	{
+		if (end - begin < 2)
+			return xpath_node_set::type_sorted;
+
+		document_order_comparator cmp;
+
+		bool first = cmp(begin[0], begin[1]);
+
+		for (const xpath_node* it = begin + 1; it + 1 < end; ++it)
+			if (cmp(it[0], it[1]) != first)
+				return xpath_node_set::type_unsorted;
+
+		return first ? xpath_node_set::type_sorted : xpath_node_set::type_sorted_reverse;
+	}
+
+	PUGI__FN xpath_node_set::type_t xpath_sort(xpath_node* begin, xpath_node* end, xpath_node_set::type_t type, bool rev)
+	{
+		xpath_node_set::type_t order = rev ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted;
+
+		if (type == xpath_node_set::type_unsorted)
+		{
+			xpath_node_set::type_t sorted = xpath_get_order(begin, end);
+
+			if (sorted == xpath_node_set::type_unsorted)
+			{
+				sort(begin, end, document_order_comparator());
+
+				type = xpath_node_set::type_sorted;
+			}
+			else
+				type = sorted;
+		}
+		
+		if (type != order) reverse(begin, end);
+			
+		return order;
+	}
+
+	PUGI__FN xpath_node xpath_first(const xpath_node* begin, const xpath_node* end, xpath_node_set::type_t type)
+	{
+		if (begin == end) return xpath_node();
+
+		switch (type)
+		{
+		case xpath_node_set::type_sorted:
+			return *begin;
+
+		case xpath_node_set::type_sorted_reverse:
+			return *(end - 1);
+
+		case xpath_node_set::type_unsorted:
+			return *min_element(begin, end, document_order_comparator());
+
+		default:
+			assert(!"Invalid node set type");
+			return xpath_node();
+		}
+	}
+
+	class xpath_node_set_raw
+	{
+		xpath_node_set::type_t _type;
+
+		xpath_node* _begin;
+		xpath_node* _end;
+		xpath_node* _eos;
+
+	public:
+		xpath_node_set_raw(): _type(xpath_node_set::type_unsorted), _begin(0), _end(0), _eos(0)
+		{
+		}
+
+		xpath_node* begin() const
+		{
+			return _begin;
+		}
+
+		xpath_node* end() const
+		{
+			return _end;
+		}
+
+		bool empty() const
+		{
+			return _begin == _end;
+		}
+
+		size_t size() const
+		{
+			return static_cast<size_t>(_end - _begin);
+		}
+
+		xpath_node first() const
+		{
+			return xpath_first(_begin, _end, _type);
+		}
+
+		void push_back_grow(const xpath_node& node, xpath_allocator* alloc);
+
+		void push_back(const xpath_node& node, xpath_allocator* alloc)
+		{
+			if (_end != _eos)
+				*_end++ = node;
+			else
+				push_back_grow(node, alloc);
+		}
+
+		void append(const xpath_node* begin_, const xpath_node* end_, xpath_allocator* alloc)
+		{
+			if (begin_ == end_) return;
+
+			size_t size_ = static_cast<size_t>(_end - _begin);
+			size_t capacity = static_cast<size_t>(_eos - _begin);
+			size_t count = static_cast<size_t>(end_ - begin_);
+
+			if (size_ + count > capacity)
+			{
+				// reallocate the old array or allocate a new one
+				xpath_node* data = static_cast<xpath_node*>(alloc->reallocate(_begin, capacity * sizeof(xpath_node), (size_ + count) * sizeof(xpath_node)));
+				assert(data);
+
+				// finalize
+				_begin = data;
+				_end = data + size_;
+				_eos = data + size_ + count;
+			}
+
+			memcpy(_end, begin_, count * sizeof(xpath_node));
+			_end += count;
+		}
+
+		void sort_do()
+		{
+			_type = xpath_sort(_begin, _end, _type, false);
+		}
+
+		void truncate(xpath_node* pos)
+		{
+			assert(_begin <= pos && pos <= _end);
+
+			_end = pos;
+		}
+
+		void remove_duplicates()
+		{
+			if (_type == xpath_node_set::type_unsorted)
+				sort(_begin, _end, duplicate_comparator());
+		
+			_end = unique(_begin, _end);
+		}
+
+		xpath_node_set::type_t type() const
+		{
+			return _type;
+		}
+
+		void set_type(xpath_node_set::type_t value)
+		{
+			_type = value;
+		}
+	};
+
+	PUGI__FN_NO_INLINE void xpath_node_set_raw::push_back_grow(const xpath_node& node, xpath_allocator* alloc)
+	{
+		size_t capacity = static_cast<size_t>(_eos - _begin);
+
+		// get new capacity (1.5x rule)
+		size_t new_capacity = capacity + capacity / 2 + 1;
+
+		// reallocate the old array or allocate a new one
+		xpath_node* data = static_cast<xpath_node*>(alloc->reallocate(_begin, capacity * sizeof(xpath_node), new_capacity * sizeof(xpath_node)));
+		assert(data);
+
+		// finalize
+		_begin = data;
+		_end = data + capacity;
+		_eos = data + new_capacity;
+
+		// push
+		*_end++ = node;
+	}
+PUGI__NS_END
+
+PUGI__NS_BEGIN
+	struct xpath_context
+	{
+		xpath_node n;
+		size_t position, size;
+
+		xpath_context(const xpath_node& n_, size_t position_, size_t size_): n(n_), position(position_), size(size_)
+		{
+		}
+	};
+
+	enum lexeme_t
+	{
+		lex_none = 0,
+		lex_equal,
+		lex_not_equal,
+		lex_less,
+		lex_greater,
+		lex_less_or_equal,
+		lex_greater_or_equal,
+		lex_plus,
+		lex_minus,
+		lex_multiply,
+		lex_union,
+		lex_var_ref,
+		lex_open_brace,
+		lex_close_brace,
+		lex_quoted_string,
+		lex_number,
+		lex_slash,
+		lex_double_slash,
+		lex_open_square_brace,
+		lex_close_square_brace,
+		lex_string,
+		lex_comma,
+		lex_axis_attribute,
+		lex_dot,
+		lex_double_dot,
+		lex_double_colon,
+		lex_eof
+	};
+
+	struct xpath_lexer_string
+	{
+		const char_t* begin;
+		const char_t* end;
+
+		xpath_lexer_string(): begin(0), end(0)
+		{
+		}
+
+		bool operator==(const char_t* other) const
+		{
+			size_t length = static_cast<size_t>(end - begin);
+
+			return strequalrange(other, begin, length);
+		}
+	};
+
+	class xpath_lexer
+	{
+		const char_t* _cur;
+		const char_t* _cur_lexeme_pos;
+		xpath_lexer_string _cur_lexeme_contents;
+
+		lexeme_t _cur_lexeme;
+
+	public:
+		explicit xpath_lexer(const char_t* query): _cur(query)
+		{
+			next();
+		}
+		
+		const char_t* state() const
+		{
+			return _cur;
+		}
+		
+		void next()
+		{
+			const char_t* cur = _cur;
+
+			while (PUGI__IS_CHARTYPE(*cur, ct_space)) ++cur;
+
+			// save lexeme position for error reporting
+			_cur_lexeme_pos = cur;
+
+			switch (*cur)
+			{
+			case 0:
+				_cur_lexeme = lex_eof;
+				break;
+			
+			case '>':
+				if (*(cur+1) == '=')
+				{
+					cur += 2;
+					_cur_lexeme = lex_greater_or_equal;
+				}
+				else
+				{
+					cur += 1;
+					_cur_lexeme = lex_greater;
+				}
+				break;
+
+			case '<':
+				if (*(cur+1) == '=')
+				{
+					cur += 2;
+					_cur_lexeme = lex_less_or_equal;
+				}
+				else
+				{
+					cur += 1;
+					_cur_lexeme = lex_less;
+				}
+				break;
+
+			case '!':
+				if (*(cur+1) == '=')
+				{
+					cur += 2;
+					_cur_lexeme = lex_not_equal;
+				}
+				else
+				{
+					_cur_lexeme = lex_none;
+				}
+				break;
+
+			case '=':
+				cur += 1;
+				_cur_lexeme = lex_equal;
+
+				break;
+			
+			case '+':
+				cur += 1;
+				_cur_lexeme = lex_plus;
+
+				break;
+
+			case '-':
+				cur += 1;
+				_cur_lexeme = lex_minus;
+
+				break;
+
+			case '*':
+				cur += 1;
+				_cur_lexeme = lex_multiply;
+
+				break;
+
+			case '|':
+				cur += 1;
+				_cur_lexeme = lex_union;
+
+				break;
+			
+			case '$':
+				cur += 1;
+
+				if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol))
+				{
+					_cur_lexeme_contents.begin = cur;
+
+					while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
+
+					if (cur[0] == ':' && PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // qname
+					{
+						cur++; // :
+
+						while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
+					}
+
+					_cur_lexeme_contents.end = cur;
+				
+					_cur_lexeme = lex_var_ref;
+				}
+				else
+				{
+					_cur_lexeme = lex_none;
+				}
+
+				break;
+
+			case '(':
+				cur += 1;
+				_cur_lexeme = lex_open_brace;
+
+				break;
+
+			case ')':
+				cur += 1;
+				_cur_lexeme = lex_close_brace;
+
+				break;
+			
+			case '[':
+				cur += 1;
+				_cur_lexeme = lex_open_square_brace;
+
+				break;
+
+			case ']':
+				cur += 1;
+				_cur_lexeme = lex_close_square_brace;
+
+				break;
+
+			case ',':
+				cur += 1;
+				_cur_lexeme = lex_comma;
+
+				break;
+
+			case '/':
+				if (*(cur+1) == '/')
+				{
+					cur += 2;
+					_cur_lexeme = lex_double_slash;
+				}
+				else
+				{
+					cur += 1;
+					_cur_lexeme = lex_slash;
+				}
+				break;
+		
+			case '.':
+				if (*(cur+1) == '.')
+				{
+					cur += 2;
+					_cur_lexeme = lex_double_dot;
+				}
+				else if (PUGI__IS_CHARTYPEX(*(cur+1), ctx_digit))
+				{
+					_cur_lexeme_contents.begin = cur; // .
+
+					++cur;
+
+					while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;
+
+					_cur_lexeme_contents.end = cur;
+					
+					_cur_lexeme = lex_number;
+				}
+				else
+				{
+					cur += 1;
+					_cur_lexeme = lex_dot;
+				}
+				break;
+
+			case '@':
+				cur += 1;
+				_cur_lexeme = lex_axis_attribute;
+
+				break;
+
+			case '"':
+			case '\'':
+			{
+				char_t terminator = *cur;
+
+				++cur;
+
+				_cur_lexeme_contents.begin = cur;
+				while (*cur && *cur != terminator) cur++;
+				_cur_lexeme_contents.end = cur;
+				
+				if (!*cur)
+					_cur_lexeme = lex_none;
+				else
+				{
+					cur += 1;
+					_cur_lexeme = lex_quoted_string;
+				}
+
+				break;
+			}
+
+			case ':':
+				if (*(cur+1) == ':')
+				{
+					cur += 2;
+					_cur_lexeme = lex_double_colon;
+				}
+				else
+				{
+					_cur_lexeme = lex_none;
+				}
+				break;
+
+			default:
+				if (PUGI__IS_CHARTYPEX(*cur, ctx_digit))
+				{
+					_cur_lexeme_contents.begin = cur;
+
+					while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;
+				
+					if (*cur == '.')
+					{
+						cur++;
+
+						while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;
+					}
+
+					_cur_lexeme_contents.end = cur;
+
+					_cur_lexeme = lex_number;
+				}
+				else if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol))
+				{
+					_cur_lexeme_contents.begin = cur;
+
+					while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
+
+					if (cur[0] == ':')
+					{
+						if (cur[1] == '*') // namespace test ncname:*
+						{
+							cur += 2; // :*
+						}
+						else if (PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // namespace test qname
+						{
+							cur++; // :
+
+							while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
+						}
+					}
+
+					_cur_lexeme_contents.end = cur;
+				
+					_cur_lexeme = lex_string;
+				}
+				else
+				{
+					_cur_lexeme = lex_none;
+				}
+			}
+
+			_cur = cur;
+		}
+
+		lexeme_t current() const
+		{
+			return _cur_lexeme;
+		}
+
+		const char_t* current_pos() const
+		{
+			return _cur_lexeme_pos;
+		}
+
+		const xpath_lexer_string& contents() const
+		{
+			assert(_cur_lexeme == lex_var_ref || _cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string);
+
+			return _cur_lexeme_contents;
+		}
+	};
+
+	enum ast_type_t
+	{
+		ast_unknown,
+		ast_op_or,						// left or right
+		ast_op_and,						// left and right
+		ast_op_equal,					// left = right
+		ast_op_not_equal,				// left != right
+		ast_op_less,					// left < right
+		ast_op_greater,					// left > right
+		ast_op_less_or_equal,			// left <= right
+		ast_op_greater_or_equal,		// left >= right
+		ast_op_add,						// left + right
+		ast_op_subtract,				// left - right
+		ast_op_multiply,				// left * right
+		ast_op_divide,					// left / right
+		ast_op_mod,						// left % right
+		ast_op_negate,					// left - right
+		ast_op_union,					// left | right
+		ast_predicate,					// apply predicate to set; next points to next predicate
+		ast_filter,						// select * from left where right
+		ast_string_constant,			// string constant
+		ast_number_constant,			// number constant
+		ast_variable,					// variable
+		ast_func_last,					// last()
+		ast_func_position,				// position()
+		ast_func_count,					// count(left)
+		ast_func_id,					// id(left)
+		ast_func_local_name_0,			// local-name()
+		ast_func_local_name_1,			// local-name(left)
+		ast_func_namespace_uri_0,		// namespace-uri()
+		ast_func_namespace_uri_1,		// namespace-uri(left)
+		ast_func_name_0,				// name()
+		ast_func_name_1,				// name(left)
+		ast_func_string_0,				// string()
+		ast_func_string_1,				// string(left)
+		ast_func_concat,				// concat(left, right, siblings)
+		ast_func_starts_with,			// starts_with(left, right)
+		ast_func_contains,				// contains(left, right)
+		ast_func_substring_before,		// substring-before(left, right)
+		ast_func_substring_after,		// substring-after(left, right)
+		ast_func_substring_2,			// substring(left, right)
+		ast_func_substring_3,			// substring(left, right, third)
+		ast_func_string_length_0,		// string-length()
+		ast_func_string_length_1,		// string-length(left)
+		ast_func_normalize_space_0,		// normalize-space()
+		ast_func_normalize_space_1,		// normalize-space(left)
+		ast_func_translate,				// translate(left, right, third)
+		ast_func_boolean,				// boolean(left)
+		ast_func_not,					// not(left)
+		ast_func_true,					// true()
+		ast_func_false,					// false()
+		ast_func_lang,					// lang(left)
+		ast_func_number_0,				// number()
+		ast_func_number_1,				// number(left)
+		ast_func_sum,					// sum(left)
+		ast_func_floor,					// floor(left)
+		ast_func_ceiling,				// ceiling(left)
+		ast_func_round,					// round(left)
+		ast_step,						// process set left with step
+		ast_step_root,					// select root node
+
+		ast_opt_translate_table,		// translate(left, right, third) where right/third are constants
+		ast_opt_compare_attribute		// @name = 'string'
+	};
+
+	enum axis_t
+	{
+		axis_ancestor,
+		axis_ancestor_or_self,
+		axis_attribute,
+		axis_child,
+		axis_descendant,
+		axis_descendant_or_self,
+		axis_following,
+		axis_following_sibling,
+		axis_namespace,
+		axis_parent,
+		axis_preceding,
+		axis_preceding_sibling,
+		axis_self
+	};
+	
+	enum nodetest_t
+	{
+		nodetest_none,
+		nodetest_name,
+		nodetest_type_node,
+		nodetest_type_comment,
+		nodetest_type_pi,
+		nodetest_type_text,
+		nodetest_pi,
+		nodetest_all,
+		nodetest_all_in_namespace
+	};
+
+	enum predicate_t
+	{
+		predicate_default,
+		predicate_posinv,
+		predicate_constant,
+		predicate_constant_one
+	};
+
+	enum nodeset_eval_t
+	{
+		nodeset_eval_all,
+		nodeset_eval_any,
+		nodeset_eval_first
+	};
+
+	template <axis_t N> struct axis_to_type
+	{
+		static const axis_t axis;
+	};
+
+	template <axis_t N> const axis_t axis_to_type<N>::axis = N;
+		
+	class xpath_ast_node
+	{
+	private:
+		// node type
+		char _type;
+		char _rettype;
+
+		// for ast_step
+		char _axis;
+
+		// for ast_step/ast_predicate/ast_filter
+		char _test;
+
+		// tree node structure
+		xpath_ast_node* _left;
+		xpath_ast_node* _right;
+		xpath_ast_node* _next;
+
+		union
+		{
+			// value for ast_string_constant
+			const char_t* string;
+			// value for ast_number_constant
+			double number;
+			// variable for ast_variable
+			xpath_variable* variable;
+			// node test for ast_step (node name/namespace/node type/pi target)
+			const char_t* nodetest;
+			// table for ast_opt_translate_table
+			const unsigned char* table;
+		} _data;
+
+		xpath_ast_node(const xpath_ast_node&);
+		xpath_ast_node& operator=(const xpath_ast_node&);
+
+		template <class Comp> static bool compare_eq(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp)
+		{
+			xpath_value_type lt = lhs->rettype(), rt = rhs->rettype();
+
+			if (lt != xpath_type_node_set && rt != xpath_type_node_set)
+			{
+				if (lt == xpath_type_boolean || rt == xpath_type_boolean)
+					return comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack));
+				else if (lt == xpath_type_number || rt == xpath_type_number)
+					return comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack));
+				else if (lt == xpath_type_string || rt == xpath_type_string)
+				{
+					xpath_allocator_capture cr(stack.result);
+
+					xpath_string ls = lhs->eval_string(c, stack);
+					xpath_string rs = rhs->eval_string(c, stack);
+
+					return comp(ls, rs);
+				}
+			}
+			else if (lt == xpath_type_node_set && rt == xpath_type_node_set)
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all);
+				xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+				for (const xpath_node* li = ls.begin(); li != ls.end(); ++li)
+					for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+					{
+						xpath_allocator_capture cri(stack.result);
+
+						if (comp(string_value(*li, stack.result), string_value(*ri, stack.result)))
+							return true;
+					}
+
+				return false;
+			}
+			else
+			{
+				if (lt == xpath_type_node_set)
+				{
+					swap(lhs, rhs);
+					swap(lt, rt);
+				}
+
+				if (lt == xpath_type_boolean)
+					return comp(lhs->eval_boolean(c, stack), rhs->eval_boolean(c, stack));
+				else if (lt == xpath_type_number)
+				{
+					xpath_allocator_capture cr(stack.result);
+
+					double l = lhs->eval_number(c, stack);
+					xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+					for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+					{
+						xpath_allocator_capture cri(stack.result);
+
+						if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str())))
+							return true;
+					}
+
+					return false;
+				}
+				else if (lt == xpath_type_string)
+				{
+					xpath_allocator_capture cr(stack.result);
+
+					xpath_string l = lhs->eval_string(c, stack);
+					xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+					for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+					{
+						xpath_allocator_capture cri(stack.result);
+
+						if (comp(l, string_value(*ri, stack.result)))
+							return true;
+					}
+
+					return false;
+				}
+			}
+
+			assert(!"Wrong types");
+			return false;
+		}
+
+		static bool eval_once(xpath_node_set::type_t type, nodeset_eval_t eval)
+		{
+			return type == xpath_node_set::type_sorted ? eval != nodeset_eval_all : eval == nodeset_eval_any;
+		}
+
+		template <class Comp> static bool compare_rel(xpath_ast_node* lhs, xpath_ast_node* rhs, const xpath_context& c, const xpath_stack& stack, const Comp& comp)
+		{
+			xpath_value_type lt = lhs->rettype(), rt = rhs->rettype();
+
+			if (lt != xpath_type_node_set && rt != xpath_type_node_set)
+				return comp(lhs->eval_number(c, stack), rhs->eval_number(c, stack));
+			else if (lt == xpath_type_node_set && rt == xpath_type_node_set)
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all);
+				xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+				for (const xpath_node* li = ls.begin(); li != ls.end(); ++li)
+				{
+					xpath_allocator_capture cri(stack.result);
+
+					double l = convert_string_to_number(string_value(*li, stack.result).c_str());
+
+					for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+					{
+						xpath_allocator_capture crii(stack.result);
+
+						if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str())))
+							return true;
+					}
+				}
+
+				return false;
+			}
+			else if (lt != xpath_type_node_set && rt == xpath_type_node_set)
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				double l = lhs->eval_number(c, stack);
+				xpath_node_set_raw rs = rhs->eval_node_set(c, stack, nodeset_eval_all);
+
+				for (const xpath_node* ri = rs.begin(); ri != rs.end(); ++ri)
+				{
+					xpath_allocator_capture cri(stack.result);
+
+					if (comp(l, convert_string_to_number(string_value(*ri, stack.result).c_str())))
+						return true;
+				}
+
+				return false;
+			}
+			else if (lt == xpath_type_node_set && rt != xpath_type_node_set)
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				xpath_node_set_raw ls = lhs->eval_node_set(c, stack, nodeset_eval_all);
+				double r = rhs->eval_number(c, stack);
+
+				for (const xpath_node* li = ls.begin(); li != ls.end(); ++li)
+				{
+					xpath_allocator_capture cri(stack.result);
+
+					if (comp(convert_string_to_number(string_value(*li, stack.result).c_str()), r))
+						return true;
+				}
+
+				return false;
+			}
+			else
+			{
+				assert(!"Wrong types");
+				return false;
+			}
+		}
+
+		static void apply_predicate_boolean(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once)
+		{
+			assert(ns.size() >= first);
+			assert(expr->rettype() != xpath_type_number);
+
+			size_t i = 1;
+			size_t size = ns.size() - first;
+
+			xpath_node* last = ns.begin() + first;
+
+			// remove_if... or well, sort of
+			for (xpath_node* it = last; it != ns.end(); ++it, ++i)
+			{
+				xpath_context c(*it, i, size);
+
+				if (expr->eval_boolean(c, stack))
+				{
+					*last++ = *it;
+
+					if (once) break;
+				}
+			}
+
+			ns.truncate(last);
+		}
+
+		static void apply_predicate_number(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack, bool once)
+		{
+			assert(ns.size() >= first);
+			assert(expr->rettype() == xpath_type_number);
+
+			size_t i = 1;
+			size_t size = ns.size() - first;
+
+			xpath_node* last = ns.begin() + first;
+
+			// remove_if... or well, sort of
+			for (xpath_node* it = last; it != ns.end(); ++it, ++i)
+			{
+				xpath_context c(*it, i, size);
+
+				if (expr->eval_number(c, stack) == i)
+				{
+					*last++ = *it;
+
+					if (once) break;
+				}
+			}
+
+			ns.truncate(last);
+		}
+
+		static void apply_predicate_number_const(xpath_node_set_raw& ns, size_t first, xpath_ast_node* expr, const xpath_stack& stack)
+		{
+			assert(ns.size() >= first);
+			assert(expr->rettype() == xpath_type_number);
+
+			size_t size = ns.size() - first;
+
+			xpath_node* last = ns.begin() + first;
+
+			xpath_context c(xpath_node(), 1, size);
+
+			double er = expr->eval_number(c, stack);
+
+			if (er >= 1.0 && er <= size)
+			{
+				size_t eri = static_cast<size_t>(er);
+
+				if (er == eri)
+				{
+					xpath_node r = last[eri - 1];
+
+					*last++ = r;
+				}
+			}
+
+			ns.truncate(last);
+		}
+
+		void apply_predicate(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, bool once)
+		{
+			if (ns.size() == first) return;
+
+			assert(_type == ast_filter || _type == ast_predicate);
+
+			if (_test == predicate_constant || _test == predicate_constant_one)
+				apply_predicate_number_const(ns, first, _right, stack);
+			else if (_right->rettype() == xpath_type_number)
+				apply_predicate_number(ns, first, _right, stack, once);
+			else
+				apply_predicate_boolean(ns, first, _right, stack, once);
+		}
+
+		void apply_predicates(xpath_node_set_raw& ns, size_t first, const xpath_stack& stack, nodeset_eval_t eval)
+		{
+			if (ns.size() == first) return;
+
+			bool last_once = eval_once(ns.type(), eval);
+
+			for (xpath_ast_node* pred = _right; pred; pred = pred->_next)
+				pred->apply_predicate(ns, first, stack, !pred->_next && last_once);
+		}
+
+		bool step_push(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* parent, xpath_allocator* alloc)
+		{
+			assert(a);
+
+			const char_t* name = a->name ? a->name : PUGIXML_TEXT("");
+
+			switch (_test)
+			{
+			case nodetest_name:
+				if (strequal(name, _data.nodetest) && is_xpath_attribute(name))
+				{
+					ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc);
+					return true;
+				}
+				break;
+				
+			case nodetest_type_node:
+			case nodetest_all:
+				if (is_xpath_attribute(name))
+				{
+					ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc);
+					return true;
+				}
+				break;
+				
+			case nodetest_all_in_namespace:
+				if (starts_with(name, _data.nodetest) && is_xpath_attribute(name))
+				{
+					ns.push_back(xpath_node(xml_attribute(a), xml_node(parent)), alloc);
+					return true;
+				}
+				break;
+			
+			default:
+				;
+			}
+
+			return false;
+		}
+		
+		bool step_push(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc)
+		{
+			assert(n);
+
+			xml_node_type type = PUGI__NODETYPE(n);
+
+			switch (_test)
+			{
+			case nodetest_name:
+				if (type == node_element && n->name && strequal(n->name, _data.nodetest))
+				{
+					ns.push_back(xml_node(n), alloc);
+					return true;
+				}
+				break;
+				
+			case nodetest_type_node:
+				ns.push_back(xml_node(n), alloc);
+				return true;
+				
+			case nodetest_type_comment:
+				if (type == node_comment)
+				{
+					ns.push_back(xml_node(n), alloc);
+					return true;
+				}
+				break;
+				
+			case nodetest_type_text:
+				if (type == node_pcdata || type == node_cdata)
+				{
+					ns.push_back(xml_node(n), alloc);
+					return true;
+				}
+				break;
+				
+			case nodetest_type_pi:
+				if (type == node_pi)
+				{
+					ns.push_back(xml_node(n), alloc);
+					return true;
+				}
+				break;
+									
+			case nodetest_pi:
+				if (type == node_pi && n->name && strequal(n->name, _data.nodetest))
+				{
+					ns.push_back(xml_node(n), alloc);
+					return true;
+				}
+				break;
+				
+			case nodetest_all:
+				if (type == node_element)
+				{
+					ns.push_back(xml_node(n), alloc);
+					return true;
+				}
+				break;
+				
+			case nodetest_all_in_namespace:
+				if (type == node_element && n->name && starts_with(n->name, _data.nodetest))
+				{
+					ns.push_back(xml_node(n), alloc);
+					return true;
+				}
+				break;
+
+			default:
+				assert(!"Unknown axis");
+			}
+
+			return false;
+		}
+
+		template <class T> void step_fill(xpath_node_set_raw& ns, xml_node_struct* n, xpath_allocator* alloc, bool once, T)
+		{
+			const axis_t axis = T::axis;
+
+			switch (axis)
+			{
+			case axis_attribute:
+			{
+				for (xml_attribute_struct* a = n->first_attribute; a; a = a->next_attribute)
+					if (step_push(ns, a, n, alloc) & once)
+						return;
+				
+				break;
+			}
+			
+			case axis_child:
+			{
+				for (xml_node_struct* c = n->first_child; c; c = c->next_sibling)
+					if (step_push(ns, c, alloc) & once)
+						return;
+					
+				break;
+			}
+			
+			case axis_descendant:
+			case axis_descendant_or_self:
+			{
+				if (axis == axis_descendant_or_self)
+					if (step_push(ns, n, alloc) & once)
+						return;
+					
+				xml_node_struct* cur = n->first_child;
+				
+				while (cur)
+				{
+					if (step_push(ns, cur, alloc) & once)
+						return;
+					
+					if (cur->first_child)
+						cur = cur->first_child;
+					else
+					{
+						while (!cur->next_sibling)
+						{
+							cur = cur->parent;
+
+							if (cur == n) return;
+						}
+					
+						cur = cur->next_sibling;
+					}
+				}
+				
+				break;
+			}
+			
+			case axis_following_sibling:
+			{
+				for (xml_node_struct* c = n->next_sibling; c; c = c->next_sibling)
+					if (step_push(ns, c, alloc) & once)
+						return;
+				
+				break;
+			}
+			
+			case axis_preceding_sibling:
+			{
+				for (xml_node_struct* c = n->prev_sibling_c; c->next_sibling; c = c->prev_sibling_c)
+					if (step_push(ns, c, alloc) & once)
+						return;
+				
+				break;
+			}
+			
+			case axis_following:
+			{
+				xml_node_struct* cur = n;
+
+				// exit from this node so that we don't include descendants
+				while (!cur->next_sibling)
+				{
+					cur = cur->parent;
+
+					if (!cur) return;
+				}
+
+				cur = cur->next_sibling;
+
+				while (cur)
+				{
+					if (step_push(ns, cur, alloc) & once)
+						return;
+
+					if (cur->first_child)
+						cur = cur->first_child;
+					else
+					{
+						while (!cur->next_sibling)
+						{
+							cur = cur->parent;
+
+							if (!cur) return;
+						}
+
+						cur = cur->next_sibling;
+					}
+				}
+
+				break;
+			}
+
+			case axis_preceding:
+			{
+				xml_node_struct* cur = n;
+
+				// exit from this node so that we don't include descendants
+				while (!cur->prev_sibling_c->next_sibling)
+				{
+					cur = cur->parent;
+
+					if (!cur) return;
+				}
+
+				cur = cur->prev_sibling_c;
+
+				while (cur)
+				{
+					if (cur->first_child)
+						cur = cur->first_child->prev_sibling_c;
+					else
+					{
+						// leaf node, can't be ancestor
+						if (step_push(ns, cur, alloc) & once)
+							return;
+
+						while (!cur->prev_sibling_c->next_sibling)
+						{
+							cur = cur->parent;
+
+							if (!cur) return;
+
+							if (!node_is_ancestor(cur, n))
+								if (step_push(ns, cur, alloc) & once)
+									return;
+						}
+
+						cur = cur->prev_sibling_c;
+					}
+				}
+
+				break;
+			}
+			
+			case axis_ancestor:
+			case axis_ancestor_or_self:
+			{
+				if (axis == axis_ancestor_or_self)
+					if (step_push(ns, n, alloc) & once)
+						return;
+
+				xml_node_struct* cur = n->parent;
+				
+				while (cur)
+				{
+					if (step_push(ns, cur, alloc) & once)
+						return;
+					
+					cur = cur->parent;
+				}
+				
+				break;
+			}
+
+			case axis_self:
+			{
+				step_push(ns, n, alloc);
+
+				break;
+			}
+
+			case axis_parent:
+			{
+				if (n->parent)
+					step_push(ns, n->parent, alloc);
+
+				break;
+			}
+				
+			default:
+				assert(!"Unimplemented axis");
+			}
+		}
+		
+		template <class T> void step_fill(xpath_node_set_raw& ns, xml_attribute_struct* a, xml_node_struct* p, xpath_allocator* alloc, bool once, T v)
+		{
+			const axis_t axis = T::axis;
+
+			switch (axis)
+			{
+			case axis_ancestor:
+			case axis_ancestor_or_self:
+			{
+				if (axis == axis_ancestor_or_self && _test == nodetest_type_node) // reject attributes based on principal node type test
+					if (step_push(ns, a, p, alloc) & once)
+						return;
+
+				xml_node_struct* cur = p;
+				
+				while (cur)
+				{
+					if (step_push(ns, cur, alloc) & once)
+						return;
+					
+					cur = cur->parent;
+				}
+				
+				break;
+			}
+
+			case axis_descendant_or_self:
+			case axis_self:
+			{
+				if (_test == nodetest_type_node) // reject attributes based on principal node type test
+					step_push(ns, a, p, alloc);
+
+				break;
+			}
+
+			case axis_following:
+			{
+				xml_node_struct* cur = p;
+				
+				while (cur)
+				{
+					if (cur->first_child)
+						cur = cur->first_child;
+					else
+					{
+						while (!cur->next_sibling)
+						{
+							cur = cur->parent;
+
+							if (!cur) return;
+						}
+
+						cur = cur->next_sibling;
+					}
+
+					if (step_push(ns, cur, alloc) & once)
+						return;
+				}
+
+				break;
+			}
+
+			case axis_parent:
+			{
+				step_push(ns, p, alloc);
+
+				break;
+			}
+
+			case axis_preceding:
+			{
+				// preceding:: axis does not include attribute nodes and attribute ancestors (they are the same as parent's ancestors), so we can reuse node preceding
+				step_fill(ns, p, alloc, once, v);
+				break;
+			}
+			
+			default:
+				assert(!"Unimplemented axis");
+			}
+		}
+
+		template <class T> void step_fill(xpath_node_set_raw& ns, const xpath_node& xn, xpath_allocator* alloc, bool once, T v)
+		{
+			const axis_t axis = T::axis;
+			const bool axis_has_attributes = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_descendant_or_self || axis == axis_following || axis == axis_parent || axis == axis_preceding || axis == axis_self);
+
+			if (xn.node())
+				step_fill(ns, xn.node().internal_object(), alloc, once, v);
+			else if (axis_has_attributes && xn.attribute() && xn.parent())
+				step_fill(ns, xn.attribute().internal_object(), xn.parent().internal_object(), alloc, once, v);
+		}
+
+		template <class T> xpath_node_set_raw step_do(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval, T v)
+		{
+			const axis_t axis = T::axis;
+			const bool axis_reverse = (axis == axis_ancestor || axis == axis_ancestor_or_self || axis == axis_preceding || axis == axis_preceding_sibling);
+			const xpath_node_set::type_t axis_type = axis_reverse ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_sorted;
+
+			bool once =
+				(axis == axis_attribute && _test == nodetest_name) ||
+				(!_right && eval_once(axis_type, eval)) ||
+				(_right && !_right->_next && _right->_test == predicate_constant_one);
+
+			xpath_node_set_raw ns;
+			ns.set_type(axis_type);
+
+			if (_left)
+			{
+				xpath_node_set_raw s = _left->eval_node_set(c, stack, nodeset_eval_all);
+
+				// self axis preserves the original order
+				if (axis == axis_self) ns.set_type(s.type());
+
+				for (const xpath_node* it = s.begin(); it != s.end(); ++it)
+				{
+					size_t size = ns.size();
+
+					// in general, all axes generate elements in a particular order, but there is no order guarantee if axis is applied to two nodes
+					if (axis != axis_self && size != 0) ns.set_type(xpath_node_set::type_unsorted);
+					
+					step_fill(ns, *it, stack.result, once, v);
+					if (_right) apply_predicates(ns, size, stack, eval);
+				}
+			}
+			else
+			{
+				step_fill(ns, c.n, stack.result, once, v);
+				if (_right) apply_predicates(ns, 0, stack, eval);
+			}
+
+			// child, attribute and self axes always generate unique set of nodes
+			// for other axis, if the set stayed sorted, it stayed unique because the traversal algorithms do not visit the same node twice
+			if (axis != axis_child && axis != axis_attribute && axis != axis_self && ns.type() == xpath_node_set::type_unsorted)
+				ns.remove_duplicates();
+
+			return ns;
+		}
+		
+	public:
+		xpath_ast_node(ast_type_t type, xpath_value_type rettype_, const char_t* value):
+			_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)
+		{
+			assert(type == ast_string_constant);
+			_data.string = value;
+		}
+
+		xpath_ast_node(ast_type_t type, xpath_value_type rettype_, double value):
+			_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)
+		{
+			assert(type == ast_number_constant);
+			_data.number = value;
+		}
+		
+		xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_variable* value):
+			_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(0), _right(0), _next(0)
+		{
+			assert(type == ast_variable);
+			_data.variable = value;
+		}
+		
+		xpath_ast_node(ast_type_t type, xpath_value_type rettype_, xpath_ast_node* left = 0, xpath_ast_node* right = 0):
+			_type(static_cast<char>(type)), _rettype(static_cast<char>(rettype_)), _axis(0), _test(0), _left(left), _right(right), _next(0)
+		{
+		}
+
+		xpath_ast_node(ast_type_t type, xpath_ast_node* left, axis_t axis, nodetest_t test, const char_t* contents):
+			_type(static_cast<char>(type)), _rettype(xpath_type_node_set), _axis(static_cast<char>(axis)), _test(static_cast<char>(test)), _left(left), _right(0), _next(0)
+		{
+			assert(type == ast_step);
+			_data.nodetest = contents;
+		}
+
+		xpath_ast_node(ast_type_t type, xpath_ast_node* left, xpath_ast_node* right, predicate_t test):
+			_type(static_cast<char>(type)), _rettype(xpath_type_node_set), _axis(0), _test(static_cast<char>(test)), _left(left), _right(right), _next(0)
+		{
+			assert(type == ast_filter || type == ast_predicate);
+		}
+
+		void set_next(xpath_ast_node* value)
+		{
+			_next = value;
+		}
+
+		void set_right(xpath_ast_node* value)
+		{
+			_right = value;
+		}
+
+		bool eval_boolean(const xpath_context& c, const xpath_stack& stack)
+		{
+			switch (_type)
+			{
+			case ast_op_or:
+				return _left->eval_boolean(c, stack) || _right->eval_boolean(c, stack);
+				
+			case ast_op_and:
+				return _left->eval_boolean(c, stack) && _right->eval_boolean(c, stack);
+				
+			case ast_op_equal:
+				return compare_eq(_left, _right, c, stack, equal_to());
+
+			case ast_op_not_equal:
+				return compare_eq(_left, _right, c, stack, not_equal_to());
+	
+			case ast_op_less:
+				return compare_rel(_left, _right, c, stack, less());
+			
+			case ast_op_greater:
+				return compare_rel(_right, _left, c, stack, less());
+
+			case ast_op_less_or_equal:
+				return compare_rel(_left, _right, c, stack, less_equal());
+			
+			case ast_op_greater_or_equal:
+				return compare_rel(_right, _left, c, stack, less_equal());
+
+			case ast_func_starts_with:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				xpath_string lr = _left->eval_string(c, stack);
+				xpath_string rr = _right->eval_string(c, stack);
+
+				return starts_with(lr.c_str(), rr.c_str());
+			}
+
+			case ast_func_contains:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				xpath_string lr = _left->eval_string(c, stack);
+				xpath_string rr = _right->eval_string(c, stack);
+
+				return find_substring(lr.c_str(), rr.c_str()) != 0;
+			}
+
+			case ast_func_boolean:
+				return _left->eval_boolean(c, stack);
+				
+			case ast_func_not:
+				return !_left->eval_boolean(c, stack);
+				
+			case ast_func_true:
+				return true;
+				
+			case ast_func_false:
+				return false;
+
+			case ast_func_lang:
+			{
+				if (c.n.attribute()) return false;
+				
+				xpath_allocator_capture cr(stack.result);
+
+				xpath_string lang = _left->eval_string(c, stack);
+				
+				for (xml_node n = c.n.node(); n; n = n.parent())
+				{
+					xml_attribute a = n.attribute(PUGIXML_TEXT("xml:lang"));
+					
+					if (a)
+					{
+						const char_t* value = a.value();
+						
+						// strnicmp / strncasecmp is not portable
+						for (const char_t* lit = lang.c_str(); *lit; ++lit)
+						{
+							if (tolower_ascii(*lit) != tolower_ascii(*value)) return false;
+							++value;
+						}
+						
+						return *value == 0 || *value == '-';
+					}
+				}
+				
+				return false;
+			}
+
+			case ast_opt_compare_attribute:
+			{
+				const char_t* value = (_right->_type == ast_string_constant) ? _right->_data.string : _right->_data.variable->get_string();
+
+				xml_attribute attr = c.n.node().attribute(_left->_data.nodetest);
+
+				return attr && strequal(attr.value(), value) && is_xpath_attribute(attr.name());
+			}
+
+			case ast_variable:
+			{
+				assert(_rettype == _data.variable->type());
+
+				if (_rettype == xpath_type_boolean)
+					return _data.variable->get_boolean();
+
+				// fallthrough to type conversion
+			}
+
+			default:
+			{
+				switch (_rettype)
+				{
+				case xpath_type_number:
+					return convert_number_to_boolean(eval_number(c, stack));
+					
+				case xpath_type_string:
+				{
+					xpath_allocator_capture cr(stack.result);
+
+					return !eval_string(c, stack).empty();
+				}
+					
+				case xpath_type_node_set:				
+				{
+					xpath_allocator_capture cr(stack.result);
+
+					return !eval_node_set(c, stack, nodeset_eval_any).empty();
+				}
+
+				default:
+					assert(!"Wrong expression for return type boolean");
+					return false;
+				}
+			}
+			}
+		}
+
+		double eval_number(const xpath_context& c, const xpath_stack& stack)
+		{
+			switch (_type)
+			{
+			case ast_op_add:
+				return _left->eval_number(c, stack) + _right->eval_number(c, stack);
+				
+			case ast_op_subtract:
+				return _left->eval_number(c, stack) - _right->eval_number(c, stack);
+
+			case ast_op_multiply:
+				return _left->eval_number(c, stack) * _right->eval_number(c, stack);
+
+			case ast_op_divide:
+				return _left->eval_number(c, stack) / _right->eval_number(c, stack);
+
+			case ast_op_mod:
+				return fmod(_left->eval_number(c, stack), _right->eval_number(c, stack));
+
+			case ast_op_negate:
+				return -_left->eval_number(c, stack);
+
+			case ast_number_constant:
+				return _data.number;
+
+			case ast_func_last:
+				return static_cast<double>(c.size);
+			
+			case ast_func_position:
+				return static_cast<double>(c.position);
+
+			case ast_func_count:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				return static_cast<double>(_left->eval_node_set(c, stack, nodeset_eval_all).size());
+			}
+			
+			case ast_func_string_length_0:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				return static_cast<double>(string_value(c.n, stack.result).length());
+			}
+			
+			case ast_func_string_length_1:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				return static_cast<double>(_left->eval_string(c, stack).length());
+			}
+			
+			case ast_func_number_0:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				return convert_string_to_number(string_value(c.n, stack.result).c_str());
+			}
+			
+			case ast_func_number_1:
+				return _left->eval_number(c, stack);
+
+			case ast_func_sum:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				double r = 0;
+				
+				xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_all);
+				
+				for (const xpath_node* it = ns.begin(); it != ns.end(); ++it)
+				{
+					xpath_allocator_capture cri(stack.result);
+
+					r += convert_string_to_number(string_value(*it, stack.result).c_str());
+				}
+			
+				return r;
+			}
+
+			case ast_func_floor:
+			{
+				double r = _left->eval_number(c, stack);
+				
+				return r == r ? floor(r) : r;
+			}
+
+			case ast_func_ceiling:
+			{
+				double r = _left->eval_number(c, stack);
+				
+				return r == r ? ceil(r) : r;
+			}
+
+			case ast_func_round:
+				return round_nearest_nzero(_left->eval_number(c, stack));
+			
+			case ast_variable:
+			{
+				assert(_rettype == _data.variable->type());
+
+				if (_rettype == xpath_type_number)
+					return _data.variable->get_number();
+
+				// fallthrough to type conversion
+			}
+
+			default:
+			{
+				switch (_rettype)
+				{
+				case xpath_type_boolean:
+					return eval_boolean(c, stack) ? 1 : 0;
+					
+				case xpath_type_string:
+				{
+					xpath_allocator_capture cr(stack.result);
+
+					return convert_string_to_number(eval_string(c, stack).c_str());
+				}
+					
+				case xpath_type_node_set:
+				{
+					xpath_allocator_capture cr(stack.result);
+
+					return convert_string_to_number(eval_string(c, stack).c_str());
+				}
+					
+				default:
+					assert(!"Wrong expression for return type number");
+					return 0;
+				}
+				
+			}
+			}
+		}
+		
+		xpath_string eval_string_concat(const xpath_context& c, const xpath_stack& stack)
+		{
+			assert(_type == ast_func_concat);
+
+			xpath_allocator_capture ct(stack.temp);
+
+			// count the string number
+			size_t count = 1;
+			for (xpath_ast_node* nc = _right; nc; nc = nc->_next) count++;
+
+			// gather all strings
+			xpath_string static_buffer[4];
+			xpath_string* buffer = static_buffer;
+
+			// allocate on-heap for large concats
+			if (count > sizeof(static_buffer) / sizeof(static_buffer[0]))
+			{
+				buffer = static_cast<xpath_string*>(stack.temp->allocate(count * sizeof(xpath_string)));
+				assert(buffer);
+			}
+
+			// evaluate all strings to temporary stack
+			xpath_stack swapped_stack = {stack.temp, stack.result};
+
+			buffer[0] = _left->eval_string(c, swapped_stack);
+
+			size_t pos = 1;
+			for (xpath_ast_node* n = _right; n; n = n->_next, ++pos) buffer[pos] = n->eval_string(c, swapped_stack);
+			assert(pos == count);
+
+			// get total length
+			size_t length = 0;
+			for (size_t i = 0; i < count; ++i) length += buffer[i].length();
+
+			// create final string
+			char_t* result = static_cast<char_t*>(stack.result->allocate((length + 1) * sizeof(char_t)));
+			assert(result);
+
+			char_t* ri = result;
+
+			for (size_t j = 0; j < count; ++j)
+				for (const char_t* bi = buffer[j].c_str(); *bi; ++bi)
+					*ri++ = *bi;
+
+			*ri = 0;
+
+			return xpath_string::from_heap_preallocated(result, ri);
+		}
+
+		xpath_string eval_string(const xpath_context& c, const xpath_stack& stack)
+		{
+			switch (_type)
+			{
+			case ast_string_constant:
+				return xpath_string::from_const(_data.string);
+			
+			case ast_func_local_name_0:
+			{
+				xpath_node na = c.n;
+				
+				return xpath_string::from_const(local_name(na));
+			}
+
+			case ast_func_local_name_1:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);
+				xpath_node na = ns.first();
+				
+				return xpath_string::from_const(local_name(na));
+			}
+
+			case ast_func_name_0:
+			{
+				xpath_node na = c.n;
+				
+				return xpath_string::from_const(qualified_name(na));
+			}
+
+			case ast_func_name_1:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);
+				xpath_node na = ns.first();
+				
+				return xpath_string::from_const(qualified_name(na));
+			}
+
+			case ast_func_namespace_uri_0:
+			{
+				xpath_node na = c.n;
+				
+				return xpath_string::from_const(namespace_uri(na));
+			}
+
+			case ast_func_namespace_uri_1:
+			{
+				xpath_allocator_capture cr(stack.result);
+
+				xpath_node_set_raw ns = _left->eval_node_set(c, stack, nodeset_eval_first);
+				xpath_node na = ns.first();
+				
+				return xpath_string::from_const(namespace_uri(na));
+			}
+
+			case ast_func_string_0:
+				return string_value(c.n, stack.result);
+
+			case ast_func_string_1:
+				return _left->eval_string(c, stack);
+
+			case ast_func_concat:
+				return eval_string_concat(c, stack);
+
+			case ast_func_substring_before:
+			{
+				xpath_allocator_capture cr(stack.temp);
+
+				xpath_stack swapped_stack = {stack.temp, stack.result};
+
+				xpath_string s = _left->eval_string(c, swapped_stack);
+				xpath_string p = _right->eval_string(c, swapped_stack);
+
+				const char_t* pos = find_substring(s.c_str(), p.c_str());
+				
+				return pos ? xpath_string::from_heap(s.c_str(), pos, stack.result) : xpath_string();
+			}
+			
+			case ast_func_substring_after:
+			{
+				xpath_allocator_capture cr(stack.temp);
+
+				xpath_stack swapped_stack = {stack.temp, stack.result};
+
+				xpath_string s = _left->eval_string(c, swapped_stack);
+				xpath_string p = _right->eval_string(c, swapped_stack);
+				
+				const char_t* pos = find_substring(s.c_str(), p.c_str());
+				if (!pos) return xpath_string();
+
+				const char_t* rbegin = pos + p.length();
+				const char_t* rend = s.c_str() + s.length();
+
+				return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin);
+			}
+
+			case ast_func_substring_2:
+			{
+				xpath_allocator_capture cr(stack.temp);
+
+				xpath_stack swapped_stack = {stack.temp, stack.result};
+
+				xpath_string s = _left->eval_string(c, swapped_stack);
+				size_t s_length = s.length();
+
+				double first = round_nearest(_right->eval_number(c, stack));
+				
+				if (is_nan(first)) return xpath_string(); // NaN
+				else if (first >= s_length + 1) return xpath_string();
+				
+				size_t pos = first < 1 ? 1 : static_cast<size_t>(first);
+				assert(1 <= pos && pos <= s_length + 1);
+
+				const char_t* rbegin = s.c_str() + (pos - 1);
+				const char_t* rend = s.c_str() + s.length();
+				
+				return s.uses_heap() ? xpath_string::from_heap(rbegin, rend, stack.result) : xpath_string::from_const(rbegin);
+			}
+			
+			case ast_func_substring_3:
+			{
+				xpath_allocator_capture cr(stack.temp);
+
+				xpath_stack swapped_stack = {stack.temp, stack.result};
+
+				xpath_string s = _left->eval_string(c, swapped_stack);
+				size_t s_length = s.length();
+
+				double first = round_nearest(_right->eval_number(c, stack));
+				double last = first + round_nearest(_right->_next->eval_number(c, stack));
+				
+				if (is_nan(first) || is_nan(last)) return xpath_string();
+				else if (first >= s_length + 1) return xpath_string();
+				else if (first >= last) return xpath_string();
+				else if (last < 1) return xpath_string();
+				
+				size_t pos = first < 1 ? 1 : static_cast<size_t>(first);
+				size_t end = last >= s_length + 1 ? s_length + 1 : static_cast<size_t>(last);
+
+				assert(1 <= pos && pos <= end && end <= s_length + 1);
+				const char_t* rbegin = s.c_str() + (pos - 1);
+				const char_t* rend = s.c_str() + (end - 1);
+
+				return (end == s_length + 1 && !s.uses_heap()) ? xpath_string::from_const(rbegin) : xpath_string::from_heap(rbegin, rend, stack.result);
+			}
+
+			case ast_func_normalize_space_0:
+			{
+				xpath_string s = string_value(c.n, stack.result);
+
+				normalize_space(s.data(stack.result));
+
+				return s;
+			}
+
+			case ast_func_normalize_space_1:
+			{
+				xpath_string s = _left->eval_string(c, stack);
+
+				normalize_space(s.data(stack.result));
+			
+				return s;
+			}
+
+			case ast_func_translate:
+			{
+				xpath_allocator_capture cr(stack.temp);
+
+				xpath_stack swapped_stack = {stack.temp, stack.result};
+
+				xpath_string s = _left->eval_string(c, stack);
+				xpath_string from = _right->eval_string(c, swapped_stack);
+				xpath_string to = _right->_next->eval_string(c, swapped_stack);
+
+				translate(s.data(stack.result), from.c_str(), to.c_str(), to.length());
+
+				return s;
+			}
+
+			case ast_opt_translate_table:
+			{
+				xpath_string s = _left->eval_string(c, stack);
+
+				translate_table(s.data(stack.result), _data.table);
+
+				return s;
+			}
+
+			case ast_variable:
+			{
+				assert(_rettype == _data.variable->type());
+
+				if (_rettype == xpath_type_string)
+					return xpath_string::from_const(_data.variable->get_string());
+
+				// fallthrough to type conversion
+			}
+
+			default:
+			{
+				switch (_rettype)
+				{
+				case xpath_type_boolean:
+					return xpath_string::from_const(eval_boolean(c, stack) ? PUGIXML_TEXT("true") : PUGIXML_TEXT("false"));
+					
+				case xpath_type_number:
+					return convert_number_to_string(eval_number(c, stack), stack.result);
+					
+				case xpath_type_node_set:
+				{
+					xpath_allocator_capture cr(stack.temp);
+
+					xpath_stack swapped_stack = {stack.temp, stack.result};
+
+					xpath_node_set_raw ns = eval_node_set(c, swapped_stack, nodeset_eval_first);
+					return ns.empty() ? xpath_string() : string_value(ns.first(), stack.result);
+				}
+				
+				default:
+					assert(!"Wrong expression for return type string");
+					return xpath_string();
+				}
+			}
+			}
+		}
+
+		xpath_node_set_raw eval_node_set(const xpath_context& c, const xpath_stack& stack, nodeset_eval_t eval)
+		{
+			switch (_type)
+			{
+			case ast_op_union:
+			{
+				xpath_allocator_capture cr(stack.temp);
+
+				xpath_stack swapped_stack = {stack.temp, stack.result};
+
+				xpath_node_set_raw ls = _left->eval_node_set(c, swapped_stack, eval);
+				xpath_node_set_raw rs = _right->eval_node_set(c, stack, eval);
+
+				// we can optimize merging two sorted sets, but this is a very rare operation, so don't bother
+				rs.set_type(xpath_node_set::type_unsorted);
+
+				rs.append(ls.begin(), ls.end(), stack.result);
+				rs.remove_duplicates();
+
+				return rs;
+			}
+
+			case ast_filter:
+			{
+				xpath_node_set_raw set = _left->eval_node_set(c, stack, _test == predicate_constant_one ? nodeset_eval_first : nodeset_eval_all);
+
+				// either expression is a number or it contains position() call; sort by document order
+				if (_test != predicate_posinv) set.sort_do();
+
+				bool once = eval_once(set.type(), eval);
+
+				apply_predicate(set, 0, stack, once);
+			
+				return set;
+			}
+			
+			case ast_func_id:
+				return xpath_node_set_raw();
+			
+			case ast_step:
+			{
+				switch (_axis)
+				{
+				case axis_ancestor:
+					return step_do(c, stack, eval, axis_to_type<axis_ancestor>());
+					
+				case axis_ancestor_or_self:
+					return step_do(c, stack, eval, axis_to_type<axis_ancestor_or_self>());
+
+				case axis_attribute:
+					return step_do(c, stack, eval, axis_to_type<axis_attribute>());
+
+				case axis_child:
+					return step_do(c, stack, eval, axis_to_type<axis_child>());
+				
+				case axis_descendant:
+					return step_do(c, stack, eval, axis_to_type<axis_descendant>());
+
+				case axis_descendant_or_self:
+					return step_do(c, stack, eval, axis_to_type<axis_descendant_or_self>());
+
+				case axis_following:
+					return step_do(c, stack, eval, axis_to_type<axis_following>());
+				
+				case axis_following_sibling:
+					return step_do(c, stack, eval, axis_to_type<axis_following_sibling>());
+				
+				case axis_namespace:
+					// namespaced axis is not supported
+					return xpath_node_set_raw();
+				
+				case axis_parent:
+					return step_do(c, stack, eval, axis_to_type<axis_parent>());
+				
+				case axis_preceding:
+					return step_do(c, stack, eval, axis_to_type<axis_preceding>());
+
+				case axis_preceding_sibling:
+					return step_do(c, stack, eval, axis_to_type<axis_preceding_sibling>());
+				
+				case axis_self:
+					return step_do(c, stack, eval, axis_to_type<axis_self>());
+
+				default:
+					assert(!"Unknown axis");
+					return xpath_node_set_raw();
+				}
+			}
+
+			case ast_step_root:
+			{
+				assert(!_right); // root step can't have any predicates
+
+				xpath_node_set_raw ns;
+
+				ns.set_type(xpath_node_set::type_sorted);
+
+				if (c.n.node()) ns.push_back(c.n.node().root(), stack.result);
+				else if (c.n.attribute()) ns.push_back(c.n.parent().root(), stack.result);
+
+				return ns;
+			}
+
+			case ast_variable:
+			{
+				assert(_rettype == _data.variable->type());
+
+				if (_rettype == xpath_type_node_set)
+				{
+					const xpath_node_set& s = _data.variable->get_node_set();
+
+					xpath_node_set_raw ns;
+
+					ns.set_type(s.type());
+					ns.append(s.begin(), s.end(), stack.result);
+
+					return ns;
+				}
+
+				// fallthrough to type conversion
+			}
+
+			default:
+				assert(!"Wrong expression for return type node set");
+				return xpath_node_set_raw();
+			}
+		}
+
+		void optimize(xpath_allocator* alloc)
+		{
+			if (_left) _left->optimize(alloc);
+			if (_right) _right->optimize(alloc);
+			if (_next) _next->optimize(alloc);
+
+			// Rewrite [position()=expr] with [expr]
+			// Note that this step has to go before classification to recognize [position()=1]
+			if ((_type == ast_filter || _type == ast_predicate) &&
+				_right->_type == ast_op_equal && _right->_left->_type == ast_func_position && _right->_right->_rettype == xpath_type_number)
+			{
+				_right = _right->_right;
+			}
+
+			// Classify filter/predicate ops to perform various optimizations during evaluation
+			if (_type == ast_filter || _type == ast_predicate)
+			{
+				assert(_test == predicate_default);
+
+				if (_right->_type == ast_number_constant && _right->_data.number == 1.0)
+					_test = predicate_constant_one;
+				else if (_right->_rettype == xpath_type_number && (_right->_type == ast_number_constant || _right->_type == ast_variable || _right->_type == ast_func_last))
+					_test = predicate_constant;
+				else if (_right->_rettype != xpath_type_number && _right->is_posinv_expr())
+					_test = predicate_posinv;
+			}
+
+			// Rewrite descendant-or-self::node()/child::foo with descendant::foo
+			// The former is a full form of //foo, the latter is much faster since it executes the node test immediately
+			// Do a similar kind of rewrite for self/descendant/descendant-or-self axes
+			// Note that we only rewrite positionally invariant steps (//foo[1] != /descendant::foo[1])
+			if (_type == ast_step && (_axis == axis_child || _axis == axis_self || _axis == axis_descendant || _axis == axis_descendant_or_self) && _left &&
+				_left->_type == ast_step && _left->_axis == axis_descendant_or_self && _left->_test == nodetest_type_node && !_left->_right &&
+				is_posinv_step())
+			{
+				if (_axis == axis_child || _axis == axis_descendant)
+					_axis = axis_descendant;
+				else
+					_axis = axis_descendant_or_self;
+
+				_left = _left->_left;
+			}
+
+			// Use optimized lookup table implementation for translate() with constant arguments
+			if (_type == ast_func_translate && _right->_type == ast_string_constant && _right->_next->_type == ast_string_constant)
+			{
+				unsigned char* table = translate_table_generate(alloc, _right->_data.string, _right->_next->_data.string);
+
+				if (table)
+				{
+					_type = ast_opt_translate_table;
+					_data.table = table;
+				}
+			}
+
+			// Use optimized path for @attr = 'value' or @attr = $value
+			if (_type == ast_op_equal &&
+				_left->_type == ast_step && _left->_axis == axis_attribute && _left->_test == nodetest_name && !_left->_left && !_left->_right &&
+				(_right->_type == ast_string_constant || (_right->_type == ast_variable && _right->_rettype == xpath_type_string)))
+			{
+				_type = ast_opt_compare_attribute;
+			}
+		}
+		
+		bool is_posinv_expr() const
+		{
+			switch (_type)
+			{
+			case ast_func_position:
+			case ast_func_last:
+				return false;
+
+			case ast_string_constant:
+			case ast_number_constant:
+			case ast_variable:
+				return true;
+
+			case ast_step:
+			case ast_step_root:
+				return true;
+
+			case ast_predicate:
+			case ast_filter:
+				return true;
+
+			default:
+				if (_left && !_left->is_posinv_expr()) return false;
+				
+				for (xpath_ast_node* n = _right; n; n = n->_next)
+					if (!n->is_posinv_expr()) return false;
+					
+				return true;
+			}
+		}
+
+		bool is_posinv_step() const
+		{
+			assert(_type == ast_step);
+
+			for (xpath_ast_node* n = _right; n; n = n->_next)
+			{
+				assert(n->_type == ast_predicate);
+
+				if (n->_test != predicate_posinv)
+					return false;
+			}
+
+			return true;
+		}
+
+		xpath_value_type rettype() const
+		{
+			return static_cast<xpath_value_type>(_rettype);
+		}
+	};
+
+	struct xpath_parser
+	{
+		xpath_allocator* _alloc;
+		xpath_lexer _lexer;
+
+		const char_t* _query;
+		xpath_variable_set* _variables;
+
+		xpath_parse_result* _result;
+
+		char_t _scratch[32];
+
+	#ifdef PUGIXML_NO_EXCEPTIONS
+		jmp_buf _error_handler;
+	#endif
+
+		void throw_error(const char* message)
+		{
+			_result->error = message;
+			_result->offset = _lexer.current_pos() - _query;
+
+		#ifdef PUGIXML_NO_EXCEPTIONS
+			longjmp(_error_handler, 1);
+		#else
+			throw xpath_exception(*_result);
+		#endif
+		}
+
+		void throw_error_oom()
+		{
+		#ifdef PUGIXML_NO_EXCEPTIONS
+			throw_error("Out of memory");
+		#else
+			throw std::bad_alloc();
+		#endif
+		}
+
+		void* alloc_node()
+		{
+			void* result = _alloc->allocate_nothrow(sizeof(xpath_ast_node));
+
+			if (!result) throw_error_oom();
+
+			return result;
+		}
+
+		const char_t* alloc_string(const xpath_lexer_string& value)
+		{
+			if (value.begin)
+			{
+				size_t length = static_cast<size_t>(value.end - value.begin);
+
+				char_t* c = static_cast<char_t*>(_alloc->allocate_nothrow((length + 1) * sizeof(char_t)));
+				if (!c) throw_error_oom();
+				assert(c); // workaround for clang static analysis
+
+				memcpy(c, value.begin, length * sizeof(char_t));
+				c[length] = 0;
+
+				return c;
+			}
+			else return 0;
+		}
+
+		xpath_ast_node* parse_function_helper(ast_type_t type0, ast_type_t type1, size_t argc, xpath_ast_node* args[2])
+		{
+			assert(argc <= 1);
+
+			if (argc == 1 && args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set");
+
+			return new (alloc_node()) xpath_ast_node(argc == 0 ? type0 : type1, xpath_type_string, args[0]);
+		}
+
+		xpath_ast_node* parse_function(const xpath_lexer_string& name, size_t argc, xpath_ast_node* args[2])
+		{
+			switch (name.begin[0])
+			{
+			case 'b':
+				if (name == PUGIXML_TEXT("boolean") && argc == 1)
+					return new (alloc_node()) xpath_ast_node(ast_func_boolean, xpath_type_boolean, args[0]);
+					
+				break;
+			
+			case 'c':
+				if (name == PUGIXML_TEXT("count") && argc == 1)
+				{
+					if (args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set");
+					return new (alloc_node()) xpath_ast_node(ast_func_count, xpath_type_number, args[0]);
+				}
+				else if (name == PUGIXML_TEXT("contains") && argc == 2)
+					return new (alloc_node()) xpath_ast_node(ast_func_contains, xpath_type_boolean, args[0], args[1]);
+				else if (name == PUGIXML_TEXT("concat") && argc >= 2)
+					return new (alloc_node()) xpath_ast_node(ast_func_concat, xpath_type_string, args[0], args[1]);
+				else if (name == PUGIXML_TEXT("ceiling") && argc == 1)
+					return new (alloc_node()) xpath_ast_node(ast_func_ceiling, xpath_type_number, args[0]);
+					
+				break;
+			
+			case 'f':
+				if (name == PUGIXML_TEXT("false") && argc == 0)
+					return new (alloc_node()) xpath_ast_node(ast_func_false, xpath_type_boolean);
+				else if (name == PUGIXML_TEXT("floor") && argc == 1)
+					return new (alloc_node()) xpath_ast_node(ast_func_floor, xpath_type_number, args[0]);
+					
+				break;
+			
+			case 'i':
+				if (name == PUGIXML_TEXT("id") && argc == 1)
+					return new (alloc_node()) xpath_ast_node(ast_func_id, xpath_type_node_set, args[0]);
+					
+				break;
+			
+			case 'l':
+				if (name == PUGIXML_TEXT("last") && argc == 0)
+					return new (alloc_node()) xpath_ast_node(ast_func_last, xpath_type_number);
+				else if (name == PUGIXML_TEXT("lang") && argc == 1)
+					return new (alloc_node()) xpath_ast_node(ast_func_lang, xpath_type_boolean, args[0]);
+				else if (name == PUGIXML_TEXT("local-name") && argc <= 1)
+					return parse_function_helper(ast_func_local_name_0, ast_func_local_name_1, argc, args);
+			
+				break;
+			
+			case 'n':
+				if (name == PUGIXML_TEXT("name") && argc <= 1)
+					return parse_function_helper(ast_func_name_0, ast_func_name_1, argc, args);
+				else if (name == PUGIXML_TEXT("namespace-uri") && argc <= 1)
+					return parse_function_helper(ast_func_namespace_uri_0, ast_func_namespace_uri_1, argc, args);
+				else if (name == PUGIXML_TEXT("normalize-space") && argc <= 1)
+					return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_normalize_space_0 : ast_func_normalize_space_1, xpath_type_string, args[0], args[1]);
+				else if (name == PUGIXML_TEXT("not") && argc == 1)
+					return new (alloc_node()) xpath_ast_node(ast_func_not, xpath_type_boolean, args[0]);
+				else if (name == PUGIXML_TEXT("number") && argc <= 1)
+					return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_number_0 : ast_func_number_1, xpath_type_number, args[0]);
+			
+				break;
+			
+			case 'p':
+				if (name == PUGIXML_TEXT("position") && argc == 0)
+					return new (alloc_node()) xpath_ast_node(ast_func_position, xpath_type_number);
+				
+				break;
+			
+			case 'r':
+				if (name == PUGIXML_TEXT("round") && argc == 1)
+					return new (alloc_node()) xpath_ast_node(ast_func_round, xpath_type_number, args[0]);
+
+				break;
+			
+			case 's':
+				if (name == PUGIXML_TEXT("string") && argc <= 1)
+					return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_0 : ast_func_string_1, xpath_type_string, args[0]);
+				else if (name == PUGIXML_TEXT("string-length") && argc <= 1)
+					return new (alloc_node()) xpath_ast_node(argc == 0 ? ast_func_string_length_0 : ast_func_string_length_1, xpath_type_number, args[0]);
+				else if (name == PUGIXML_TEXT("starts-with") && argc == 2)
+					return new (alloc_node()) xpath_ast_node(ast_func_starts_with, xpath_type_boolean, args[0], args[1]);
+				else if (name == PUGIXML_TEXT("substring-before") && argc == 2)
+					return new (alloc_node()) xpath_ast_node(ast_func_substring_before, xpath_type_string, args[0], args[1]);
+				else if (name == PUGIXML_TEXT("substring-after") && argc == 2)
+					return new (alloc_node()) xpath_ast_node(ast_func_substring_after, xpath_type_string, args[0], args[1]);
+				else if (name == PUGIXML_TEXT("substring") && (argc == 2 || argc == 3))
+					return new (alloc_node()) xpath_ast_node(argc == 2 ? ast_func_substring_2 : ast_func_substring_3, xpath_type_string, args[0], args[1]);
+				else if (name == PUGIXML_TEXT("sum") && argc == 1)
+				{
+					if (args[0]->rettype() != xpath_type_node_set) throw_error("Function has to be applied to node set");
+					return new (alloc_node()) xpath_ast_node(ast_func_sum, xpath_type_number, args[0]);
+				}
+
+				break;
+			
+			case 't':
+				if (name == PUGIXML_TEXT("translate") && argc == 3)
+					return new (alloc_node()) xpath_ast_node(ast_func_translate, xpath_type_string, args[0], args[1]);
+				else if (name == PUGIXML_TEXT("true") && argc == 0)
+					return new (alloc_node()) xpath_ast_node(ast_func_true, xpath_type_boolean);
+					
+				break;
+
+			default:
+				break;
+			}
+
+			throw_error("Unrecognized function or wrong parameter count");
+
+			return 0;
+		}
+
+		axis_t parse_axis_name(const xpath_lexer_string& name, bool& specified)
+		{
+			specified = true;
+
+			switch (name.begin[0])
+			{
+			case 'a':
+				if (name == PUGIXML_TEXT("ancestor"))
+					return axis_ancestor;
+				else if (name == PUGIXML_TEXT("ancestor-or-self"))
+					return axis_ancestor_or_self;
+				else if (name == PUGIXML_TEXT("attribute"))
+					return axis_attribute;
+				
+				break;
+			
+			case 'c':
+				if (name == PUGIXML_TEXT("child"))
+					return axis_child;
+				
+				break;
+			
+			case 'd':
+				if (name == PUGIXML_TEXT("descendant"))
+					return axis_descendant;
+				else if (name == PUGIXML_TEXT("descendant-or-self"))
+					return axis_descendant_or_self;
+				
+				break;
+			
+			case 'f':
+				if (name == PUGIXML_TEXT("following"))
+					return axis_following;
+				else if (name == PUGIXML_TEXT("following-sibling"))
+					return axis_following_sibling;
+				
+				break;
+			
+			case 'n':
+				if (name == PUGIXML_TEXT("namespace"))
+					return axis_namespace;
+				
+				break;
+			
+			case 'p':
+				if (name == PUGIXML_TEXT("parent"))
+					return axis_parent;
+				else if (name == PUGIXML_TEXT("preceding"))
+					return axis_preceding;
+				else if (name == PUGIXML_TEXT("preceding-sibling"))
+					return axis_preceding_sibling;
+				
+				break;
+			
+			case 's':
+				if (name == PUGIXML_TEXT("self"))
+					return axis_self;
+				
+				break;
+
+			default:
+				break;
+			}
+
+			specified = false;
+			return axis_child;
+		}
+
+		nodetest_t parse_node_test_type(const xpath_lexer_string& name)
+		{
+			switch (name.begin[0])
+			{
+			case 'c':
+				if (name == PUGIXML_TEXT("comment"))
+					return nodetest_type_comment;
+
+				break;
+
+			case 'n':
+				if (name == PUGIXML_TEXT("node"))
+					return nodetest_type_node;
+
+				break;
+
+			case 'p':
+				if (name == PUGIXML_TEXT("processing-instruction"))
+					return nodetest_type_pi;
+
+				break;
+
+			case 't':
+				if (name == PUGIXML_TEXT("text"))
+					return nodetest_type_text;
+
+				break;
+			
+			default:
+				break;
+			}
+
+			return nodetest_none;
+		}
+
+		// PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall
+		xpath_ast_node* parse_primary_expression()
+		{
+			switch (_lexer.current())
+			{
+			case lex_var_ref:
+			{
+				xpath_lexer_string name = _lexer.contents();
+
+				if (!_variables)
+					throw_error("Unknown variable: variable set is not provided");
+
+				xpath_variable* var = get_variable_scratch(_scratch, _variables, name.begin, name.end);
+
+				if (!var)
+					throw_error("Unknown variable: variable set does not contain the given name");
+
+				_lexer.next();
+
+				return new (alloc_node()) xpath_ast_node(ast_variable, var->type(), var);
+			}
+
+			case lex_open_brace:
+			{
+				_lexer.next();
+
+				xpath_ast_node* n = parse_expression();
+
+				if (_lexer.current() != lex_close_brace)
+					throw_error("Unmatched braces");
+
+				_lexer.next();
+
+				return n;
+			}
+
+			case lex_quoted_string:
+			{
+				const char_t* value = alloc_string(_lexer.contents());
+
+				xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_string_constant, xpath_type_string, value);
+				_lexer.next();
+
+				return n;
+			}
+
+			case lex_number:
+			{
+				double value = 0;
+
+				if (!convert_string_to_number_scratch(_scratch, _lexer.contents().begin, _lexer.contents().end, &value))
+					throw_error_oom();
+
+				xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_number_constant, xpath_type_number, value);
+				_lexer.next();
+
+				return n;
+			}
+
+			case lex_string:
+			{
+				xpath_ast_node* args[2] = {0};
+				size_t argc = 0;
+				
+				xpath_lexer_string function = _lexer.contents();
+				_lexer.next();
+				
+				xpath_ast_node* last_arg = 0;
+				
+				if (_lexer.current() != lex_open_brace)
+					throw_error("Unrecognized function call");
+				_lexer.next();
+
+				if (_lexer.current() != lex_close_brace)
+					args[argc++] = parse_expression();
+
+				while (_lexer.current() != lex_close_brace)
+				{
+					if (_lexer.current() != lex_comma)
+						throw_error("No comma between function arguments");
+					_lexer.next();
+					
+					xpath_ast_node* n = parse_expression();
+					
+					if (argc < 2) args[argc] = n;
+					else last_arg->set_next(n);
+
+					argc++;
+					last_arg = n;
+				}
+				
+				_lexer.next();
+
+				return parse_function(function, argc, args);
+			}
+
+			default:
+				throw_error("Unrecognizable primary expression");
+
+				return 0;
+			}
+		}
+		
+		// FilterExpr ::= PrimaryExpr | FilterExpr Predicate
+		// Predicate ::= '[' PredicateExpr ']'
+		// PredicateExpr ::= Expr
+		xpath_ast_node* parse_filter_expression()
+		{
+			xpath_ast_node* n = parse_primary_expression();
+
+			while (_lexer.current() == lex_open_square_brace)
+			{
+				_lexer.next();
+
+				xpath_ast_node* expr = parse_expression();
+
+				if (n->rettype() != xpath_type_node_set) throw_error("Predicate has to be applied to node set");
+
+				n = new (alloc_node()) xpath_ast_node(ast_filter, n, expr, predicate_default);
+
+				if (_lexer.current() != lex_close_square_brace)
+					throw_error("Unmatched square brace");
+			
+				_lexer.next();
+			}
+			
+			return n;
+		}
+		
+		// Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
+		// AxisSpecifier ::= AxisName '::' | '@'?
+		// NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')'
+		// NameTest ::= '*' | NCName ':' '*' | QName
+		// AbbreviatedStep ::= '.' | '..'
+		xpath_ast_node* parse_step(xpath_ast_node* set)
+		{
+			if (set && set->rettype() != xpath_type_node_set)
+				throw_error("Step has to be applied to node set");
+
+			bool axis_specified = false;
+			axis_t axis = axis_child; // implied child axis
+
+			if (_lexer.current() == lex_axis_attribute)
+			{
+				axis = axis_attribute;
+				axis_specified = true;
+				
+				_lexer.next();
+			}
+			else if (_lexer.current() == lex_dot)
+			{
+				_lexer.next();
+				
+				return new (alloc_node()) xpath_ast_node(ast_step, set, axis_self, nodetest_type_node, 0);
+			}
+			else if (_lexer.current() == lex_double_dot)
+			{
+				_lexer.next();
+				
+				return new (alloc_node()) xpath_ast_node(ast_step, set, axis_parent, nodetest_type_node, 0);
+			}
+		
+			nodetest_t nt_type = nodetest_none;
+			xpath_lexer_string nt_name;
+			
+			if (_lexer.current() == lex_string)
+			{
+				// node name test
+				nt_name = _lexer.contents();
+				_lexer.next();
+
+				// was it an axis name?
+				if (_lexer.current() == lex_double_colon)
+				{
+					// parse axis name
+					if (axis_specified) throw_error("Two axis specifiers in one step");
+
+					axis = parse_axis_name(nt_name, axis_specified);
+
+					if (!axis_specified) throw_error("Unknown axis");
+
+					// read actual node test
+					_lexer.next();
+
+					if (_lexer.current() == lex_multiply)
+					{
+						nt_type = nodetest_all;
+						nt_name = xpath_lexer_string();
+						_lexer.next();
+					}
+					else if (_lexer.current() == lex_string)
+					{
+						nt_name = _lexer.contents();
+						_lexer.next();
+					}
+					else throw_error("Unrecognized node test");
+				}
+				
+				if (nt_type == nodetest_none)
+				{
+					// node type test or processing-instruction
+					if (_lexer.current() == lex_open_brace)
+					{
+						_lexer.next();
+						
+						if (_lexer.current() == lex_close_brace)
+						{
+							_lexer.next();
+
+							nt_type = parse_node_test_type(nt_name);
+
+							if (nt_type == nodetest_none) throw_error("Unrecognized node type");
+							
+							nt_name = xpath_lexer_string();
+						}
+						else if (nt_name == PUGIXML_TEXT("processing-instruction"))
+						{
+							if (_lexer.current() != lex_quoted_string)
+								throw_error("Only literals are allowed as arguments to processing-instruction()");
+						
+							nt_type = nodetest_pi;
+							nt_name = _lexer.contents();
+							_lexer.next();
+							
+							if (_lexer.current() != lex_close_brace)
+								throw_error("Unmatched brace near processing-instruction()");
+							_lexer.next();
+						}
+						else
+							throw_error("Unmatched brace near node type test");
+
+					}
+					// QName or NCName:*
+					else
+					{
+						if (nt_name.end - nt_name.begin > 2 && nt_name.end[-2] == ':' && nt_name.end[-1] == '*') // NCName:*
+						{
+							nt_name.end--; // erase *
+							
+							nt_type = nodetest_all_in_namespace;
+						}
+						else nt_type = nodetest_name;
+					}
+				}
+			}
+			else if (_lexer.current() == lex_multiply)
+			{
+				nt_type = nodetest_all;
+				_lexer.next();
+			}
+			else throw_error("Unrecognized node test");
+			
+			xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step, set, axis, nt_type, alloc_string(nt_name));
+			
+			xpath_ast_node* last = 0;
+			
+			while (_lexer.current() == lex_open_square_brace)
+			{
+				_lexer.next();
+				
+				xpath_ast_node* expr = parse_expression();
+
+				xpath_ast_node* pred = new (alloc_node()) xpath_ast_node(ast_predicate, 0, expr, predicate_default);
+				
+				if (_lexer.current() != lex_close_square_brace)
+					throw_error("Unmatched square brace");
+				_lexer.next();
+				
+				if (last) last->set_next(pred);
+				else n->set_right(pred);
+				
+				last = pred;
+			}
+
+			return n;
+		}
+		
+		// RelativeLocationPath ::= Step | RelativeLocationPath '/' Step | RelativeLocationPath '//' Step
+		xpath_ast_node* parse_relative_location_path(xpath_ast_node* set)
+		{
+			xpath_ast_node* n = parse_step(set);
+			
+			while (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash)
+			{
+				lexeme_t l = _lexer.current();
+				_lexer.next();
+
+				if (l == lex_double_slash)
+					n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);
+				
+				n = parse_step(n);
+			}
+			
+			return n;
+		}
+		
+		// LocationPath ::= RelativeLocationPath | AbsoluteLocationPath
+		// AbsoluteLocationPath ::= '/' RelativeLocationPath? | '//' RelativeLocationPath
+		xpath_ast_node* parse_location_path()
+		{
+			if (_lexer.current() == lex_slash)
+			{
+				_lexer.next();
+				
+				xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set);
+
+				// relative location path can start from axis_attribute, dot, double_dot, multiply and string lexemes; any other lexeme means standalone root path
+				lexeme_t l = _lexer.current();
+
+				if (l == lex_string || l == lex_axis_attribute || l == lex_dot || l == lex_double_dot || l == lex_multiply)
+					return parse_relative_location_path(n);
+				else
+					return n;
+			}
+			else if (_lexer.current() == lex_double_slash)
+			{
+				_lexer.next();
+				
+				xpath_ast_node* n = new (alloc_node()) xpath_ast_node(ast_step_root, xpath_type_node_set);
+				n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);
+				
+				return parse_relative_location_path(n);
+			}
+
+			// else clause moved outside of if because of bogus warning 'control may reach end of non-void function being inlined' in gcc 4.0.1
+			return parse_relative_location_path(0);
+		}
+		
+		// PathExpr ::= LocationPath
+		//				| FilterExpr
+		//				| FilterExpr '/' RelativeLocationPath
+		//				| FilterExpr '//' RelativeLocationPath
+		// UnionExpr ::= PathExpr | UnionExpr '|' PathExpr
+		// UnaryExpr ::= UnionExpr | '-' UnaryExpr
+		xpath_ast_node* parse_path_or_unary_expression()
+		{
+			// Clarification.
+			// PathExpr begins with either LocationPath or FilterExpr.
+			// FilterExpr begins with PrimaryExpr
+			// PrimaryExpr begins with '$' in case of it being a variable reference,
+			// '(' in case of it being an expression, string literal, number constant or
+			// function call.
+
+			if (_lexer.current() == lex_var_ref || _lexer.current() == lex_open_brace || 
+				_lexer.current() == lex_quoted_string || _lexer.current() == lex_number ||
+				_lexer.current() == lex_string)
+			{
+				if (_lexer.current() == lex_string)
+				{
+					// This is either a function call, or not - if not, we shall proceed with location path
+					const char_t* state = _lexer.state();
+					
+					while (PUGI__IS_CHARTYPE(*state, ct_space)) ++state;
+					
+					if (*state != '(') return parse_location_path();
+
+					// This looks like a function call; however this still can be a node-test. Check it.
+					if (parse_node_test_type(_lexer.contents()) != nodetest_none) return parse_location_path();
+				}
+				
+				xpath_ast_node* n = parse_filter_expression();
+
+				if (_lexer.current() == lex_slash || _lexer.current() == lex_double_slash)
+				{
+					lexeme_t l = _lexer.current();
+					_lexer.next();
+					
+					if (l == lex_double_slash)
+					{
+						if (n->rettype() != xpath_type_node_set) throw_error("Step has to be applied to node set");
+
+						n = new (alloc_node()) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0);
+					}
+	
+					// select from location path
+					return parse_relative_location_path(n);
+				}
+
+				return n;
+			}
+			else if (_lexer.current() == lex_minus)
+			{
+				_lexer.next();
+
+				// precedence 7+ - only parses union expressions
+				xpath_ast_node* expr = parse_expression_rec(parse_path_or_unary_expression(), 7);
+
+				return new (alloc_node()) xpath_ast_node(ast_op_negate, xpath_type_number, expr);
+			}
+			else
+				return parse_location_path();
+		}
+
+		struct binary_op_t
+		{
+			ast_type_t asttype;
+			xpath_value_type rettype;
+			int precedence;
+
+			binary_op_t(): asttype(ast_unknown), rettype(xpath_type_none), precedence(0)
+			{
+			}
+
+			binary_op_t(ast_type_t asttype_, xpath_value_type rettype_, int precedence_): asttype(asttype_), rettype(rettype_), precedence(precedence_)
+			{
+			}
+
+			static binary_op_t parse(xpath_lexer& lexer)
+			{
+				switch (lexer.current())
+				{
+				case lex_string:
+					if (lexer.contents() == PUGIXML_TEXT("or"))
+						return binary_op_t(ast_op_or, xpath_type_boolean, 1);
+					else if (lexer.contents() == PUGIXML_TEXT("and"))
+						return binary_op_t(ast_op_and, xpath_type_boolean, 2);
+					else if (lexer.contents() == PUGIXML_TEXT("div"))
+						return binary_op_t(ast_op_divide, xpath_type_number, 6);
+					else if (lexer.contents() == PUGIXML_TEXT("mod"))
+						return binary_op_t(ast_op_mod, xpath_type_number, 6);
+					else
+						return binary_op_t();
+
+				case lex_equal:
+					return binary_op_t(ast_op_equal, xpath_type_boolean, 3);
+
+				case lex_not_equal:
+					return binary_op_t(ast_op_not_equal, xpath_type_boolean, 3);
+
+				case lex_less:
+					return binary_op_t(ast_op_less, xpath_type_boolean, 4);
+
+				case lex_greater:
+					return binary_op_t(ast_op_greater, xpath_type_boolean, 4);
+
+				case lex_less_or_equal:
+					return binary_op_t(ast_op_less_or_equal, xpath_type_boolean, 4);
+
+				case lex_greater_or_equal:
+					return binary_op_t(ast_op_greater_or_equal, xpath_type_boolean, 4);
+
+				case lex_plus:
+					return binary_op_t(ast_op_add, xpath_type_number, 5);
+
+				case lex_minus:
+					return binary_op_t(ast_op_subtract, xpath_type_number, 5);
+
+				case lex_multiply:
+					return binary_op_t(ast_op_multiply, xpath_type_number, 6);
+
+				case lex_union:
+					return binary_op_t(ast_op_union, xpath_type_node_set, 7);
+
+				default:
+					return binary_op_t();
+				}
+			}
+		};
+
+		xpath_ast_node* parse_expression_rec(xpath_ast_node* lhs, int limit)
+		{
+			binary_op_t op = binary_op_t::parse(_lexer);
+
+			while (op.asttype != ast_unknown && op.precedence >= limit)
+			{
+				_lexer.next();
+
+				xpath_ast_node* rhs = parse_path_or_unary_expression();
+
+				binary_op_t nextop = binary_op_t::parse(_lexer);
+
+				while (nextop.asttype != ast_unknown && nextop.precedence > op.precedence)
+				{
+					rhs = parse_expression_rec(rhs, nextop.precedence);
+
+					nextop = binary_op_t::parse(_lexer);
+				}
+
+				if (op.asttype == ast_op_union && (lhs->rettype() != xpath_type_node_set || rhs->rettype() != xpath_type_node_set))
+					throw_error("Union operator has to be applied to node sets");
+
+				lhs = new (alloc_node()) xpath_ast_node(op.asttype, op.rettype, lhs, rhs);
+
+				op = binary_op_t::parse(_lexer);
+			}
+
+			return lhs;
+		}
+
+		// Expr ::= OrExpr
+		// OrExpr ::= AndExpr | OrExpr 'or' AndExpr
+		// AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr
+		// EqualityExpr ::= RelationalExpr
+		//					| EqualityExpr '=' RelationalExpr
+		//					| EqualityExpr '!=' RelationalExpr
+		// RelationalExpr ::= AdditiveExpr
+		//					  | RelationalExpr '<' AdditiveExpr
+		//					  | RelationalExpr '>' AdditiveExpr
+		//					  | RelationalExpr '<=' AdditiveExpr
+		//					  | RelationalExpr '>=' AdditiveExpr
+		// AdditiveExpr ::= MultiplicativeExpr
+		//					| AdditiveExpr '+' MultiplicativeExpr
+		//					| AdditiveExpr '-' MultiplicativeExpr
+		// MultiplicativeExpr ::= UnaryExpr
+		//						  | MultiplicativeExpr '*' UnaryExpr
+		//						  | MultiplicativeExpr 'div' UnaryExpr
+		//						  | MultiplicativeExpr 'mod' UnaryExpr
+		xpath_ast_node* parse_expression()
+		{
+			return parse_expression_rec(parse_path_or_unary_expression(), 0);
+		}
+
+		xpath_parser(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result): _alloc(alloc), _lexer(query), _query(query), _variables(variables), _result(result)
+		{
+		}
+
+		xpath_ast_node* parse()
+		{
+			xpath_ast_node* result = parse_expression();
+			
+			if (_lexer.current() != lex_eof)
+			{
+				// there are still unparsed tokens left, error
+				throw_error("Incorrect query");
+			}
+			
+			return result;
+		}
+
+		static xpath_ast_node* parse(const char_t* query, xpath_variable_set* variables, xpath_allocator* alloc, xpath_parse_result* result)
+		{
+			xpath_parser parser(query, variables, alloc, result);
+
+		#ifdef PUGIXML_NO_EXCEPTIONS
+			int error = setjmp(parser._error_handler);
+
+			return (error == 0) ? parser.parse() : 0;
+		#else
+			return parser.parse();
+		#endif
+		}
+	};
+
+	struct xpath_query_impl
+	{
+		static xpath_query_impl* create()
+		{
+			void* memory = xml_memory::allocate(sizeof(xpath_query_impl));
+
+			return new (memory) xpath_query_impl();
+		}
+
+		static void destroy(void* ptr)
+		{
+			if (!ptr) return;
+			
+			// free all allocated pages
+			static_cast<xpath_query_impl*>(ptr)->alloc.release();
+
+			// free allocator memory (with the first page)
+			xml_memory::deallocate(ptr);
+		}
+
+		xpath_query_impl(): root(0), alloc(&block)
+		{
+			block.next = 0;
+			block.capacity = sizeof(block.data);
+		}
+
+		xpath_ast_node* root;
+		xpath_allocator alloc;
+		xpath_memory_block block;
+	};
+
+	PUGI__FN xpath_string evaluate_string_impl(xpath_query_impl* impl, const xpath_node& n, xpath_stack_data& sd)
+	{
+		if (!impl) return xpath_string();
+
+	#ifdef PUGIXML_NO_EXCEPTIONS
+		if (setjmp(sd.error_handler)) return xpath_string();
+	#endif
+
+		xpath_context c(n, 1, 1);
+
+		return impl->root->eval_string(c, sd.stack);
+	}
+
+	PUGI__FN impl::xpath_ast_node* evaluate_node_set_prepare(xpath_query_impl* impl)
+	{
+		if (!impl) return 0;
+
+		if (impl->root->rettype() != xpath_type_node_set)
+		{
+		#ifdef PUGIXML_NO_EXCEPTIONS
+			return 0;
+		#else
+			xpath_parse_result res;
+			res.error = "Expression does not evaluate to node set";
+
+			throw xpath_exception(res);
+		#endif
+		}
+
+		return impl->root;
+	}
+PUGI__NS_END
+
+namespace pugi
+{
+#ifndef PUGIXML_NO_EXCEPTIONS
+	PUGI__FN xpath_exception::xpath_exception(const xpath_parse_result& result_): _result(result_)
+	{
+		assert(_result.error);
+	}
+	
+	PUGI__FN const char* xpath_exception::what() const throw()
+	{
+		return _result.error;
+	}
+
+	PUGI__FN const xpath_parse_result& xpath_exception::result() const
+	{
+		return _result;
+	}
+#endif
+	
+	PUGI__FN xpath_node::xpath_node()
+	{
+	}
+		
+	PUGI__FN xpath_node::xpath_node(const xml_node& node_): _node(node_)
+	{
+	}
+		
+	PUGI__FN xpath_node::xpath_node(const xml_attribute& attribute_, const xml_node& parent_): _node(attribute_ ? parent_ : xml_node()), _attribute(attribute_)
+	{
+	}
+
+	PUGI__FN xml_node xpath_node::node() const
+	{
+		return _attribute ? xml_node() : _node;
+	}
+		
+	PUGI__FN xml_attribute xpath_node::attribute() const
+	{
+		return _attribute;
+	}
+	
+	PUGI__FN xml_node xpath_node::parent() const
+	{
+		return _attribute ? _node : _node.parent();
+	}
+
+	PUGI__FN static void unspecified_bool_xpath_node(xpath_node***)
+	{
+	}
+
+	PUGI__FN xpath_node::operator xpath_node::unspecified_bool_type() const
+	{
+		return (_node || _attribute) ? unspecified_bool_xpath_node : 0;
+	}
+	
+	PUGI__FN bool xpath_node::operator!() const
+	{
+		return !(_node || _attribute);
+	}
+
+	PUGI__FN bool xpath_node::operator==(const xpath_node& n) const
+	{
+		return _node == n._node && _attribute == n._attribute;
+	}
+	
+	PUGI__FN bool xpath_node::operator!=(const xpath_node& n) const
+	{
+		return _node != n._node || _attribute != n._attribute;
+	}
+
+#ifdef __BORLANDC__
+	PUGI__FN bool operator&&(const xpath_node& lhs, bool rhs)
+	{
+		return (bool)lhs && rhs;
+	}
+
+	PUGI__FN bool operator||(const xpath_node& lhs, bool rhs)
+	{
+		return (bool)lhs || rhs;
+	}
+#endif
+
+	PUGI__FN void xpath_node_set::_assign(const_iterator begin_, const_iterator end_)
+	{
+		assert(begin_ <= end_);
+
+		size_t size_ = static_cast<size_t>(end_ - begin_);
+
+		if (size_ <= 1)
+		{
+			// deallocate old buffer
+			if (_begin != &_storage) impl::xml_memory::deallocate(_begin);
+
+			// use internal buffer
+			if (begin_ != end_) _storage = *begin_;
+
+			_begin = &_storage;
+			_end = &_storage + size_;
+		}
+		else
+		{
+			// make heap copy
+			xpath_node* storage = static_cast<xpath_node*>(impl::xml_memory::allocate(size_ * sizeof(xpath_node)));
+
+			if (!storage)
+			{
+			#ifdef PUGIXML_NO_EXCEPTIONS
+				return;
+			#else
+				throw std::bad_alloc();
+			#endif
+			}
+
+			memcpy(storage, begin_, size_ * sizeof(xpath_node));
+			
+			// deallocate old buffer
+			if (_begin != &_storage) impl::xml_memory::deallocate(_begin);
+
+			// finalize
+			_begin = storage;
+			_end = storage + size_;
+		}
+	}
+
+	PUGI__FN xpath_node_set::xpath_node_set(): _type(type_unsorted), _begin(&_storage), _end(&_storage)
+	{
+	}
+
+	PUGI__FN xpath_node_set::xpath_node_set(const_iterator begin_, const_iterator end_, type_t type_): _type(type_), _begin(&_storage), _end(&_storage)
+	{
+		_assign(begin_, end_);
+	}
+
+	PUGI__FN xpath_node_set::~xpath_node_set()
+	{
+		if (_begin != &_storage) impl::xml_memory::deallocate(_begin);
+	}
+		
+	PUGI__FN xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(ns._type), _begin(&_storage), _end(&_storage)
+	{
+		_assign(ns._begin, ns._end);
+	}
+	
+	PUGI__FN xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns)
+	{
+		if (this == &ns) return *this;
+		
+		_type = ns._type;
+		_assign(ns._begin, ns._end);
+
+		return *this;
+	}
+
+	PUGI__FN xpath_node_set::type_t xpath_node_set::type() const
+	{
+		return _type;
+	}
+		
+	PUGI__FN size_t xpath_node_set::size() const
+	{
+		return _end - _begin;
+	}
+		
+	PUGI__FN bool xpath_node_set::empty() const
+	{
+		return _begin == _end;
+	}
+		
+	PUGI__FN const xpath_node& xpath_node_set::operator[](size_t index) const
+	{
+		assert(index < size());
+		return _begin[index];
+	}
+
+	PUGI__FN xpath_node_set::const_iterator xpath_node_set::begin() const
+	{
+		return _begin;
+	}
+		
+	PUGI__FN xpath_node_set::const_iterator xpath_node_set::end() const
+	{
+		return _end;
+	}
+	
+	PUGI__FN void xpath_node_set::sort(bool reverse)
+	{
+		_type = impl::xpath_sort(_begin, _end, _type, reverse);
+	}
+
+	PUGI__FN xpath_node xpath_node_set::first() const
+	{
+		return impl::xpath_first(_begin, _end, _type);
+	}
+
+	PUGI__FN xpath_parse_result::xpath_parse_result(): error("Internal error"), offset(0)
+	{
+	}
+
+	PUGI__FN xpath_parse_result::operator bool() const
+	{
+		return error == 0;
+	}
+
+	PUGI__FN const char* xpath_parse_result::description() const
+	{
+		return error ? error : "No error";
+	}
+
+	PUGI__FN xpath_variable::xpath_variable(): _type(xpath_type_none), _next(0)
+	{
+	}
+
+	PUGI__FN const char_t* xpath_variable::name() const
+	{
+		switch (_type)
+		{
+		case xpath_type_node_set:
+			return static_cast<const impl::xpath_variable_node_set*>(this)->name;
+
+		case xpath_type_number:
+			return static_cast<const impl::xpath_variable_number*>(this)->name;
+
+		case xpath_type_string:
+			return static_cast<const impl::xpath_variable_string*>(this)->name;
+
+		case xpath_type_boolean:
+			return static_cast<const impl::xpath_variable_boolean*>(this)->name;
+
+		default:
+			assert(!"Invalid variable type");
+			return 0;
+		}
+	}
+
+	PUGI__FN xpath_value_type xpath_variable::type() const
+	{
+		return _type;
+	}
+
+	PUGI__FN bool xpath_variable::get_boolean() const
+	{
+		return (_type == xpath_type_boolean) ? static_cast<const impl::xpath_variable_boolean*>(this)->value : false;
+	}
+
+	PUGI__FN double xpath_variable::get_number() const
+	{
+		return (_type == xpath_type_number) ? static_cast<const impl::xpath_variable_number*>(this)->value : impl::gen_nan();
+	}
+
+	PUGI__FN const char_t* xpath_variable::get_string() const
+	{
+		const char_t* value = (_type == xpath_type_string) ? static_cast<const impl::xpath_variable_string*>(this)->value : 0;
+		return value ? value : PUGIXML_TEXT("");
+	}
+
+	PUGI__FN const xpath_node_set& xpath_variable::get_node_set() const
+	{
+		return (_type == xpath_type_node_set) ? static_cast<const impl::xpath_variable_node_set*>(this)->value : impl::dummy_node_set;
+	}
+
+	PUGI__FN bool xpath_variable::set(bool value)
+	{
+		if (_type != xpath_type_boolean) return false;
+
+		static_cast<impl::xpath_variable_boolean*>(this)->value = value;
+		return true;
+	}
+
+	PUGI__FN bool xpath_variable::set(double value)
+	{
+		if (_type != xpath_type_number) return false;
+
+		static_cast<impl::xpath_variable_number*>(this)->value = value;
+		return true;
+	}
+
+	PUGI__FN bool xpath_variable::set(const char_t* value)
+	{
+		if (_type != xpath_type_string) return false;
+
+		impl::xpath_variable_string* var = static_cast<impl::xpath_variable_string*>(this);
+
+		// duplicate string
+		size_t size = (impl::strlength(value) + 1) * sizeof(char_t);
+
+		char_t* copy = static_cast<char_t*>(impl::xml_memory::allocate(size));
+		if (!copy) return false;
+
+		memcpy(copy, value, size);
+
+		// replace old string
+		if (var->value) impl::xml_memory::deallocate(var->value);
+		var->value = copy;
+
+		return true;
+	}
+
+	PUGI__FN bool xpath_variable::set(const xpath_node_set& value)
+	{
+		if (_type != xpath_type_node_set) return false;
+
+		static_cast<impl::xpath_variable_node_set*>(this)->value = value;
+		return true;
+	}
+
+	PUGI__FN xpath_variable_set::xpath_variable_set()
+	{
+		for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i) _data[i] = 0;
+	}
+
+	PUGI__FN xpath_variable_set::~xpath_variable_set()
+	{
+		for (size_t i = 0; i < sizeof(_data) / sizeof(_data[0]); ++i)
+		{
+			xpath_variable* var = _data[i];
+
+			while (var)
+			{
+				xpath_variable* next = var->_next;
+
+				impl::delete_xpath_variable(var->_type, var);
+
+				var = next;
+			}
+		}
+	}
+
+	PUGI__FN xpath_variable* xpath_variable_set::find(const char_t* name) const
+	{
+		const size_t hash_size = sizeof(_data) / sizeof(_data[0]);
+		size_t hash = impl::hash_string(name) % hash_size;
+
+		// look for existing variable
+		for (xpath_variable* var = _data[hash]; var; var = var->_next)
+			if (impl::strequal(var->name(), name))
+				return var;
+
+		return 0;
+	}
+
+	PUGI__FN xpath_variable* xpath_variable_set::add(const char_t* name, xpath_value_type type)
+	{
+		const size_t hash_size = sizeof(_data) / sizeof(_data[0]);
+		size_t hash = impl::hash_string(name) % hash_size;
+
+		// look for existing variable
+		for (xpath_variable* var = _data[hash]; var; var = var->_next)
+			if (impl::strequal(var->name(), name))
+				return var->type() == type ? var : 0;
+
+		// add new variable
+		xpath_variable* result = impl::new_xpath_variable(type, name);
+
+		if (result)
+		{
+			result->_type = type;
+			result->_next = _data[hash];
+
+			_data[hash] = result;
+		}
+
+		return result;
+	}
+
+	PUGI__FN bool xpath_variable_set::set(const char_t* name, bool value)
+	{
+		xpath_variable* var = add(name, xpath_type_boolean);
+		return var ? var->set(value) : false;
+	}
+
+	PUGI__FN bool xpath_variable_set::set(const char_t* name, double value)
+	{
+		xpath_variable* var = add(name, xpath_type_number);
+		return var ? var->set(value) : false;
+	}
+
+	PUGI__FN bool xpath_variable_set::set(const char_t* name, const char_t* value)
+	{
+		xpath_variable* var = add(name, xpath_type_string);
+		return var ? var->set(value) : false;
+	}
+
+	PUGI__FN bool xpath_variable_set::set(const char_t* name, const xpath_node_set& value)
+	{
+		xpath_variable* var = add(name, xpath_type_node_set);
+		return var ? var->set(value) : false;
+	}
+
+	PUGI__FN xpath_variable* xpath_variable_set::get(const char_t* name)
+	{
+		return find(name);
+	}
+
+	PUGI__FN const xpath_variable* xpath_variable_set::get(const char_t* name) const
+	{
+		return find(name);
+	}
+
+	PUGI__FN xpath_query::xpath_query(const char_t* query, xpath_variable_set* variables): _impl(0)
+	{
+		impl::xpath_query_impl* qimpl = impl::xpath_query_impl::create();
+
+		if (!qimpl)
+		{
+		#ifdef PUGIXML_NO_EXCEPTIONS
+			_result.error = "Out of memory";
+		#else
+			throw std::bad_alloc();
+		#endif
+		}
+		else
+		{
+			impl::buffer_holder impl_holder(qimpl, impl::xpath_query_impl::destroy);
+
+			qimpl->root = impl::xpath_parser::parse(query, variables, &qimpl->alloc, &_result);
+
+			if (qimpl->root)
+			{
+				qimpl->root->optimize(&qimpl->alloc);
+
+				_impl = static_cast<impl::xpath_query_impl*>(impl_holder.release());
+				_result.error = 0;
+			}
+		}
+	}
+
+	PUGI__FN xpath_query::~xpath_query()
+	{
+		impl::xpath_query_impl::destroy(_impl);
+	}
+
+	PUGI__FN xpath_value_type xpath_query::return_type() const
+	{
+		if (!_impl) return xpath_type_none;
+
+		return static_cast<impl::xpath_query_impl*>(_impl)->root->rettype();
+	}
+
+	PUGI__FN bool xpath_query::evaluate_boolean(const xpath_node& n) const
+	{
+		if (!_impl) return false;
+		
+		impl::xpath_context c(n, 1, 1);
+		impl::xpath_stack_data sd;
+
+	#ifdef PUGIXML_NO_EXCEPTIONS
+		if (setjmp(sd.error_handler)) return false;
+	#endif
+		
+		return static_cast<impl::xpath_query_impl*>(_impl)->root->eval_boolean(c, sd.stack);
+	}
+	
+	PUGI__FN double xpath_query::evaluate_number(const xpath_node& n) const
+	{
+		if (!_impl) return impl::gen_nan();
+		
+		impl::xpath_context c(n, 1, 1);
+		impl::xpath_stack_data sd;
+
+	#ifdef PUGIXML_NO_EXCEPTIONS
+		if (setjmp(sd.error_handler)) return impl::gen_nan();
+	#endif
+
+		return static_cast<impl::xpath_query_impl*>(_impl)->root->eval_number(c, sd.stack);
+	}
+
+#ifndef PUGIXML_NO_STL
+	PUGI__FN string_t xpath_query::evaluate_string(const xpath_node& n) const
+	{
+		impl::xpath_stack_data sd;
+
+		impl::xpath_string r = impl::evaluate_string_impl(static_cast<impl::xpath_query_impl*>(_impl), n, sd);
+
+		return string_t(r.c_str(), r.length());
+	}
+#endif
+
+	PUGI__FN size_t xpath_query::evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const
+	{
+		impl::xpath_stack_data sd;
+
+		impl::xpath_string r = impl::evaluate_string_impl(static_cast<impl::xpath_query_impl*>(_impl), n, sd);
+
+		size_t full_size = r.length() + 1;
+		
+		if (capacity > 0)
+		{
+			size_t size = (full_size < capacity) ? full_size : capacity;
+			assert(size > 0);
+
+			memcpy(buffer, r.c_str(), (size - 1) * sizeof(char_t));
+			buffer[size - 1] = 0;
+		}
+		
+		return full_size;
+	}
+
+	PUGI__FN xpath_node_set xpath_query::evaluate_node_set(const xpath_node& n) const
+	{
+		impl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast<impl::xpath_query_impl*>(_impl));
+		if (!root) return xpath_node_set();
+
+		impl::xpath_context c(n, 1, 1);
+		impl::xpath_stack_data sd;
+
+	#ifdef PUGIXML_NO_EXCEPTIONS
+		if (setjmp(sd.error_handler)) return xpath_node_set();
+	#endif
+
+		impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_all);
+
+		return xpath_node_set(r.begin(), r.end(), r.type());
+	}
+
+	PUGI__FN xpath_node xpath_query::evaluate_node(const xpath_node& n) const
+	{
+		impl::xpath_ast_node* root = impl::evaluate_node_set_prepare(static_cast<impl::xpath_query_impl*>(_impl));
+		if (!root) return xpath_node();
+
+		impl::xpath_context c(n, 1, 1);
+		impl::xpath_stack_data sd;
+
+	#ifdef PUGIXML_NO_EXCEPTIONS
+		if (setjmp(sd.error_handler)) return xpath_node();
+	#endif
+
+		impl::xpath_node_set_raw r = root->eval_node_set(c, sd.stack, impl::nodeset_eval_first);
+
+		return r.first();
+	}
+
+	PUGI__FN const xpath_parse_result& xpath_query::result() const
+	{
+		return _result;
+	}
+
+	PUGI__FN static void unspecified_bool_xpath_query(xpath_query***)
+	{
+	}
+
+	PUGI__FN xpath_query::operator xpath_query::unspecified_bool_type() const
+	{
+		return _impl ? unspecified_bool_xpath_query : 0;
+	}
+
+	PUGI__FN bool xpath_query::operator!() const
+	{
+		return !_impl;
+	}
+
+	PUGI__FN xpath_node xml_node::select_node(const char_t* query, xpath_variable_set* variables) const
+	{
+		xpath_query q(query, variables);
+		return select_node(q);
+	}
+
+	PUGI__FN xpath_node xml_node::select_node(const xpath_query& query) const
+	{
+		return query.evaluate_node(*this);
+	}
+
+	PUGI__FN xpath_node_set xml_node::select_nodes(const char_t* query, xpath_variable_set* variables) const
+	{
+		xpath_query q(query, variables);
+		return select_nodes(q);
+	}
+
+	PUGI__FN xpath_node_set xml_node::select_nodes(const xpath_query& query) const
+	{
+		return query.evaluate_node_set(*this);
+	}
+
+	PUGI__FN xpath_node xml_node::select_single_node(const char_t* query, xpath_variable_set* variables) const
+	{
+		xpath_query q(query, variables);
+		return select_single_node(q);
+	}
+
+	PUGI__FN xpath_node xml_node::select_single_node(const xpath_query& query) const
+	{
+		return query.evaluate_node(*this);
+	}
+}
+
+#endif
+
+#ifdef __BORLANDC__
+#	pragma option pop
+#endif
+
+// Intel C++ does not properly keep warning state for function templates,
+// so popping warning state at the end of translation unit leads to warnings in the middle.
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+#	pragma warning(pop)
+#endif
+
+// Undefine all local macros (makes sure we're not leaking macros in header-only mode)
+#undef PUGI__NO_INLINE
+#undef PUGI__UNLIKELY
+#undef PUGI__STATIC_ASSERT
+#undef PUGI__DMC_VOLATILE
+#undef PUGI__MSVC_CRT_VERSION
+#undef PUGI__NS_BEGIN
+#undef PUGI__NS_END
+#undef PUGI__FN
+#undef PUGI__FN_NO_INLINE
+#undef PUGI__NODETYPE
+#undef PUGI__IS_CHARTYPE_IMPL
+#undef PUGI__IS_CHARTYPE
+#undef PUGI__IS_CHARTYPEX
+#undef PUGI__ENDSWITH
+#undef PUGI__SKIPWS
+#undef PUGI__OPTSET
+#undef PUGI__PUSHNODE
+#undef PUGI__POPNODE
+#undef PUGI__SCANFOR
+#undef PUGI__SCANWHILE
+#undef PUGI__SCANWHILE_UNROLL
+#undef PUGI__ENDSEG
+#undef PUGI__THROW_ERROR
+#undef PUGI__CHECK_ERROR
+
+#endif
+
+/**
+ * Copyright (c) 2006-2014 Arseny Kapoulkine
+ *
+ * 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.
+ */
diff --git a/src/pugixml/pugixml.hpp b/src/pugixml/pugixml.hpp
new file mode 100644
index 0000000..9798b46
--- /dev/null
+++ b/src/pugixml/pugixml.hpp
@@ -0,0 +1,1366 @@
+/**
+ * pugixml parser - version 1.5
+ * --------------------------------------------------------
+ * Copyright (C) 2006-2014, by Arseny Kapoulkine (arseny.kapoulkine at gmail.com)
+ * Report bugs and download new versions at http://pugixml.org/
+ *
+ * This library is distributed under the MIT License. See notice at the end
+ * of this file.
+ *
+ * This work is based on the pugxml parser, which is:
+ * Copyright (C) 2003, by Kristen Wegner (kristen at tima.net)
+ */
+
+#ifndef PUGIXML_VERSION
+// Define version macro; evaluates to major * 100 + minor so that it's safe to use in less-than comparisons
+#	define PUGIXML_VERSION 150
+#endif
+
+// Include user configuration file (this can define various configuration macros)
+#include "pugiconfig.hpp"
+
+#ifndef HEADER_PUGIXML_HPP
+#define HEADER_PUGIXML_HPP
+
+// Include stddef.h for size_t and ptrdiff_t
+#include <stddef.h>
+
+// Include exception header for XPath
+#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
+#	include <exception>
+#endif
+
+// Include STL headers
+#ifndef PUGIXML_NO_STL
+#	include <iterator>
+#	include <iosfwd>
+#	include <string>
+#endif
+
+// Macro for deprecated features
+#ifndef PUGIXML_DEPRECATED
+#	if defined(__GNUC__)
+#		define PUGIXML_DEPRECATED __attribute__((deprecated))
+#	elif defined(_MSC_VER) && _MSC_VER >= 1300
+#		define PUGIXML_DEPRECATED __declspec(deprecated)
+#	else
+#		define PUGIXML_DEPRECATED
+#	endif
+#endif
+
+// If no API is defined, assume default
+#ifndef PUGIXML_API
+#	define PUGIXML_API
+#endif
+
+// If no API for classes is defined, assume default
+#ifndef PUGIXML_CLASS
+#	define PUGIXML_CLASS PUGIXML_API
+#endif
+
+// If no API for functions is defined, assume default
+#ifndef PUGIXML_FUNCTION
+#	define PUGIXML_FUNCTION PUGIXML_API
+#endif
+
+// If the platform is known to have long long support, enable long long functions
+#ifndef PUGIXML_HAS_LONG_LONG
+#	if defined(__cplusplus) && __cplusplus >= 201103
+#		define PUGIXML_HAS_LONG_LONG
+#	elif defined(_MSC_VER) && _MSC_VER >= 1400
+#		define PUGIXML_HAS_LONG_LONG
+#	endif
+#endif
+
+// Character interface macros
+#ifdef PUGIXML_WCHAR_MODE
+#	define PUGIXML_TEXT(t) L ## t
+#	define PUGIXML_CHAR wchar_t
+#else
+#	define PUGIXML_TEXT(t) t
+#	define PUGIXML_CHAR char
+#endif
+
+namespace pugi
+{
+	// Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE
+	typedef PUGIXML_CHAR char_t;
+
+#ifndef PUGIXML_NO_STL
+	// String type used for operations that work with STL string; depends on PUGIXML_WCHAR_MODE
+	typedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>, std::allocator<PUGIXML_CHAR> > string_t;
+#endif
+}
+
+// The PugiXML namespace
+namespace pugi
+{
+	// Tree node types
+	enum xml_node_type
+	{
+		node_null,			// Empty (null) node handle
+		node_document,		// A document tree's absolute root
+		node_element,		// Element tag, i.e. '<node/>'
+		node_pcdata,		// Plain character data, i.e. 'text'
+		node_cdata,			// Character data, i.e. '<![CDATA[text]]>'
+		node_comment,		// Comment tag, i.e. '<!-- text -->'
+		node_pi,			// Processing instruction, i.e. '<?name?>'
+		node_declaration,	// Document declaration, i.e. '<?xml version="1.0"?>'
+		node_doctype		// Document type declaration, i.e. '<!DOCTYPE doc>'
+	};
+
+	// Parsing options
+
+	// Minimal parsing mode (equivalent to turning all other flags off).
+	// Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed.
+	const unsigned int parse_minimal = 0x0000;
+
+	// This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default.
+	const unsigned int parse_pi = 0x0001;
+
+	// This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default.
+	const unsigned int parse_comments = 0x0002;
+
+	// This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default.
+	const unsigned int parse_cdata = 0x0004;
+
+	// This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree.
+	// This flag is off by default; turning it on usually results in slower parsing and more memory consumption.
+	const unsigned int parse_ws_pcdata = 0x0008;
+
+	// This flag determines if character and entity references are expanded during parsing. This flag is on by default.
+	const unsigned int parse_escapes = 0x0010;
+
+	// This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default.
+	const unsigned int parse_eol = 0x0020;
+	
+	// This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default.
+	const unsigned int parse_wconv_attribute = 0x0040;
+
+	// This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default.
+	const unsigned int parse_wnorm_attribute = 0x0080;
+	
+	// This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default.
+	const unsigned int parse_declaration = 0x0100;
+
+	// This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default.
+	const unsigned int parse_doctype = 0x0200;
+
+	// This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only
+	// of whitespace is added to the DOM tree.
+	// This flag is off by default; turning it on may result in slower parsing and more memory consumption.
+	const unsigned int parse_ws_pcdata_single = 0x0400;
+
+	// This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default.
+	const unsigned int parse_trim_pcdata = 0x0800;
+
+	// This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document
+	// is a valid document. This flag is off by default.
+	const unsigned int parse_fragment = 0x1000;
+
+	// The default parsing mode.
+	// Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded,
+	// End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
+	const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
+
+	// The full parsing mode.
+	// Nodes of all types are added to the DOM tree, character/reference entities are expanded,
+	// End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules.
+	const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype;
+
+	// These flags determine the encoding of input data for XML document
+	enum xml_encoding
+	{
+		encoding_auto,		// Auto-detect input encoding using BOM or < / <? detection; use UTF8 if BOM is not found
+		encoding_utf8,		// UTF8 encoding
+		encoding_utf16_le,	// Little-endian UTF16
+		encoding_utf16_be,	// Big-endian UTF16
+		encoding_utf16,		// UTF16 with native endianness
+		encoding_utf32_le,	// Little-endian UTF32
+		encoding_utf32_be,	// Big-endian UTF32
+		encoding_utf32,		// UTF32 with native endianness
+		encoding_wchar,		// The same encoding wchar_t has (either UTF16 or UTF32)
+		encoding_latin1
+	};
+
+	// Formatting flags
+	
+	// Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree. This flag is on by default.
+	const unsigned int format_indent = 0x01;
+	
+	// Write encoding-specific BOM to the output stream. This flag is off by default.
+	const unsigned int format_write_bom = 0x02;
+
+	// Use raw output mode (no indentation and no line breaks are written). This flag is off by default.
+	const unsigned int format_raw = 0x04;
+	
+	// Omit default XML declaration even if there is no declaration in the document. This flag is off by default.
+	const unsigned int format_no_declaration = 0x08;
+
+	// Don't escape attribute values and PCDATA contents. This flag is off by default.
+	const unsigned int format_no_escapes = 0x10;
+
+	// Open file using text mode in xml_document::save_file. This enables special character (i.e. new-line) conversions on some systems. This flag is off by default.
+	const unsigned int format_save_file_text = 0x20;
+
+	// The default set of formatting flags.
+	// Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none.
+	const unsigned int format_default = format_indent;
+		
+	// Forward declarations
+	struct xml_attribute_struct;
+	struct xml_node_struct;
+
+	class xml_node_iterator;
+	class xml_attribute_iterator;
+	class xml_named_node_iterator;
+
+	class xml_tree_walker;
+
+	struct xml_parse_result;
+
+	class xml_node;
+
+	class xml_text;
+	
+	#ifndef PUGIXML_NO_XPATH
+	class xpath_node;
+	class xpath_node_set;
+	class xpath_query;
+	class xpath_variable_set;
+	#endif
+
+	// Range-based for loop support
+	template <typename It> class xml_object_range
+	{
+	public:
+		typedef It const_iterator;
+		typedef It iterator;
+
+		xml_object_range(It b, It e): _begin(b), _end(e)
+		{
+		}
+
+		It begin() const { return _begin; }
+		It end() const { return _end; }
+
+	private:
+		It _begin, _end;
+	};
+
+	// Writer interface for node printing (see xml_node::print)
+	class PUGIXML_CLASS xml_writer
+	{
+	public:
+		virtual ~xml_writer() {}
+
+		// Write memory chunk into stream/file/whatever
+		virtual void write(const void* data, size_t size) = 0;
+	};
+
+	// xml_writer implementation for FILE*
+	class PUGIXML_CLASS xml_writer_file: public xml_writer
+	{
+	public:
+		// Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio
+		xml_writer_file(void* file);
+
+		virtual void write(const void* data, size_t size);
+
+	private:
+		void* file;
+	};
+
+	#ifndef PUGIXML_NO_STL
+	// xml_writer implementation for streams
+	class PUGIXML_CLASS xml_writer_stream: public xml_writer
+	{
+	public:
+		// Construct writer from an output stream object
+		xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream);
+		xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream);
+
+		virtual void write(const void* data, size_t size);
+
+	private:
+		std::basic_ostream<char, std::char_traits<char> >* narrow_stream;
+		std::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream;
+	};
+	#endif
+
+	// A light-weight handle for manipulating attributes in DOM tree
+	class PUGIXML_CLASS xml_attribute
+	{
+		friend class xml_attribute_iterator;
+		friend class xml_node;
+
+	private:
+		xml_attribute_struct* _attr;
+	
+		typedef void (*unspecified_bool_type)(xml_attribute***);
+
+	public:
+		// Default constructor. Constructs an empty attribute.
+		xml_attribute();
+		
+		// Constructs attribute from internal pointer
+		explicit xml_attribute(xml_attribute_struct* attr);
+
+		// Safe bool conversion operator
+		operator unspecified_bool_type() const;
+
+		// Borland C++ workaround
+		bool operator!() const;
+
+		// Comparison operators (compares wrapped attribute pointers)
+		bool operator==(const xml_attribute& r) const;
+		bool operator!=(const xml_attribute& r) const;
+		bool operator<(const xml_attribute& r) const;
+		bool operator>(const xml_attribute& r) const;
+		bool operator<=(const xml_attribute& r) const;
+		bool operator>=(const xml_attribute& r) const;
+
+		// Check if attribute is empty
+		bool empty() const;
+
+		// Get attribute name/value, or "" if attribute is empty
+		const char_t* name() const;
+		const char_t* value() const;
+
+		// Get attribute value, or the default value if attribute is empty
+		const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
+
+		// Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty
+		int as_int(int def = 0) const;
+		unsigned int as_uint(unsigned int def = 0) const;
+		double as_double(double def = 0) const;
+		float as_float(float def = 0) const;
+
+	#ifdef PUGIXML_HAS_LONG_LONG
+		long long as_llong(long long def = 0) const;
+		unsigned long long as_ullong(unsigned long long def = 0) const;
+	#endif
+
+		// Get attribute value as bool (returns true if first character is in '1tTyY' set), or the default value if attribute is empty
+		bool as_bool(bool def = false) const;
+
+		// Set attribute name/value (returns false if attribute is empty or there is not enough memory)
+		bool set_name(const char_t* rhs);
+		bool set_value(const char_t* rhs);
+
+		// Set attribute value with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
+		bool set_value(int rhs);
+		bool set_value(unsigned int rhs);
+		bool set_value(double rhs);
+		bool set_value(float rhs);
+		bool set_value(bool rhs);
+
+	#ifdef PUGIXML_HAS_LONG_LONG
+		bool set_value(long long rhs);
+		bool set_value(unsigned long long rhs);
+	#endif
+
+		// Set attribute value (equivalent to set_value without error checking)
+		xml_attribute& operator=(const char_t* rhs);
+		xml_attribute& operator=(int rhs);
+		xml_attribute& operator=(unsigned int rhs);
+		xml_attribute& operator=(double rhs);
+		xml_attribute& operator=(float rhs);
+		xml_attribute& operator=(bool rhs);
+
+	#ifdef PUGIXML_HAS_LONG_LONG
+		xml_attribute& operator=(long long rhs);
+		xml_attribute& operator=(unsigned long long rhs);
+	#endif
+
+		// Get next/previous attribute in the attribute list of the parent node
+		xml_attribute next_attribute() const;
+		xml_attribute previous_attribute() const;
+
+		// Get hash value (unique for handles to the same object)
+		size_t hash_value() const;
+
+		// Get internal pointer
+		xml_attribute_struct* internal_object() const;
+	};
+
+#ifdef __BORLANDC__
+	// Borland C++ workaround
+	bool PUGIXML_FUNCTION operator&&(const xml_attribute& lhs, bool rhs);
+	bool PUGIXML_FUNCTION operator||(const xml_attribute& lhs, bool rhs);
+#endif
+
+	// A light-weight handle for manipulating nodes in DOM tree
+	class PUGIXML_CLASS xml_node
+	{
+		friend class xml_attribute_iterator;
+		friend class xml_node_iterator;
+		friend class xml_named_node_iterator;
+
+	protected:
+		xml_node_struct* _root;
+
+		typedef void (*unspecified_bool_type)(xml_node***);
+
+	public:
+		// Default constructor. Constructs an empty node.
+		xml_node();
+
+		// Constructs node from internal pointer
+		explicit xml_node(xml_node_struct* p);
+
+		// Safe bool conversion operator
+		operator unspecified_bool_type() const;
+
+		// Borland C++ workaround
+		bool operator!() const;
+	
+		// Comparison operators (compares wrapped node pointers)
+		bool operator==(const xml_node& r) const;
+		bool operator!=(const xml_node& r) const;
+		bool operator<(const xml_node& r) const;
+		bool operator>(const xml_node& r) const;
+		bool operator<=(const xml_node& r) const;
+		bool operator>=(const xml_node& r) const;
+
+		// Check if node is empty.
+		bool empty() const;
+
+		// Get node type
+		xml_node_type type() const;
+
+		// Get node name, or "" if node is empty or it has no name
+		const char_t* name() const;
+
+		// Get node value, or "" if node is empty or it has no value
+		// Note: For <node>text</node> node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes.
+		const char_t* value() const;
+	
+		// Get attribute list
+		xml_attribute first_attribute() const;
+		xml_attribute last_attribute() const;
+
+		// Get children list
+		xml_node first_child() const;
+		xml_node last_child() const;
+
+		// Get next/previous sibling in the children list of the parent node
+		xml_node next_sibling() const;
+		xml_node previous_sibling() const;
+		
+		// Get parent node
+		xml_node parent() const;
+
+		// Get root of DOM tree this node belongs to
+		xml_node root() const;
+
+		// Get text object for the current node
+		xml_text text() const;
+
+		// Get child, attribute or next/previous sibling with the specified name
+		xml_node child(const char_t* name) const;
+		xml_attribute attribute(const char_t* name) const;
+		xml_node next_sibling(const char_t* name) const;
+		xml_node previous_sibling(const char_t* name) const;
+
+		// Get child value of current node; that is, value of the first child node of type PCDATA/CDATA
+		const char_t* child_value() const;
+
+		// Get child value of child with specified name. Equivalent to child(name).child_value().
+		const char_t* child_value(const char_t* name) const;
+
+		// Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value)
+		bool set_name(const char_t* rhs);
+		bool set_value(const char_t* rhs);
+		
+		// Add attribute with specified name. Returns added attribute, or empty attribute on errors.
+		xml_attribute append_attribute(const char_t* name);
+		xml_attribute prepend_attribute(const char_t* name);
+		xml_attribute insert_attribute_after(const char_t* name, const xml_attribute& attr);
+		xml_attribute insert_attribute_before(const char_t* name, const xml_attribute& attr);
+
+		// Add a copy of the specified attribute. Returns added attribute, or empty attribute on errors.
+		xml_attribute append_copy(const xml_attribute& proto);
+		xml_attribute prepend_copy(const xml_attribute& proto);
+		xml_attribute insert_copy_after(const xml_attribute& proto, const xml_attribute& attr);
+		xml_attribute insert_copy_before(const xml_attribute& proto, const xml_attribute& attr);
+
+		// Add child node with specified type. Returns added node, or empty node on errors.
+		xml_node append_child(xml_node_type type = node_element);
+		xml_node prepend_child(xml_node_type type = node_element);
+		xml_node insert_child_after(xml_node_type type, const xml_node& node);
+		xml_node insert_child_before(xml_node_type type, const xml_node& node);
+
+		// Add child element with specified name. Returns added node, or empty node on errors.
+		xml_node append_child(const char_t* name);
+		xml_node prepend_child(const char_t* name);
+		xml_node insert_child_after(const char_t* name, const xml_node& node);
+		xml_node insert_child_before(const char_t* name, const xml_node& node);
+
+		// Add a copy of the specified node as a child. Returns added node, or empty node on errors.
+		xml_node append_copy(const xml_node& proto);
+		xml_node prepend_copy(const xml_node& proto);
+		xml_node insert_copy_after(const xml_node& proto, const xml_node& node);
+		xml_node insert_copy_before(const xml_node& proto, const xml_node& node);
+
+		// Move the specified node to become a child of this node. Returns moved node, or empty node on errors.
+		xml_node append_move(const xml_node& moved);
+		xml_node prepend_move(const xml_node& moved);
+		xml_node insert_move_after(const xml_node& moved, const xml_node& node);
+		xml_node insert_move_before(const xml_node& moved, const xml_node& node);
+
+		// Remove specified attribute
+		bool remove_attribute(const xml_attribute& a);
+		bool remove_attribute(const char_t* name);
+
+		// Remove specified child
+		bool remove_child(const xml_node& n);
+		bool remove_child(const char_t* name);
+
+		// Parses buffer as an XML document fragment and appends all nodes as children of the current node.
+		// Copies/converts the buffer, so it may be deleted or changed after the function returns.
+		// Note: append_buffer allocates memory that has the lifetime of the owning document; removing the appended nodes does not immediately reclaim that memory.
+		xml_parse_result append_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+		// Find attribute using predicate. Returns first attribute for which predicate returned true.
+		template <typename Predicate> xml_attribute find_attribute(Predicate pred) const
+		{
+			if (!_root) return xml_attribute();
+			
+			for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())
+				if (pred(attrib))
+					return attrib;
+		
+			return xml_attribute();
+		}
+
+		// Find child node using predicate. Returns first child for which predicate returned true.
+		template <typename Predicate> xml_node find_child(Predicate pred) const
+		{
+			if (!_root) return xml_node();
+	
+			for (xml_node node = first_child(); node; node = node.next_sibling())
+				if (pred(node))
+					return node;
+		
+			return xml_node();
+		}
+
+		// Find node from subtree using predicate. Returns first node from subtree (depth-first), for which predicate returned true.
+		template <typename Predicate> xml_node find_node(Predicate pred) const
+		{
+			if (!_root) return xml_node();
+
+			xml_node cur = first_child();
+			
+			while (cur._root && cur._root != _root)
+			{
+				if (pred(cur)) return cur;
+
+				if (cur.first_child()) cur = cur.first_child();
+				else if (cur.next_sibling()) cur = cur.next_sibling();
+				else
+				{
+					while (!cur.next_sibling() && cur._root != _root) cur = cur.parent();
+
+					if (cur._root != _root) cur = cur.next_sibling();
+				}
+			}
+
+			return xml_node();
+		}
+
+		// Find child node by attribute name/value
+		xml_node find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const;
+		xml_node find_child_by_attribute(const char_t* attr_name, const char_t* attr_value) const;
+
+	#ifndef PUGIXML_NO_STL
+		// Get the absolute node path from root as a text string.
+		string_t path(char_t delimiter = '/') const;
+	#endif
+
+		// Search for a node by path consisting of node names and . or .. elements.
+		xml_node first_element_by_path(const char_t* path, char_t delimiter = '/') const;
+
+		// Recursively traverse subtree with xml_tree_walker
+		bool traverse(xml_tree_walker& walker);
+	
+	#ifndef PUGIXML_NO_XPATH
+		// Select single node by evaluating XPath query. Returns first node from the resulting node set.
+		xpath_node select_node(const char_t* query, xpath_variable_set* variables = 0) const;
+		xpath_node select_node(const xpath_query& query) const;
+
+		// Select node set by evaluating XPath query
+		xpath_node_set select_nodes(const char_t* query, xpath_variable_set* variables = 0) const;
+		xpath_node_set select_nodes(const xpath_query& query) const;
+
+		// (deprecated: use select_node instead) Select single node by evaluating XPath query.
+		xpath_node select_single_node(const char_t* query, xpath_variable_set* variables = 0) const;
+		xpath_node select_single_node(const xpath_query& query) const;
+
+	#endif
+		
+		// Print subtree using a writer object
+		void print(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
+
+	#ifndef PUGIXML_NO_STL
+		// Print subtree to stream
+		void print(std::basic_ostream<char, std::char_traits<char> >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
+		void print(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& os, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, unsigned int depth = 0) const;
+	#endif
+
+		// Child nodes iterators
+		typedef xml_node_iterator iterator;
+
+		iterator begin() const;
+		iterator end() const;
+
+		// Attribute iterators
+		typedef xml_attribute_iterator attribute_iterator;
+
+		attribute_iterator attributes_begin() const;
+		attribute_iterator attributes_end() const;
+
+		// Range-based for support
+		xml_object_range<xml_node_iterator> children() const;
+		xml_object_range<xml_named_node_iterator> children(const char_t* name) const;
+		xml_object_range<xml_attribute_iterator> attributes() const;
+
+		// Get node offset in parsed file/string (in char_t units) for debugging purposes
+		ptrdiff_t offset_debug() const;
+
+		// Get hash value (unique for handles to the same object)
+		size_t hash_value() const;
+
+		// Get internal pointer
+		xml_node_struct* internal_object() const;
+	};
+
+#ifdef __BORLANDC__
+	// Borland C++ workaround
+	bool PUGIXML_FUNCTION operator&&(const xml_node& lhs, bool rhs);
+	bool PUGIXML_FUNCTION operator||(const xml_node& lhs, bool rhs);
+#endif
+
+	// A helper for working with text inside PCDATA nodes
+	class PUGIXML_CLASS xml_text
+	{
+		friend class xml_node;
+
+		xml_node_struct* _root;
+
+		typedef void (*unspecified_bool_type)(xml_text***);
+
+		explicit xml_text(xml_node_struct* root);
+
+		xml_node_struct* _data_new();
+		xml_node_struct* _data() const;
+
+	public:
+		// Default constructor. Constructs an empty object.
+		xml_text();
+
+		// Safe bool conversion operator
+		operator unspecified_bool_type() const;
+
+		// Borland C++ workaround
+		bool operator!() const;
+
+		// Check if text object is empty
+		bool empty() const;
+
+		// Get text, or "" if object is empty
+		const char_t* get() const;
+
+		// Get text, or the default value if object is empty
+		const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
+
+		// Get text as a number, or the default value if conversion did not succeed or object is empty
+		int as_int(int def = 0) const;
+		unsigned int as_uint(unsigned int def = 0) const;
+		double as_double(double def = 0) const;
+		float as_float(float def = 0) const;
+
+	#ifdef PUGIXML_HAS_LONG_LONG
+		long long as_llong(long long def = 0) const;
+		unsigned long long as_ullong(unsigned long long def = 0) const;
+	#endif
+
+		// Get text as bool (returns true if first character is in '1tTyY' set), or the default value if object is empty
+		bool as_bool(bool def = false) const;
+
+		// Set text (returns false if object is empty or there is not enough memory)
+		bool set(const char_t* rhs);
+
+		// Set text with type conversion (numbers are converted to strings, boolean is converted to "true"/"false")
+		bool set(int rhs);
+		bool set(unsigned int rhs);
+		bool set(double rhs);
+		bool set(float rhs);
+		bool set(bool rhs);
+
+	#ifdef PUGIXML_HAS_LONG_LONG
+		bool set(long long rhs);
+		bool set(unsigned long long rhs);
+	#endif
+
+		// Set text (equivalent to set without error checking)
+		xml_text& operator=(const char_t* rhs);
+		xml_text& operator=(int rhs);
+		xml_text& operator=(unsigned int rhs);
+		xml_text& operator=(double rhs);
+		xml_text& operator=(float rhs);
+		xml_text& operator=(bool rhs);
+
+	#ifdef PUGIXML_HAS_LONG_LONG
+		xml_text& operator=(long long rhs);
+		xml_text& operator=(unsigned long long rhs);
+	#endif
+
+		// Get the data node (node_pcdata or node_cdata) for this object
+		xml_node data() const;
+	};
+
+#ifdef __BORLANDC__
+	// Borland C++ workaround
+	bool PUGIXML_FUNCTION operator&&(const xml_text& lhs, bool rhs);
+	bool PUGIXML_FUNCTION operator||(const xml_text& lhs, bool rhs);
+#endif
+
+	// Child node iterator (a bidirectional iterator over a collection of xml_node)
+	class PUGIXML_CLASS xml_node_iterator
+	{
+		friend class xml_node;
+
+	private:
+		mutable xml_node _wrap;
+		xml_node _parent;
+
+		xml_node_iterator(xml_node_struct* ref, xml_node_struct* parent);
+
+	public:
+		// Iterator traits
+		typedef ptrdiff_t difference_type;
+		typedef xml_node value_type;
+		typedef xml_node* pointer;
+		typedef xml_node& reference;
+
+	#ifndef PUGIXML_NO_STL
+		typedef std::bidirectional_iterator_tag iterator_category;
+	#endif
+
+		// Default constructor
+		xml_node_iterator();
+
+		// Construct an iterator which points to the specified node
+		xml_node_iterator(const xml_node& node);
+
+		// Iterator operators
+		bool operator==(const xml_node_iterator& rhs) const;
+		bool operator!=(const xml_node_iterator& rhs) const;
+
+		xml_node& operator*() const;
+		xml_node* operator->() const;
+
+		const xml_node_iterator& operator++();
+		xml_node_iterator operator++(int);
+
+		const xml_node_iterator& operator--();
+		xml_node_iterator operator--(int);
+	};
+
+	// Attribute iterator (a bidirectional iterator over a collection of xml_attribute)
+	class PUGIXML_CLASS xml_attribute_iterator
+	{
+		friend class xml_node;
+
+	private:
+		mutable xml_attribute _wrap;
+		xml_node _parent;
+
+		xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent);
+
+	public:
+		// Iterator traits
+		typedef ptrdiff_t difference_type;
+		typedef xml_attribute value_type;
+		typedef xml_attribute* pointer;
+		typedef xml_attribute& reference;
+
+	#ifndef PUGIXML_NO_STL
+		typedef std::bidirectional_iterator_tag iterator_category;
+	#endif
+
+		// Default constructor
+		xml_attribute_iterator();
+
+		// Construct an iterator which points to the specified attribute
+		xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent);
+
+		// Iterator operators
+		bool operator==(const xml_attribute_iterator& rhs) const;
+		bool operator!=(const xml_attribute_iterator& rhs) const;
+
+		xml_attribute& operator*() const;
+		xml_attribute* operator->() const;
+
+		const xml_attribute_iterator& operator++();
+		xml_attribute_iterator operator++(int);
+
+		const xml_attribute_iterator& operator--();
+		xml_attribute_iterator operator--(int);
+	};
+
+	// Named node range helper
+	class PUGIXML_CLASS xml_named_node_iterator
+	{
+		friend class xml_node;
+
+	public:
+		// Iterator traits
+		typedef ptrdiff_t difference_type;
+		typedef xml_node value_type;
+		typedef xml_node* pointer;
+		typedef xml_node& reference;
+
+	#ifndef PUGIXML_NO_STL
+		typedef std::bidirectional_iterator_tag iterator_category;
+	#endif
+
+		// Default constructor
+		xml_named_node_iterator();
+
+		// Construct an iterator which points to the specified node
+		xml_named_node_iterator(const xml_node& node, const char_t* name);
+
+		// Iterator operators
+		bool operator==(const xml_named_node_iterator& rhs) const;
+		bool operator!=(const xml_named_node_iterator& rhs) const;
+
+		xml_node& operator*() const;
+		xml_node* operator->() const;
+
+		const xml_named_node_iterator& operator++();
+		xml_named_node_iterator operator++(int);
+
+		const xml_named_node_iterator& operator--();
+		xml_named_node_iterator operator--(int);
+
+	private:
+		mutable xml_node _wrap;
+		xml_node _parent;
+		const char_t* _name;
+
+		xml_named_node_iterator(xml_node_struct* ref, xml_node_struct* parent, const char_t* name);
+	};
+
+	// Abstract tree walker class (see xml_node::traverse)
+	class PUGIXML_CLASS xml_tree_walker
+	{
+		friend class xml_node;
+
+	private:
+		int _depth;
+	
+	protected:
+		// Get current traversal depth
+		int depth() const;
+	
+	public:
+		xml_tree_walker();
+		virtual ~xml_tree_walker();
+
+		// Callback that is called when traversal begins
+		virtual bool begin(xml_node& node);
+
+		// Callback that is called for each node traversed
+		virtual bool for_each(xml_node& node) = 0;
+
+		// Callback that is called when traversal ends
+		virtual bool end(xml_node& node);
+	};
+
+	// Parsing status, returned as part of xml_parse_result object
+	enum xml_parse_status
+	{
+		status_ok = 0,				// No error
+
+		status_file_not_found,		// File was not found during load_file()
+		status_io_error,			// Error reading from file/stream
+		status_out_of_memory,		// Could not allocate memory
+		status_internal_error,		// Internal error occurred
+
+		status_unrecognized_tag,	// Parser could not determine tag type
+
+		status_bad_pi,				// Parsing error occurred while parsing document declaration/processing instruction
+		status_bad_comment,			// Parsing error occurred while parsing comment
+		status_bad_cdata,			// Parsing error occurred while parsing CDATA section
+		status_bad_doctype,			// Parsing error occurred while parsing document type declaration
+		status_bad_pcdata,			// Parsing error occurred while parsing PCDATA section
+		status_bad_start_element,	// Parsing error occurred while parsing start element tag
+		status_bad_attribute,		// Parsing error occurred while parsing element attribute
+		status_bad_end_element,		// Parsing error occurred while parsing end element tag
+		status_end_element_mismatch,// There was a mismatch of start-end tags (closing tag had incorrect name, some tag was not closed or there was an excessive closing tag)
+
+		status_append_invalid_root,	// Unable to append nodes since root type is not node_element or node_document (exclusive to xml_node::append_buffer)
+
+		status_no_document_element	// Parsing resulted in a document without element nodes
+	};
+
+	// Parsing result
+	struct PUGIXML_CLASS xml_parse_result
+	{
+		// Parsing status (see xml_parse_status)
+		xml_parse_status status;
+
+		// Last parsed offset (in char_t units from start of input data)
+		ptrdiff_t offset;
+
+		// Source document encoding
+		xml_encoding encoding;
+
+		// Default constructor, initializes object to failed state
+		xml_parse_result();
+
+		// Cast to bool operator
+		operator bool() const;
+
+		// Get error description
+		const char* description() const;
+	};
+
+	// Document class (DOM tree root)
+	class PUGIXML_CLASS xml_document: public xml_node
+	{
+	private:
+		char_t* _buffer;
+
+		char _memory[192];
+		
+		// Non-copyable semantics
+		xml_document(const xml_document&);
+		const xml_document& operator=(const xml_document&);
+
+		void create();
+		void destroy();
+
+	public:
+		// Default constructor, makes empty document
+		xml_document();
+
+		// Destructor, invalidates all node/attribute handles to this document
+		~xml_document();
+
+		// Removes all nodes, leaving the empty document
+		void reset();
+
+		// Removes all nodes, then copies the entire contents of the specified document
+		void reset(const xml_document& proto);
+
+	#ifndef PUGIXML_NO_STL
+		// Load document from stream.
+		xml_parse_result load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+		xml_parse_result load(std::basic_istream<wchar_t, std::char_traits<wchar_t> >& stream, unsigned int options = parse_default);
+	#endif
+
+		// (deprecated: use load_string instead) Load document from zero-terminated string. No encoding conversions are applied.
+		xml_parse_result load(const char_t* contents, unsigned int options = parse_default);
+
+		// Load document from zero-terminated string. No encoding conversions are applied.
+		xml_parse_result load_string(const char_t* contents, unsigned int options = parse_default);
+
+		// Load document from file
+		xml_parse_result load_file(const char* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+		xml_parse_result load_file(const wchar_t* path, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+		// Load document from buffer. Copies/converts the buffer, so it may be deleted or changed after the function returns.
+		xml_parse_result load_buffer(const void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+		// Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
+		// You should ensure that buffer data will persist throughout the document's lifetime, and free the buffer memory manually once document is destroyed.
+		xml_parse_result load_buffer_inplace(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+		// Load document from buffer, using the buffer for in-place parsing (the buffer is modified and used for storage of document data).
+		// You should allocate the buffer with pugixml allocation function; document will free the buffer when it is no longer needed (you can't use it anymore).
+		xml_parse_result load_buffer_inplace_own(void* contents, size_t size, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
+
+		// Save XML document to writer (semantics is slightly different from xml_node::print, see documentation for details).
+		void save(xml_writer& writer, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
+
+	#ifndef PUGIXML_NO_STL
+		// Save XML document to stream (semantics is slightly different from xml_node::print, see documentation for details).
+		void save(std::basic_ostream<char, std::char_traits<char> >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
+		void save(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default) const;
+	#endif
+
+		// Save XML to file
+		bool save_file(const char* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
+		bool save_file(const wchar_t* path, const char_t* indent = PUGIXML_TEXT("\t"), unsigned int flags = format_default, xml_encoding encoding = encoding_auto) const;
+
+		// Get document element
+		xml_node document_element() const;
+	};
+
+#ifndef PUGIXML_NO_XPATH
+	// XPath query return type
+	enum xpath_value_type
+	{
+		xpath_type_none,	  // Unknown type (query failed to compile)
+		xpath_type_node_set,  // Node set (xpath_node_set)
+		xpath_type_number,	  // Number
+		xpath_type_string,	  // String
+		xpath_type_boolean	  // Boolean
+	};
+
+	// XPath parsing result
+	struct PUGIXML_CLASS xpath_parse_result
+	{
+		// Error message (0 if no error)
+		const char* error;
+
+		// Last parsed offset (in char_t units from string start)
+		ptrdiff_t offset;
+
+		// Default constructor, initializes object to failed state
+		xpath_parse_result();
+
+		// Cast to bool operator
+		operator bool() const;
+
+		// Get error description
+		const char* description() const;
+	};
+
+	// A single XPath variable
+	class PUGIXML_CLASS xpath_variable
+	{
+		friend class xpath_variable_set;
+
+	protected:
+		xpath_value_type _type;
+		xpath_variable* _next;
+
+		xpath_variable();
+
+		// Non-copyable semantics
+		xpath_variable(const xpath_variable&);
+		xpath_variable& operator=(const xpath_variable&);
+		
+	public:
+		// Get variable name
+		const char_t* name() const;
+
+		// Get variable type
+		xpath_value_type type() const;
+
+		// Get variable value; no type conversion is performed, default value (false, NaN, empty string, empty node set) is returned on type mismatch error
+		bool get_boolean() const;
+		double get_number() const;
+		const char_t* get_string() const;
+		const xpath_node_set& get_node_set() const;
+
+		// Set variable value; no type conversion is performed, false is returned on type mismatch error
+		bool set(bool value);
+		bool set(double value);
+		bool set(const char_t* value);
+		bool set(const xpath_node_set& value);
+	};
+
+	// A set of XPath variables
+	class PUGIXML_CLASS xpath_variable_set
+	{
+	private:
+		xpath_variable* _data[64];
+
+		// Non-copyable semantics
+		xpath_variable_set(const xpath_variable_set&);
+		xpath_variable_set& operator=(const xpath_variable_set&);
+
+		xpath_variable* find(const char_t* name) const;
+
+	public:
+		// Default constructor/destructor
+		xpath_variable_set();
+		~xpath_variable_set();
+
+		// Add a new variable or get the existing one, if the types match
+		xpath_variable* add(const char_t* name, xpath_value_type type);
+
+		// Set value of an existing variable; no type conversion is performed, false is returned if there is no such variable or if types mismatch
+		bool set(const char_t* name, bool value);
+		bool set(const char_t* name, double value);
+		bool set(const char_t* name, const char_t* value);
+		bool set(const char_t* name, const xpath_node_set& value);
+
+		// Get existing variable by name
+		xpath_variable* get(const char_t* name);
+		const xpath_variable* get(const char_t* name) const;
+	};
+
+	// A compiled XPath query object
+	class PUGIXML_CLASS xpath_query
+	{
+	private:
+		void* _impl;
+		xpath_parse_result _result;
+
+		typedef void (*unspecified_bool_type)(xpath_query***);
+
+		// Non-copyable semantics
+		xpath_query(const xpath_query&);
+		xpath_query& operator=(const xpath_query&);
+
+	public:
+		// Construct a compiled object from XPath expression.
+		// If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors.
+		explicit xpath_query(const char_t* query, xpath_variable_set* variables = 0);
+
+		// Destructor
+		~xpath_query();
+
+		// Get query expression return type
+		xpath_value_type return_type() const;
+		
+		// Evaluate expression as boolean value in the specified context; performs type conversion if necessary.
+		// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
+		bool evaluate_boolean(const xpath_node& n) const;
+		
+		// Evaluate expression as double value in the specified context; performs type conversion if necessary.
+		// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
+		double evaluate_number(const xpath_node& n) const;
+		
+	#ifndef PUGIXML_NO_STL
+		// Evaluate expression as string value in the specified context; performs type conversion if necessary.
+		// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
+		string_t evaluate_string(const xpath_node& n) const;
+	#endif
+		
+		// Evaluate expression as string value in the specified context; performs type conversion if necessary.
+		// At most capacity characters are written to the destination buffer, full result size is returned (includes terminating zero).
+		// If PUGIXML_NO_EXCEPTIONS is not defined, throws std::bad_alloc on out of memory errors.
+		// If PUGIXML_NO_EXCEPTIONS is defined, returns empty  set instead.
+		size_t evaluate_string(char_t* buffer, size_t capacity, const xpath_node& n) const;
+
+		// Evaluate expression as node set in the specified context.
+		// If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
+		// If PUGIXML_NO_EXCEPTIONS is defined, returns empty node set instead.
+		xpath_node_set evaluate_node_set(const xpath_node& n) const;
+
+		// Evaluate expression as node set in the specified context.
+		// Return first node in document order, or empty node if node set is empty.
+		// If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on type mismatch and std::bad_alloc on out of memory errors.
+		// If PUGIXML_NO_EXCEPTIONS is defined, returns empty node instead.
+		xpath_node evaluate_node(const xpath_node& n) const;
+
+		// Get parsing result (used to get compilation errors in PUGIXML_NO_EXCEPTIONS mode)
+		const xpath_parse_result& result() const;
+
+		// Safe bool conversion operator
+		operator unspecified_bool_type() const;
+
+		// Borland C++ workaround
+		bool operator!() const;
+	};
+	
+	#ifndef PUGIXML_NO_EXCEPTIONS
+	// XPath exception class
+	class PUGIXML_CLASS xpath_exception: public std::exception
+	{
+	private:
+		xpath_parse_result _result;
+
+	public:
+		// Construct exception from parse result
+		explicit xpath_exception(const xpath_parse_result& result);
+
+		// Get error message
+		virtual const char* what() const throw();
+
+		// Get parse result
+		const xpath_parse_result& result() const;
+	};
+	#endif
+	
+	// XPath node class (either xml_node or xml_attribute)
+	class PUGIXML_CLASS xpath_node
+	{
+	private:
+		xml_node _node;
+		xml_attribute _attribute;
+	
+		typedef void (*unspecified_bool_type)(xpath_node***);
+
+	public:
+		// Default constructor; constructs empty XPath node
+		xpath_node();
+		
+		// Construct XPath node from XML node/attribute
+		xpath_node(const xml_node& node);
+		xpath_node(const xml_attribute& attribute, const xml_node& parent);
+
+		// Get node/attribute, if any
+		xml_node node() const;
+		xml_attribute attribute() const;
+		
+		// Get parent of contained node/attribute
+		xml_node parent() const;
+
+		// Safe bool conversion operator
+		operator unspecified_bool_type() const;
+		
+		// Borland C++ workaround
+		bool operator!() const;
+
+		// Comparison operators
+		bool operator==(const xpath_node& n) const;
+		bool operator!=(const xpath_node& n) const;
+	};
+
+#ifdef __BORLANDC__
+	// Borland C++ workaround
+	bool PUGIXML_FUNCTION operator&&(const xpath_node& lhs, bool rhs);
+	bool PUGIXML_FUNCTION operator||(const xpath_node& lhs, bool rhs);
+#endif
+
+	// A fixed-size collection of XPath nodes
+	class PUGIXML_CLASS xpath_node_set
+	{
+	public:
+		// Collection type
+		enum type_t
+		{
+			type_unsorted,			// Not ordered
+			type_sorted,			// Sorted by document order (ascending)
+			type_sorted_reverse		// Sorted by document order (descending)
+		};
+		
+		// Constant iterator type
+		typedef const xpath_node* const_iterator;
+
+		// We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work
+		typedef const xpath_node* iterator;
+	
+		// Default constructor. Constructs empty set.
+		xpath_node_set();
+
+		// Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful
+		xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted);
+
+		// Destructor
+		~xpath_node_set();
+		
+		// Copy constructor/assignment operator
+		xpath_node_set(const xpath_node_set& ns);
+		xpath_node_set& operator=(const xpath_node_set& ns);
+
+		// Get collection type
+		type_t type() const;
+		
+		// Get collection size
+		size_t size() const;
+
+		// Indexing operator
+		const xpath_node& operator[](size_t index) const;
+		
+		// Collection iterators
+		const_iterator begin() const;
+		const_iterator end() const;
+
+		// Sort the collection in ascending/descending order by document order
+		void sort(bool reverse = false);
+		
+		// Get first node in the collection by document order
+		xpath_node first() const;
+		
+		// Check if collection is empty
+		bool empty() const;
+	
+	private:
+		type_t _type;
+		
+		xpath_node _storage;
+		
+		xpath_node* _begin;
+		xpath_node* _end;
+
+		void _assign(const_iterator begin, const_iterator end);
+	};
+#endif
+
+#ifndef PUGIXML_NO_STL
+	// Convert wide string to UTF8
+	std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str);
+	std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >& str);
+	
+	// Convert UTF8 to wide string
+	std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str);
+	std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >& str);
+#endif
+
+	// Memory allocation function interface; returns pointer to allocated memory or NULL on failure
+	typedef void* (*allocation_function)(size_t size);
+	
+	// Memory deallocation function interface
+	typedef void (*deallocation_function)(void* ptr);
+
+	// Override default memory management functions. All subsequent allocations/deallocations will be performed via supplied functions.
+	void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate);
+	
+	// Get current memory management functions
+	allocation_function PUGIXML_FUNCTION get_memory_allocation_function();
+	deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function();
+}
+
+#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
+namespace std
+{
+	// Workarounds for (non-standard) iterator category detection for older versions (MSVC7/IC8 and earlier)
+	std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_node_iterator&);
+	std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_attribute_iterator&);
+	std::bidirectional_iterator_tag PUGIXML_FUNCTION _Iter_cat(const pugi::xml_named_node_iterator&);
+}
+#endif
+
+#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
+namespace std
+{
+	// Workarounds for (non-standard) iterator category detection
+	std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_node_iterator&);
+	std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_attribute_iterator&);
+	std::bidirectional_iterator_tag PUGIXML_FUNCTION __iterator_category(const pugi::xml_named_node_iterator&);
+}
+#endif
+
+#endif
+
+// Make sure implementation is included in header-only mode
+// Use macro expansion in #include to work around QMake (QTBUG-11923)
+#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE)
+#	define PUGIXML_SOURCE "pugixml.cpp"
+#	include PUGIXML_SOURCE
+#endif
+
+/**
+ * Copyright (c) 2006-2014 Arseny Kapoulkine
+ *
+ * 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.
+ */
diff --git a/src/swig/Accuracy.i b/src/swig/Accuracy.i
new file mode 100644
index 0000000..c315115
--- /dev/null
+++ b/src/swig/Accuracy.i
@@ -0,0 +1,17 @@
+/* Accuracy.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Accuracy.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+#ifdef SWIGPYTHON
+%rename(__int__) PacBio::BAM::Accuracy::operator int;
+#else // C#, R
+%rename(ToInt) PacBio::BAM::Accuracy::operator int;
+#endif
+
+%include <pbbam/Accuracy.h>
\ No newline at end of file
diff --git a/src/swig/AlignmentPrinter.i b/src/swig/AlignmentPrinter.i
new file mode 100644
index 0000000..6c4fc69
--- /dev/null
+++ b/src/swig/AlignmentPrinter.i
@@ -0,0 +1,11 @@
+/* AlignmentPrinter.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/AlignmentPrinter.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/AligmentPrinter.h>
\ No newline at end of file
diff --git a/src/swig/BamFile.i b/src/swig/BamFile.i
new file mode 100644
index 0000000..5b8a916
--- /dev/null
+++ b/src/swig/BamFile.i
@@ -0,0 +1,21 @@
+/* BamFile.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamFile.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::BamFile::BamFile(BamFile&&);
+%ignore PacBio::BAM::BamFile::operator=;
+
+HANDLE_STD_EXCEPTION(BamFile);
+HANDLE_STD_EXCEPTION(EnsurePacBioIndexExists);
+HANDLE_STD_EXCEPTION(EnsureStandardIndexExists);
+HANDLE_STD_EXCEPTION(ReferenceId);
+HANDLE_STD_EXCEPTION(ReferenceLength);
+HANDLE_STD_EXCEPTION(ReferenceName);
+
+%include <pbbam/BamFile.h>
\ No newline at end of file
diff --git a/src/swig/BamHeader.i b/src/swig/BamHeader.i
new file mode 100644
index 0000000..5f7ea8e
--- /dev/null
+++ b/src/swig/BamHeader.i
@@ -0,0 +1,28 @@
+/* BamHeader.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamHeader.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+// Hide warnings about "internal" being a C# reserved word
+%warnfilter(314) PacBio::BAM::internal;
+
+%ignore PacBio::BAM::BamHeader::BamHeader(BamHeader&&);      // move ctors not used
+%ignore PacBio::BAM::BamHeader::operator=;                   // assignment operators not used
+
+%template(ProgramInfoList)   std::vector<PacBio::BAM::ProgramInfo>;
+%template(ReadGroupInfoList) std::vector<PacBio::BAM::ReadGroupInfo>;
+%template(SequenceInfoList)  std::vector<PacBio::BAM::SequenceInfo>;
+
+HANDLE_STD_EXCEPTION(Program);
+HANDLE_STD_EXCEPTION(ReadGroup);
+HANDLE_STD_EXCEPTION(Sequence);
+HANDLE_STD_EXCEPTION(SequenceId);
+HANDLE_STD_EXCEPTION(SequenceLength);
+HANDLE_STD_EXCEPTION(SequenceName);
+
+%include <pbbam/BamHeader.h>
diff --git a/src/swig/BamRecord.i b/src/swig/BamRecord.i
new file mode 100644
index 0000000..16e6036
--- /dev/null
+++ b/src/swig/BamRecord.i
@@ -0,0 +1,33 @@
+/* BamRecord.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamRecord.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+// Hide warnings about "internal" being a C# reserved word
+%warnfilter(314) PacBio::BAM::internal;
+
+// hide warnings about unused methods
+%ignore PacBio::BAM::BamRecord::BamRecord(BamRecordImpl&&);
+%ignore PacBio::BAM::BamRecord::BamRecord(BamRecord&&);
+%ignore PacBio::BAM::BamRecord::operator=;
+
+// ignore static methods, to allow member
+%ignore PacBio::BAM::BamRecord::Clipped(const BamRecord&, const ClipType, const PacBio::BAM::Position, const PacBio::BAM::Position);
+%ignore PacBio::BAM::BamRecord::Mapped(const BamRecord&, const int32_t, const Position, const Strand, const Cigar&, const uint8_t);
+
+// C# gets confused by the const and nonconst overloads
+%ignore PacBio::BAM::BamRecord::Impl() const;
+
+#ifdef SWIGR
+%rename("EncodedPkmean") PacBio::BAM::BamRecord::Pkmean(const std::vector<uint16_t>&);
+%rename("EncodedPkmid")  PacBio::BAM::BamRecord::Pkmid(const std::vector<uint16_t>&);
+#endif // SWIGR
+
+HANDLE_STD_EXCEPTION(CigarData);
+
+%include <pbbam/BamRecord.h>
diff --git a/src/swig/BamRecordBuilder.i b/src/swig/BamRecordBuilder.i
new file mode 100644
index 0000000..7e968f9
--- /dev/null
+++ b/src/swig/BamRecordBuilder.i
@@ -0,0 +1,12 @@
+/* BamRecord.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamRecordBuilder.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+
+%include <pbbam/BamRecordBuilder.h>
diff --git a/src/swig/BamRecordImpl.i b/src/swig/BamRecordImpl.i
new file mode 100644
index 0000000..3899147
--- /dev/null
+++ b/src/swig/BamRecordImpl.i
@@ -0,0 +1,16 @@
+/* BamRecordImpl.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamRecordImpl.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::BamRecordImpl::BamRecordImpl(BamRecordImpl&&); 
+%ignore PacBio::BAM::BamRecordImpl::operator=;
+
+HANDLE_STD_EXCEPTION(CigarData);
+
+%include <pbbam/BamRecordImpl.h>
\ No newline at end of file
diff --git a/src/swig/BamTagCodec.i b/src/swig/BamTagCodec.i
new file mode 100644
index 0000000..4a4326b
--- /dev/null
+++ b/src/swig/BamTagCodec.i
@@ -0,0 +1,11 @@
+/* BamTagCodec.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamTagCodec.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/BamTagCodec.h>
\ No newline at end of file
diff --git a/src/swig/BamWriter.i b/src/swig/BamWriter.i
new file mode 100644
index 0000000..87e332f
--- /dev/null
+++ b/src/swig/BamWriter.i
@@ -0,0 +1,18 @@
+/* BamWriter.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/BamWriter.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+ 
+%ignore PacBio::BAM::BamWriter(const BamWriter&);  // copy ctor not used
+%ignore PacBio::BAM::BamWriter(BamWriter&&);       // move ctor not used
+%ignore PacBio::BAM::BamWriter::operator=;         // assignment operators not used
+
+HANDLE_STD_EXCEPTION(BamWriter);
+HANDLE_STD_EXCEPTION(Write);
+
+%include <pbbam/BamWriter.h>
\ No newline at end of file
diff --git a/src/swig/CMakeLists.txt b/src/swig/CMakeLists.txt
new file mode 100644
index 0000000..8f52386
--- /dev/null
+++ b/src/swig/CMakeLists.txt
@@ -0,0 +1,68 @@
+# --------------------------------------------- @
+# SWIG
+# --------------------------------------------- @
+
+# general SWIG
+if(${wrapping_swig})
+
+    find_package(SWIG 3.0.5 REQUIRED)
+
+    include(${SWIG_USE_FILE})
+    include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+
+    #
+    # quash compiler warnings from SWIG-generated code
+    #
+    check_cxx_compiler_flag("-Wno-unused-local-typedefs" HAS_NO_UNUSED_BUT_SET_VARIABLE)
+    if(HAS_NO_UNUSED_BUT_SET_VARIABLE)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-but-set-variable")
+    endif()
+
+    check_cxx_compiler_flag("-Wno-dynamic-class-memaccess" HAS_NO_DYNAMIC_CLASS_MEMACCESS)
+    if (HAS_NO_DYNAMIC_CLASS_MEMACCESS)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-dynamic-class-memaccess")
+    endif()
+
+    check_cxx_compiler_flag("-Wno-unused-parameter" HAS_NO_UNUSED_PARAMETER)
+    if (HAS_NO_UNUSED_PARAMETER)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter")
+    endif()
+
+    check_cxx_compiler_flag("-Wno-return-local-addr" HAS_NO_RETURN_LOCAL_ADDR)
+    if (HAS_NO_RETURN_LOCAL_ADDR)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-local-addr")
+    endif()
+
+    check_cxx_compiler_flag("-Wno-return-type" HAS_NO_RETURN_TYPE)
+    if (HAS_NO_RETURN_TYPE)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type")
+    endif()
+
+    #
+    # SWIG source file properties
+    #
+    set_source_files_properties(PacBioBam.i PROPERTIES CPLUSPLUS ON)
+
+    if (APPLE)
+    else()
+        if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+            set_source_files_properties(PacBioBam.i PROPERTIES SWIG_FLAGS "-DSWIGWORDSIZE64")
+        endif()
+    endif()
+
+endif()
+
+# Python
+if(PacBioBAM_wrap_python)
+    include(WrapPython.cmake)
+endif()
+
+# R
+if(PacBioBAM_wrap_r)
+    include(WrapR.cmake)
+endif()
+
+# CSharp
+if(PacBioBAM_wrap_csharp)
+    include(WrapCSharp.cmake)
+endif()
diff --git a/src/swig/Cigar.i b/src/swig/Cigar.i
new file mode 100644
index 0000000..2c5cf8c
--- /dev/null
+++ b/src/swig/Cigar.i
@@ -0,0 +1,16 @@
+/* Cigar.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Cigar.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%template(CigarOpList) std::vector<PacBio::BAM::CigarOperation>;
+
+%ignore PacBio::BAM::Cigar::Cigar(Cigar&&);
+%ignore PacBio::BAM::Cigar::operator=;
+
+%include <pbbam/Cigar.h>
diff --git a/src/swig/CigarOperation.i b/src/swig/CigarOperation.i
new file mode 100644
index 0000000..b2a9586
--- /dev/null
+++ b/src/swig/CigarOperation.i
@@ -0,0 +1,49 @@
+/* CigarOperation.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/CigarOperation.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::CigarOperation::CigarOperation(CigarOperation&&);
+%ignore PacBio::BAM::CigarOperation::operator=;
+
+#ifdef SWIGR
+%ignore PacBio::BAM::CigarOperation::CigarOperation(CigarOperationType, uint32_t);
+#endif
+
+HANDLE_STD_EXCEPTION(CigarOperation);
+
+%include <pbbam/CigarOperation.h>
+
+// enums aren't always named consistently (at least between Mac/clang/swig & Linux/gcc/swig)
+// so, keep this after the main %include so client source can be consistent 
+#ifdef SWIGPYTHON
+%pythoncode %{
+try:
+	UNKNOWN_OP
+	ALIGNMENT_MATCH
+	INSERTION
+	DELETION
+	REFERENCE_SKIP
+	SOFT_CLIP
+	HARD_CLIP
+	PADDING
+	SEQUENCE_MATCH
+	SEQUENCE_MISMATCH
+except NameError:
+	UNKNOWN_OP = CigarOperationType_UNKNOWN_OP
+	ALIGNMENT_MATCH = CigarOperationType_ALIGNMENT_MATCH
+	INSERTION = CigarOperationType_INSERTION
+	DELETION = CigarOperationType_DELETION
+	REFERENCE_SKIP = CigarOperationType_REFERENCE_SKIP
+	SOFT_CLIP = CigarOperationType_SOFT_CLIP
+	HARD_CLIP = CigarOperationType_HARD_CLIP
+	PADDING = CigarOperationType_PADDING 
+	SEQUENCE_MATCH = CigarOperationType_SEQUENCE_MATCH 
+	SEQUENCE_MISMATCH = CigarOperationType_SEQUENCE_MISMATCH
+%}
+#endif
diff --git a/src/swig/DataSet.i b/src/swig/DataSet.i
new file mode 100644
index 0000000..8ba22c4
--- /dev/null
+++ b/src/swig/DataSet.i
@@ -0,0 +1,17 @@
+/* DataSet.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/DataSet.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+// move ctors not used
+%ignore PacBio::BAM::DataSet::DataSet(DataSet&&);      
+
+// assignment operators not used
+%ignore PacBio::BAM::DataSet::operator=;                 
+
+%include <pbbam/DataSet.h>
\ No newline at end of file
diff --git a/src/swig/DataSetTypes.i b/src/swig/DataSetTypes.i
new file mode 100644
index 0000000..2aeb0ff
--- /dev/null
+++ b/src/swig/DataSetTypes.i
@@ -0,0 +1,62 @@
+/* DataSetTypes.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/internal/DataSetElement.h>
+#include <pbbam/internal/DataSetListElement.h>
+#include <pbbam/internal/DataSetBaseTypes.h>
+#include <pbbam/DataSetTypes.h>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+%}
+
+%ignore PacBio::BAM::internal::DataSetElement::DataSetElement(DataSetElement&&);
+%ignore PacBio::BAM::internal::DataSetElement::operator=;
+%ignore PacBio::BAM::internal::DataSetElement::operator[];
+/*%rename(__getitem__) PacBio::BAM::internal::DataSetElement::operator[];*/
+
+%include <pbbam/internal/DataSetElement.h>
+
+%ignore PacBio::BAM::internal::DataSetElementList::operator[];
+%ignore PacBio::BAM::internal::DataSetListIterator::operator++;
+%ignore PacBio::BAM::internal::DataSetListConstIterator::operator++;
+
+%include <pbbam/internal/DataSetListElement.h>
+
+%template(ExtensionListElement)        PacBio::BAM::internal::DataSetListElement<PacBio::BAM::ExtensionElement>;
+%template(ExternalResourceListElement) PacBio::BAM::internal::DataSetListElement<PacBio::BAM::ExternalResource>;
+%template(FileIndexListElement)        PacBio::BAM::internal::DataSetListElement<PacBio::BAM::FileIndex>;
+%template(FilterListElement)           PacBio::BAM::internal::DataSetListElement<PacBio::BAM::Filter>;
+%template(PropertyListElement)         PacBio::BAM::internal::DataSetListElement<PacBio::BAM::Property>;
+%template(SubDataSetListElement)       PacBio::BAM::internal::DataSetListElement<PacBio::BAM::DataSetBase>;
+
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::ExtensionElement> {
+    PacBio::BAM::ExtensionElement& __getitem__(unsigned int i)       { return $self->Child<PacBio::BAM::ExtensionElement>(i); }
+    PacBio::BAM::ExtensionElement& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::ExtensionElement>(s); }
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::ExternalResource> {
+    PacBio::BAM::ExternalResource& __getitem__(unsigned int i)       { return $self->Child<PacBio::BAM::ExternalResource>(i); }
+    PacBio::BAM::ExternalResource& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::ExternalResource>(s); }
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::FileIndex> {
+    PacBio::BAM::FileIndex& __getitem__(unsigned int i)       { return $self->Child<PacBio::BAM::FileIndex>(i);}
+    PacBio::BAM::FileIndex& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::FileIndex>(s);}
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::Filter> {
+    PacBio::BAM::Filter& __getitem__(unsigned int i)       { return $self->Child<PacBio::BAM::Filter>(i); }
+    PacBio::BAM::Filter& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::Filter>(s); }
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::Property> {
+    PacBio::BAM::Property& __getitem__(unsigned int i)       { return $self->Child<PacBio::BAM::Property>(i); }
+    PacBio::BAM::Property& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::Property>(s); }
+}
+%extend PacBio::BAM::internal::DataSetListElement<PacBio::BAM::DataSetBase> {
+    PacBio::BAM::DataSetBase& __getitem__(unsigned int i)       { return $self->Child<PacBio::BAM::DataSetBase>(i); }
+    PacBio::BAM::DataSetBase& __getitem__(const std::string& s) { return $self->Child<PacBio::BAM::DataSetBase>(s); }
+}
+
+%include <pbbam/internal/DataSetBaseTypes.h>
+%include <pbbam/DataSetTypes.h>
diff --git a/src/swig/EntireFileQuery.i b/src/swig/EntireFileQuery.i
new file mode 100644
index 0000000..a0571e8
--- /dev/null
+++ b/src/swig/EntireFileQuery.i
@@ -0,0 +1,17 @@
+/* EntireFileQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/DataSet.h>
+#include <pbbam/internal/QueryBase.h>
+#include <pbbam/EntireFileQuery.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+HANDLE_STD_EXCEPTION(EntireFileQuery);
+
+%include <pbbam/DataSet.h>
+%include <pbbam/internal/QueryBase.h>
+%include <pbbam/EntireFileQuery.h>
\ No newline at end of file
diff --git a/src/swig/Frames.i b/src/swig/Frames.i
new file mode 100644
index 0000000..d3e001a
--- /dev/null
+++ b/src/swig/Frames.i
@@ -0,0 +1,19 @@
+/* Frames.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Frames.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::Frames::Frames(Frames&&);
+%ignore PacBio::BAM::Frames::Frames(std::vector<uint16_t>&&);
+%ignore PacBio::BAM::Frames::operator=;
+%ignore PacBio::BAM::Frames::Data(std::vector<uint16_t>&&);
+
+%template(UInt8List)  std::vector<uint8_t>;
+%template(UInt16List) std::vector<uint16_t>;
+
+%include <pbbam/Frames.h>
diff --git a/src/swig/GenomicInterval.i b/src/swig/GenomicInterval.i
new file mode 100644
index 0000000..626c8ac
--- /dev/null
+++ b/src/swig/GenomicInterval.i
@@ -0,0 +1,11 @@
+/* GenomicInterval.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/GenomicInterval.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/GenomicInterval.h>
\ No newline at end of file
diff --git a/src/swig/GenomicIntervalQuery.i b/src/swig/GenomicIntervalQuery.i
new file mode 100644
index 0000000..0ed7886
--- /dev/null
+++ b/src/swig/GenomicIntervalQuery.i
@@ -0,0 +1,15 @@
+/* GenomicIntervalQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/GenomicIntervalQuery.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+HANDLE_STD_EXCEPTION(CreateIterator);
+HANDLE_STD_EXCEPTION(GenomicIntervalQuery);
+HANDLE_STD_EXCEPTION(Interval);
+
+%include <pbbam/GenomicIntervalQuery.h>
\ No newline at end of file
diff --git a/src/swig/GroupQuery.i b/src/swig/GroupQuery.i
new file mode 100644
index 0000000..3128e15
--- /dev/null
+++ b/src/swig/GroupQuery.i
@@ -0,0 +1,11 @@
+/* GroupQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/GroupQuery.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/GroupQuery.h>
\ No newline at end of file
diff --git a/src/swig/GroupQueryBase.i b/src/swig/GroupQueryBase.i
new file mode 100644
index 0000000..ade4526
--- /dev/null
+++ b/src/swig/GroupQueryBase.i
@@ -0,0 +1,32 @@
+/* GroupQueryBase.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/GroupQueryBase.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::GroupQueryIterator::operator++;
+%ignore PacBio::BAM::GroupQueryConstIterator::operator++;
+
+%include <pbbam/GroupQueryBase.h>
+
+%extend PacBio::BAM::GroupQueryIterator
+{
+    PacBio::BAM::GroupQueryIterator& incr(void)
+    { return $self->operator++(); }
+
+    std::vector<PacBio::BAM::BamRecord>* value(void)
+    { return $self->operator->(); }
+}
+
+%extend PacBio::BAM::GroupQueryConstIterator
+{
+    PacBio::BAM::GroupQueryConstIterator& incr(void)
+    { return $self->operator++(); }
+
+    const std::vector<PacBio::BAM::BamRecord>* value(void) const
+    { return $self->operator->(); }
+}
\ No newline at end of file
diff --git a/src/swig/IndexedFastaReader.i b/src/swig/IndexedFastaReader.i
new file mode 100644
index 0000000..25ef650
--- /dev/null
+++ b/src/swig/IndexedFastaReader.i
@@ -0,0 +1,13 @@
+/* IndexedFastaReader.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/IndexedFastaReader.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::IndexedFastaReader::operator=; // assignment operators not used
+
+%include <pbbam/IndexedFastaReader.h>
diff --git a/src/swig/Interval.i b/src/swig/Interval.i
new file mode 100644
index 0000000..0867eb4
--- /dev/null
+++ b/src/swig/Interval.i
@@ -0,0 +1,12 @@
+/* Interval.i */
+%module PacBioBam
+%{
+#include <pbbam/Interval.h>
+#include <pbbam/Position.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/Interval.h>
+
+%template(PositionInterval) PacBio::BAM::Interval<PacBio::BAM::Position>;
diff --git a/src/swig/LocalContextFlags.i b/src/swig/LocalContextFlags.i
new file mode 100644
index 0000000..b47a4d4
--- /dev/null
+++ b/src/swig/LocalContextFlags.i
@@ -0,0 +1,11 @@
+/* LocalContextFlags.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/LocalContextFlags.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/LocalContextFlags.h>
diff --git a/src/swig/Orientation.i b/src/swig/Orientation.i
new file mode 100644
index 0000000..2f10a7a
--- /dev/null
+++ b/src/swig/Orientation.i
@@ -0,0 +1,11 @@
+/* Orientation.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Orientation.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/Orientation.h>
\ No newline at end of file
diff --git a/src/swig/PacBio.BAM.csproj.in b/src/swig/PacBio.BAM.csproj.in
new file mode 100644
index 0000000..61872db
--- /dev/null
+++ b/src/swig/PacBio.BAM.csproj.in
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{6E414044-5469-48E4-BA14-1B9888875DD5}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>PacBio.BAM</RootNamespace>
+    <AssemblyName>PacBio.BAM</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>full</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="*.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
diff --git a/src/swig/PacBioBam.i b/src/swig/PacBioBam.i
new file mode 100644
index 0000000..ed8c746
--- /dev/null
+++ b/src/swig/PacBioBam.i
@@ -0,0 +1,166 @@
+/* pbbam.i */
+%module PacBioBam
+%{
+
+/*ifdef SWIGR
+ define SWIG_SHARED_PTR_NAMESPACE boost
+ define SWIG_SHARED_PTR_SUBNAMESPACE
+endif*/
+
+#include <pbbam/Config.h>
+#include <string>
+#include <vector>
+%}
+
+#define SWIG_FILE_WITH_INIT
+#define PBBAM_EXPORT
+
+#ifdef SWIGCSHARP
+%rename(Equals)        *::operator==;
+%rename(ToBool)        *::operator bool;
+%rename(ToInt)         *::operator int;
+%rename(ToUint8)       *::operator uint8_t;
+
+%ignore *::operator !=;
+
+// Iterator interfaces are not useful outside of C++
+%ignore *::begin;
+%ignore *::end;
+
+%csmethodmodifiers *::ToString() const "public override";
+
+#endif // SWIGCSHARP
+
+/********* SWIG includes ************/
+
+%include "exception.i"
+%include "stdint.i"
+%include "std_common.i"
+
+#ifdef SWIGR
+%include "boost_shared_ptr.i"
+#else
+%include "std_shared_ptr.i"
+#endif
+
+%include "std_map.i"
+%include "std_pair.i"
+%include "std_string.i"
+%include "std_vector.i"
+
+ // TODO: can we call these vectors!?
+%template(StringList) std::vector<std::string>;
+%template(IntList)    std::vector<int>;
+%template(UIntList)   std::vector<unsigned int>;
+%template(FloatList)  std::vector<float>;
+%template(ShortList)  std::vector<short>;
+%template(CharList)   std::vector<char>;
+
+// basic exception-handler helper
+//
+// -- STL builtins --
+// std::invalid_argument -> ValueError
+// std::domain_error     -> ValueError
+// std::overflow_error   -> OverflowError
+// std::out_of_range     -> IndexError
+// std::length_error     -> IndexError
+// std::runtime_error    -> RuntimeError
+// std::exception        -> SystemError
+//
+// (anything else)       -> UnknownError
+//
+// * All pbbam exceptions are simply std::exception (SystemErro) for now,
+//   until (if?) we flesh out a more detailed exception hierarchy.
+//   Either way, new ones will inherit from std::exception, so SystemError
+//   should still remain a valid handler.
+//
+%define HANDLE_STD_EXCEPTION(MethodName)
+%exception MethodName {
+    try {
+                $action
+        }
+    SWIG_CATCH_STDEXCEPT // catch std::exception
+    catch (...) {
+                SWIG_exception(SWIG_UnknownError, "Unknown exception");
+        }
+}
+%enddef
+
+/********* PacBioBAM includes ************/
+
+#ifdef SWIGCSHARP
+ // Renames to play nice with C#
+ // (These are used in the dataset support code, where things like
+ //  this happen in C++:
+ //
+ //    void Extensions(Extensions x) { ... }
+ //
+ //  and this poses problems for C#.  Renaming should be fine
+ //  as it is doubtful we will refer to these classes by name anyway.)
+ //
+%rename(ExtensionsType)        PacBio::BAM::Extensions;
+%rename(ExternalResourcesType) PacBio::BAM::ExternalResources;
+%rename(FiltersType)           PacBio::BAM::Filters;
+%rename(SubDataSetsType)       PacBio::BAM::SubDataSets;
+%rename(ProvenanceType)        PacBio::BAM::Provenance;
+%rename(PropertiesType)        PacBio::BAM::Properties;
+%rename(FileIndicesType)       PacBio::BAM::FileIndices;
+%rename(ParentToolType)        PacBio::BAM::ParentTool;
+%rename(CigarType)             PacBio::BAM::Cigar;
+#endif
+
+// Basic types
+%include "Accuracy.i"
+%include "CigarOperation.i"
+%include "Interval.i"
+%include "LocalContextFlags.i"
+%include "Orientation.i"
+%include "Position.i"
+%include "QualityValue.i"
+%include "Strand.i"
+%include "Tag.i"
+
+// Basic type aggregates
+%include "Cigar.i"
+%include "GenomicInterval.i"
+%include "QualityValues.i"
+%include "TagCollection.i"
+
+// keep this guy after the other basic types, hacky but works
+%include "Frames.i"
+
+// Header API 
+%include "ProgramInfo.i"
+%include "ReadGroupInfo.i"
+%include "SequenceInfo.i"
+%include "BamHeader.i"
+
+// SAM/BAM format
+%include "BamFile.i"
+%include "BamRecordImpl.i"
+%include "BamRecord.i"
+%include "BamRecordBuilder.i"
+%include "BamTagCodec.i"
+%include "BamWriter.i"
+%include "SamTagCodec.i"
+
+// DataSet
+%include "DataSetTypes.i"
+%include "DataSet.i"
+
+// Query/iterator API
+%include "QueryBase.i"
+%include "GroupQueryBase.i"
+%include "GroupQuery.i"
+%include "EntireFileQuery.i"
+%include "GenomicIntervalQuery.i"
+%include "ZmwQuery.i"
+%include "ZmwGroupQuery.i"
+
+// PBI
+%include "PbiFile.i"
+%include "PbiRawData.i"
+%include "PbiIndex.i"
+
+// FASTA
+%include "IndexedFastaReader.i"
diff --git a/src/swig/PbiFile.i b/src/swig/PbiFile.i
new file mode 100644
index 0000000..096ff10
--- /dev/null
+++ b/src/swig/PbiFile.i
@@ -0,0 +1,11 @@
+/* PbiFile.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/PbiFile.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/PbiFile.h>
\ No newline at end of file
diff --git a/src/swig/PbiIndex.i b/src/swig/PbiIndex.i
new file mode 100644
index 0000000..d903f67
--- /dev/null
+++ b/src/swig/PbiIndex.i
@@ -0,0 +1,18 @@
+/* PbiIndex.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/PbiIndex.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+/*%ignore PacBio::BAM::IndexResultBlock::IndexResultBlock();*/
+%ignore PacBio::BAM::IndexResultBlock::IndexResultBlock(size_t, size_t);
+
+%ignore PacBio::BAM::PbiIndex::PbiIndex(PbiIndex&&);      // move ctors not used
+%ignore PacBio::BAM::PbiIndex::operator=;                 // assignment operators not used
+%ignore PacBio::BAM::PbiIndeX::VirtualFileOffsets; 
+
+%include <pbbam/PbiIndex.h>
diff --git a/src/swig/PbiRawData.i b/src/swig/PbiRawData.i
new file mode 100644
index 0000000..4992cc4
--- /dev/null
+++ b/src/swig/PbiRawData.i
@@ -0,0 +1,29 @@
+/* PbiRawData.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/PbiRawData.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+// move ctors not used
+%ignore PacBio::BAM::PbiRawBarcodeData::PbiRawBarcodeData(PbiRawBarcodeData&&);   
+%ignore PacBio::BAM::PbiRawMappedData::PbiRawMappedData(PbiRawMappedData&&);
+%ignore PacBio::BAM::PbiReferenceEntry::PbiReferenceEntry(PbiReferenceEntry&&);
+%ignore PacBio::BAM::PbiRawReferenceData::PbiRawReferenceData(PbiRawReferenceData&&);
+%ignore PacBio::BAM::PbiRawSubreadData::PbiRawSubreadData(PbiRawSubreadData&&);
+%ignore PacBio::BAM::PbiRawData::PbiRawData(PbiRawData&&); 
+
+// assignment operators not used
+%ignore PacBio::BAM::PbiRawBarcodeData::operator=;                   
+%ignore PacBio::BAM::PbiRawMappedData::operator=;
+%ignore PacBio::BAM::PbiReferenceEntry::operator=;
+%ignore PacBio::BAM::PbiRawReferenceData::operator=;
+%ignore PacBio::BAM::PbiRawSubreadData::operator=;
+%ignore PacBio::BAM::PbiRawData::operator=;
+
+HANDLE_STD_EXCEPTION(PacBio::BAM::PbiRawMappedData::AddRecord);
+
+%include <pbbam/PbiRawData.h>
diff --git a/src/swig/Position.i b/src/swig/Position.i
new file mode 100644
index 0000000..9917024
--- /dev/null
+++ b/src/swig/Position.i
@@ -0,0 +1,11 @@
+/* Position.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Position.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/Position.h>
diff --git a/src/swig/ProgramInfo.i b/src/swig/ProgramInfo.i
new file mode 100644
index 0000000..9f2a2aa
--- /dev/null
+++ b/src/swig/ProgramInfo.i
@@ -0,0 +1,15 @@
+/* ProgramInfo.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/ProgramInfo.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::ProgramInfo::ProgramInfo(ProgramInfo&&);
+%ignore PacBio::BAM::ProgramInfo::operator=;
+%ignore PacBio::BAM::ProgramInfo::ToSam(const ProgramInfo&);    // ignore static method, to allow member
+
+%include <pbbam/ProgramInfo.h>
\ No newline at end of file
diff --git a/src/swig/QualityValue.i b/src/swig/QualityValue.i
new file mode 100644
index 0000000..29874e1
--- /dev/null
+++ b/src/swig/QualityValue.i
@@ -0,0 +1,20 @@
+/* QualityValue.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/QualityValue.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::QualityValue::operator=;
+
+#ifdef SWIGPYTHON
+%rename(__int__) PacBio::BAM::QualityValue::operator uint8_t;
+#else // R, C#
+%rename(ToInt) PacBio::BAM::QualityValue::operator uint8_t;
+#endif
+
+%include <pbbam/QualityValue.h>
+
diff --git a/src/swig/QualityValues.i b/src/swig/QualityValues.i
new file mode 100644
index 0000000..815a1b2
--- /dev/null
+++ b/src/swig/QualityValues.i
@@ -0,0 +1,17 @@
+/* QualityValues.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/QualityValues.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%template(QualityValueList) std::vector<PacBio::BAM::QualityValue>;
+
+%ignore PacBio::BAM::QualityValues::operator=;
+%ignore PacBio::BAM::QualityValues::QualityValues(QualityValues&&);
+%ignore PacBio::BAM::QualityValues::QualityValues(std::vector<QualityValue>&&);
+
+%include <pbbam/QualityValues.h>
diff --git a/src/swig/QueryBase.i b/src/swig/QueryBase.i
new file mode 100644
index 0000000..f2220d9
--- /dev/null
+++ b/src/swig/QueryBase.i
@@ -0,0 +1,127 @@
+/* QueryBase.i */
+
+%module PacBioBam
+
+%{
+
+#include <pbbam/internal/QueryBase.h>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+
+%ignore PacBio::BAM::QueryIterator::operator++;
+%ignore PacBio::BAM::QueryConstIterator::operator++;
+
+%ignore PacBio::BAM::internal::QueryIterator::operator++;
+%ignore PacBio::BAM::internal::QueryConstIterator::operator++;
+
+%typemap(csinterfaces) PacBio::BAM::internal::QueryBase<BamRecord>  "global::System.Collections.IEnumerable\n, global::System.Collections.Generic.IEnumerable<PacBio.BAM.BamRecord>\n";
+%typemap(cscode) PacBio::BAM::internal::QueryBase<BamRecord>
+%{
+
+    public global::System.Collections.Generic.IEnumerator<PacBio.BAM.BamRecord> GetEnumerator()
+    {
+        var i = this.cbegin();
+        var e = this.cend();
+        while (!i.Equals(e))
+        {
+            yield return i.value();
+            i.incr();
+        }
+    }
+
+    global::System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+    {
+        return GetEnumerator();
+    }
+
+%}
+
+namespace std {
+    %template(BamRecordList) std::vector<PacBio::BAM::BamRecord>;
+}
+
+%typemap(csinterfaces) PacBio::BAM::internal::QueryBase<std::vector<BamRecord> >  "global::System.Collections.IEnumerable\n, global::System.Collections.Generic.IEnumerable<BamRecordList>\n";
+%typemap(cscode) PacBio::BAM::internal::QueryBase<std::vector<BamRecord> >
+%{
+
+    public global::System.Collections.Generic.IEnumerator<BamRecordList> GetEnumerator()
+    {
+        var i = this.cbegin();
+        var e = this.cend();
+        while (!i.Equals(e))
+        {
+            yield return i.value();
+            i.incr();
+        }
+    }
+
+    global::System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+    {
+        return GetEnumerator();
+    }
+
+%}
+
+%include <pbbam/internal/QueryBase.h>
+
+%template(IQuery)      PacBio::BAM::internal::QueryBase<BamRecord>;
+%template(IGroupQuery) PacBio::BAM::internal::QueryBase<std::vector<BamRecord> >;
+
+// IEnumerable<BamRecord> interfaces for Queries
+%template(BamQueryIteratorBase)       PacBio::BAM::internal::QueryIteratorBase<BamRecord>;
+%template(BamGroupQueryIteratorBase)  PacBio::BAM::internal::QueryIteratorBase<std::vector<BamRecord> >;
+%template(BamQueryIterator)           PacBio::BAM::internal::QueryIterator<BamRecord>;
+%template(BamGroupQueryIterator)      PacBio::BAM::internal::QueryIterator<std::vector<BamRecord> >;
+%template(BamQueryConstIterator)      PacBio::BAM::internal::QueryConstIterator<BamRecord>;
+%template(BamGroupQueryConstIterator) PacBio::BAM::internal::QueryConstIterator<std::vector<BamRecord> >;
+
+// Iterator API
+#ifdef SWIGPYTHON
+%pythoncode %{
+def Iterate(c):
+	i = c.begin()
+	e = c.end()
+	while i != e:
+		yield i.value()
+		i.incr()
+%}
+#endif
+
+%extend PacBio::BAM::internal::QueryIterator<BamRecord>
+{
+        PacBio::BAM::internal::QueryIterator<BamRecord>& incr(void)
+	{ return $self->operator++(); }
+	
+	PacBio::BAM::BamRecord* value(void)
+	{ return $self->operator->(); }
+}
+
+%extend PacBio::BAM::internal::QueryConstIterator<BamRecord>
+{
+        PacBio::BAM::internal::QueryConstIterator<BamRecord>& incr(void)
+	{ return $self->operator++(); }
+	
+	const PacBio::BAM::BamRecord* value(void) const
+	{ return $self->operator->(); }
+}
+
+%extend PacBio::BAM::internal::QueryIterator<std::vector<BamRecord> >
+{
+        PacBio::BAM::internal::QueryIterator<std::vector<BamRecord> >& incr(void)
+	{ return $self->operator++(); }
+	
+	std::vector<PacBio::BAM::BamRecord>* value(void)
+	{ return $self->operator->(); }
+}
+
+%extend PacBio::BAM::internal::QueryConstIterator<std::vector<BamRecord> >
+{
+        PacBio::BAM::internal::QueryConstIterator<std::vector<BamRecord> >& incr(void)
+	{ return $self->operator++(); }
+	
+	const std::vector<PacBio::BAM::BamRecord>* value(void) const
+	{ return $self->operator->(); }
+}
diff --git a/src/swig/ReadGroupInfo.i b/src/swig/ReadGroupInfo.i
new file mode 100644
index 0000000..a02deda
--- /dev/null
+++ b/src/swig/ReadGroupInfo.i
@@ -0,0 +1,15 @@
+/* ReadGroupInfo.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/ReadGroupInfo.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::ReadGroupInfo::ReadGroupInfo(ReadGroupInfo&&);
+%ignore PacBio::BAM::ReadGroupInfo::operator=;
+%ignore PacBio::BAM::ReadGroupInfo::ToSam(const ReadGroupInfo&); 
+
+%include <pbbam/ReadGroupInfo.h>
\ No newline at end of file
diff --git a/src/swig/SamTagCodec.i b/src/swig/SamTagCodec.i
new file mode 100644
index 0000000..320d488
--- /dev/null
+++ b/src/swig/SamTagCodec.i
@@ -0,0 +1,11 @@
+/* SamTagCodec.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/SamTagCodec.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/SamTagCodec.h>
\ No newline at end of file
diff --git a/src/swig/SequenceInfo.i b/src/swig/SequenceInfo.i
new file mode 100644
index 0000000..3b0ce67
--- /dev/null
+++ b/src/swig/SequenceInfo.i
@@ -0,0 +1,15 @@
+/* SequenceInfo.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/SequenceInfo.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::SequenceInfo::SequenceInfo(SequenceInfo&&);
+%ignore PacBio::BAM::SequenceInfo::operator=;
+%ignore PacBio::BAM::SequenceInfo::ToSam(const SequenceInfo&);    // ignore static method, to allow member
+
+%include <pbbam/SequenceInfo.h>
\ No newline at end of file
diff --git a/src/swig/Strand.i b/src/swig/Strand.i
new file mode 100644
index 0000000..96f71f1
--- /dev/null
+++ b/src/swig/Strand.i
@@ -0,0 +1,11 @@
+/* Strand.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Strand.h>	
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/Strand.h>
\ No newline at end of file
diff --git a/src/swig/Tag.i b/src/swig/Tag.i
new file mode 100644
index 0000000..838454c
--- /dev/null
+++ b/src/swig/Tag.i
@@ -0,0 +1,130 @@
+/* Tag.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/Tag.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%ignore PacBio::BAM::Tag::Tag(Tag&&);
+%ignore PacBio::BAM::Tag::operator=;
+
+HANDLE_STD_EXCEPTION(ToInt8);
+HANDLE_STD_EXCEPTION(ToUInt8);
+HANDLE_STD_EXCEPTION(ToInt16);
+HANDLE_STD_EXCEPTION(ToUInt16);
+HANDLE_STD_EXCEPTION(ToInt32);
+HANDLE_STD_EXCEPTION(ToUInt32);
+HANDLE_STD_EXCEPTION(ToFloat);
+HANDLE_STD_EXCEPTION(ToString);
+HANDLE_STD_EXCEPTION(ToInt8Array);
+HANDLE_STD_EXCEPTION(ToUInt8Array);
+HANDLE_STD_EXCEPTION(ToInt16Array);
+HANDLE_STD_EXCEPTION(ToUInt16Array);
+HANDLE_STD_EXCEPTION(ToInt32Array);
+HANDLE_STD_EXCEPTION(ToUInt32Array);
+HANDLE_STD_EXCEPTION(ToFloatArray);
+
+#ifdef SWIGR
+
+%ignore PacBio::BAM::Tag::Tag(int8_t value);
+%ignore PacBio::BAM::Tag::Tag(uint8_t value);
+%ignore PacBio::BAM::Tag::Tag(int16_t value);
+%ignore PacBio::BAM::Tag::Tag(uint16_t value);
+%ignore PacBio::BAM::Tag::Tag(int32_t value);
+%ignore PacBio::BAM::Tag::Tag(uint32_t value);
+%ignore PacBio::BAM::Tag::Tag(float value);
+%ignore PacBio::BAM::Tag::Tag(const std::string& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<int8_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<uint8_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<int16_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<uint16_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<int32_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<uint32_t>& value);
+%ignore PacBio::BAM::Tag::Tag(const std::vector<float>& value);
+
+%extend PacBio::BAM::Tag {
+	
+	PacBio::BAM::Tag FromInt8(int x)   { return PacBio::BAM::Tag(static_cast<int8_t>(x));   }
+	PacBio::BAM::Tag FromUInt8(int x)  { return PacBio::BAM::Tag(static_cast<uint8_t>(x));  }
+	PacBio::BAM::Tag FromInt16(int x)  { return PacBio::BAM::Tag(static_cast<int16_t>(x));  }
+	PacBio::BAM::Tag FromUInt16(int x) { return PacBio::BAM::Tag(static_cast<uint16_t>(x)); }
+	PacBio::BAM::Tag FromInt32(int x)  { return PacBio::BAM::Tag(static_cast<int32_t>(x));  }
+	PacBio::BAM::Tag FromUInt32(int x) { return PacBio::BAM::Tag(static_cast<uint32_t>(x)); }
+	PacBio::BAM::Tag FromFloat(int x)  { return PacBio::BAM::Tag(static_cast<float>(x));    }
+	
+	PacBio::BAM::Tag FromInt8Array(const std::vector<int>& v)
+	{
+		std::vector<int8_t> result;
+		const size_t numElements = v.size();
+		result.reserve(numElements);
+		for (size_t i = 0; i < numElements; ++i) 
+			result.push_back(static_cast<int8_t>(v.at(i)));
+		return PacBio::BAM::Tag(result); 
+	}
+	
+	PacBio::BAM::Tag FromUInt8Array(const std::vector<int>& v)
+	{
+		std::vector<uint8_t> result;
+		const size_t numElements = v.size();
+		result.reserve(numElements);
+		for (size_t i = 0; i < numElements; ++i) 
+			result.push_back(static_cast<uint8_t>(v.at(i)));
+		return PacBio::BAM::Tag(result); 
+	}
+	
+	PacBio::BAM::Tag FromInt16Array(const std::vector<int>& v)
+	{
+		std::vector<int16_t> result;
+		const size_t numElements = v.size();
+		result.reserve(numElements);
+		for (size_t i = 0; i < numElements; ++i) 
+			result.push_back(static_cast<int16_t>(v.at(i)));
+		return PacBio::BAM::Tag(result); 
+	}
+	
+	PacBio::BAM::Tag FromUInt16Array(const std::vector<int>& v)
+	{
+		std::vector<int16_t> result;
+		const size_t numElements = v.size();
+		result.reserve(numElements);
+		for (size_t i = 0; i < numElements; ++i) 
+			result.push_back(static_cast<uint16_t>(v.at(i)));
+		return PacBio::BAM::Tag(result); 
+	}
+	
+	PacBio::BAM::Tag FromInt32Array(const std::vector<int>& v)
+	{
+		std::vector<int16_t> result;
+		const size_t numElements = v.size();
+		result.reserve(numElements);
+		for (size_t i = 0; i < numElements; ++i) 
+			result.push_back(static_cast<int32_t>(v.at(i)));
+		return PacBio::BAM::Tag(result); 
+	}
+	
+	PacBio::BAM::Tag FromUInt32Array(const std::vector<int>& v)
+	{
+		std::vector<int16_t> result;
+		const size_t numElements = v.size();
+		result.reserve(numElements);
+		for (size_t i = 0; i < numElements; ++i) 
+			result.push_back(static_cast<uint32_t>(v.at(i)));
+		return PacBio::BAM::Tag(result); 
+	}
+	
+	PacBio::BAM::Tag FromFloatArray(const std::vector<int>& v)
+	{
+		std::vector<int16_t> result;
+		const size_t numElements = v.size();
+		result.reserve(numElements);
+		for (size_t i = 0; i < numElements; ++i) 
+			result.push_back(static_cast<float>(v.at(i)));
+		return PacBio::BAM::Tag(result); 
+	}
+}
+#endif // SWIGR
+
+%include <pbbam/Tag.h>
\ No newline at end of file
diff --git a/src/swig/TagCollection.i b/src/swig/TagCollection.i
new file mode 100644
index 0000000..bcfc707
--- /dev/null
+++ b/src/swig/TagCollection.i
@@ -0,0 +1,13 @@
+/* TagCollection.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/TagCollection.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%template(TagCollectionType) std::map<std::string, PacBio::BAM::Tag>;
+
+%include <pbbam/TagCollection.h>
\ No newline at end of file
diff --git a/src/swig/WrapCSharp.cmake b/src/swig/WrapCSharp.cmake
new file mode 100644
index 0000000..a6eee7f
--- /dev/null
+++ b/src/swig/WrapCSharp.cmake
@@ -0,0 +1,46 @@
+
+find_package(CSharp REQUIRED)
+include (${CSHARP_USE_FILE})
+
+set(PacBioBAM_CSharpLibDir  ${PacBioBAM_LibDir}/csharp/PacBio.BAM)
+set(PacBioBAM_CSharpDLL     ${PacBioBAM_CSharpLibDir}/bin/Debug/PacBio.BAM.dll)
+set(CSharpTestRootDir       ${PacBioBAM_TestsDir}/src/CSharp)
+set(NativeLibraryPaths      ${PacBioBAM_CSharpLibDir}:${PacBioBAM_LibDir}:${Htslib_LibDir})
+
+#
+# Create SWIG wrapper
+#
+file(MAKE_DIRECTORY ${PacBioBAM_CSharpLibDir})
+set(CMAKE_SWIG_OUTDIR ${PacBioBAM_CSharpLibDir})   # ensure any swig files in lib/csharp
+set_source_files_properties(
+  PacBioBam.i PROPERTIES
+  CPLUSPLUS ON
+  SWIG_FLAGS "-namespace;PacBio.BAM")
+swig_add_module(PacBioBam csharp PacBioBam.i)
+swig_link_libraries(PacBioBam ${PacBioBAM_LIBRARIES}) # add any C# libs you need from <Find|Use>CSharp.cmake
+set_target_properties(
+    ${SWIG_MODULE_PacBioBam_REAL_NAME}            # ensure wrapper lib in lib/csharp
+    PROPERTIES
+    LIBRARY_OUTPUT_DIRECTORY ${PacBioBAM_CSharpLibDir}
+)
+add_dependencies(${SWIG_MODULE_PacBioBam_REAL_NAME} pbbam)
+
+#
+# Write a csproj, then shell out to build and check the assembly---
+# can't get it working nicely in CMake yet
+#
+configure_file(
+   ${PacBioBAM_SwigSourceDir}/PacBio.BAM.csproj.in
+   ${PacBioBAM_CSharpLibDir}/PacBio.BAM.csproj)
+configure_file(
+  ${CSharpTestRootDir}/TestPbbam.cs.in
+  ${CSharpTestRootDir}/TestPbbam.cs)
+configure_file(
+   ${CSharpTestRootDir}/buildAssembly.sh.in
+   buildAssembly.sh)
+add_custom_command(
+  OUTPUT ${PacBioBAM_CSharpDLL}
+  DEPENDS ${SWIG_MODULE_PacBioBam_REAL_NAME}
+  COMMAND bash ./buildAssembly.sh
+)
+add_custom_target(CSharpAssembly ALL DEPENDS ${PacBioBAM_CSharpDLL})
diff --git a/src/swig/WrapPython.cmake b/src/swig/WrapPython.cmake
new file mode 100644
index 0000000..839d7a5
--- /dev/null
+++ b/src/swig/WrapPython.cmake
@@ -0,0 +1,54 @@
+
+# setup
+find_package(PythonLibs REQUIRED)
+include_directories(${PYTHON_INCLUDE_PATH})
+set(PacBioBAM_PythonLibDir ${PacBioBAM_LibDir}/python)
+set(PythonTestRootDir ${PacBioBAM_TestsDir}/src/python)
+
+# create wrapper
+file(MAKE_DIRECTORY ${PacBioBAM_PythonLibDir})
+set(CMAKE_SWIG_OUTDIR ${PacBioBAM_PythonLibDir})  # put PacBioBam.py in lib/python
+
+swig_add_module(PacBioBam python PacBioBam.i)
+swig_link_libraries(PacBioBam ${PacBioBAM_LIBRARIES} ${PYTHON_LIBRARIES})
+set_target_properties(
+    ${SWIG_MODULE_PacBioBam_REAL_NAME}            # put _PacBioBam.so in lib/python
+    PROPERTIES
+    LIBRARY_OUTPUT_DIRECTORY ${PacBioBAM_PythonLibDir}
+)
+add_dependencies(${SWIG_MODULE_PacBioBam_REAL_NAME} pbbam)
+
+# simple "wrapper worked" check
+# this is run every build, to check importing from Python, but does NOT run full Python-side unit tests
+add_custom_target(
+    check_swig_python
+    ALL
+    "PYTHONPATH=${PacBioBAM_PythonLibDir}" python check_swig.py
+    COMMENT "Checking Python wrapper"
+    WORKING_DIRECTORY ${PythonTestRootDir}
+)
+add_dependencies(check_swig_python ${SWIG_MODULE_PacBioBam_REAL_NAME})
+
+# unit tests
+if(PacBioBAM_build_tests)
+
+    # configure data directory info
+    configure_file(
+        ${PythonTestRootDir}/test/config.py.in
+        ${PythonTestRootDir}/test/config.py
+    )
+
+    # test runner
+    add_test(
+        NAME PythonUnitTests
+        WORKING_DIRECTORY ${PythonTestRootDir}
+        COMMAND "python" test_pbbam.py
+    )
+    set_tests_properties(
+        PythonUnitTests
+        PROPERTIES
+        ENVIRONMENT "PYTHONPATH=${PacBioBAM_PythonLibDir}"
+    )
+
+endif() # unit tests
+
diff --git a/src/swig/WrapR.cmake b/src/swig/WrapR.cmake
new file mode 100644
index 0000000..5dccedd
--- /dev/null
+++ b/src/swig/WrapR.cmake
@@ -0,0 +1,71 @@
+# setup
+set(R_INCLUDE_DIR_HINT /mnt/software/r/R/3.1.1/usr/share/R/include) # TODO: hard-coded hint for now, clean up later
+find_package(R REQUIRED)
+include_directories(${R_INCLUDE_DIR})
+set(PacBioBAM_RLibDir ${PacBioBAM_LibDir}/R)
+set(RTestRootDir ${PacBioBAM_TestsDir}/src/R)
+
+# Suppress warnings from generated code
+include(CheckCXXCompilerFlag)
+check_cxx_compiler_flag("-Wno-unused-parameter" HAS_NO_UNUSED_PARAMETER)
+if(HAS_NO_UNUSED_PARAMETER)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter")
+endif()
+
+# SWIG R does not support PBBAM_SHARED_PTR, but it does support boost::shared_ptr
+# So force boost if we're wrapping for R.
+add_definitions(-DPBBAM_USE_BOOST_SHARED_PTR)
+
+# create wrapper & library
+file(MAKE_DIRECTORY ${PacBioBAM_RLibDir})
+set(CMAKE_SWIG_OUTDIR ${PacBioBAM_RLibDir})      # put PacBioBam.R wrapper in lib/R
+swig_add_module(PacBioBam r PacBioBam.i)
+swig_link_libraries(PacBioBam ${PacBioBAM_LIBRARIES})
+if(R_LIBRARIES)
+    swig_link_libraries(PacBioBam ${R_LIBRARIES})
+endif()
+
+# make sure the library is named "PacBioBam.so" explicitly
+# no "lib" prefix... that gets in the way of the name lookups between SWIG/R
+# and make sure library ends up in lib/R
+set_target_properties(
+    ${SWIG_MODULE_PacBioBam_REAL_NAME}
+    PROPERTIES
+    LIBRARY_OUTPUT_DIRECTORY ${PacBioBAM_RLibDir}
+    RUNTIME_OUTPUT_DIRECTORY ${PacBioBAM_RLibDir}
+    SONAME PacBioBam.so
+    PREFIX ""
+)
+add_dependencies(${SWIG_MODULE_PacBioBam_REAL_NAME} pbbam)
+
+# simple "wrapper worked" check
+configure_file(
+    ${RTestRootDir}/check_swig.R.in
+    ${RTestRootDir}/check_swig.R
+)
+
+add_custom_target(
+    check_swig_R
+    ALL
+    "R" --slave --no-save < ${RTestRootDir}/check_swig.R
+    COMMENT "Checking R wrapper"
+    WORKING_DIRECTORY ${PacBioBAM_RLibDir}
+)
+add_dependencies(check_swig_R ${SWIG_MODULE_PacBioBam_REAL_NAME})
+
+# unit tests
+if(PacBioBAM_build_tests)
+
+    # configure script
+    configure_file(
+        ${RTestRootDir}/test_pbbam.sh.in
+        ${RTestRootDir}/test_pbbam.sh
+    )
+
+    # test runner
+    add_test(
+        NAME RUnitTests
+        COMMAND "sh" ${RTestRootDir}/test_pbbam.sh
+        WORKING_DIRECTORY ${PacBioBAM_RLibDir}
+    )
+endif()
diff --git a/src/swig/ZmwGroupQuery.i b/src/swig/ZmwGroupQuery.i
new file mode 100644
index 0000000..c020eb5
--- /dev/null
+++ b/src/swig/ZmwGroupQuery.i
@@ -0,0 +1,14 @@
+/* ZmwGroupQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/internal/QueryBase.h>
+#include <pbbam/ZmwGroupQuery.h>
+	
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/internal/QueryBase.h>
+%include <pbbam/ZmwGroupQuery.h>
diff --git a/src/swig/ZmwQuery.i b/src/swig/ZmwQuery.i
new file mode 100644
index 0000000..8ad33d7
--- /dev/null
+++ b/src/swig/ZmwQuery.i
@@ -0,0 +1,11 @@
+/* ZmwQuery.i */
+
+%module PacBioBam
+
+%{
+#include <pbbam/ZmwQuery.h>	
+using namespace PacBio;
+using namespace PacBio::BAM;
+%}
+
+%include <pbbam/ZmwQuery.h>
\ No newline at end of file
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000..38dfe39
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,66 @@
+find_package(Threads REQUIRED)
+
+# find samtools binary for comparing against 'gold standard' files
+#set(Samtools_Dir "/Users/derek/development/samtools")
+set(Samtools_Dir "${PacBioBAM_RootDir}/../../../../prebuilt.out/samtools/samtools-0.1.19/ubuntu-1404/bin")
+find_program(Samtools_Bin samtools HINTS ${Samtools_Dir})
+
+# ensure tests directory exists
+file(MAKE_DIRECTORY ${PacBioBAM_TestsDir}/bin)
+file(MAKE_DIRECTORY ${PacBioBAM_TestsDir}/data/temp)
+
+# generate paths/values used by for test
+configure_file(
+    ${PacBioBAM_TestsDir}/src/TestData.h.in
+    ${PacBioBAM_TestsDir}/src/TestData.h
+)
+configure_file(
+    ${PacBioBAM_TestsDir}/data/test_group_query/group.fofn.in
+    ${PacBioBAM_TestsDir}/data/test_group_query/group.fofn
+)
+
+# add PacBioBAM & GoogleTest includes
+include_directories(
+    ${PacBioBAM_INCLUDE_DIRS}
+    ${gtest_SOURCE_DIR}/include 
+    ${gtest_SOURCE_DIR}
+)
+
+# grab PacBioBAM test source files
+include(files.cmake)
+set(SOURCES
+    ${PacBioBAMTest_H}
+    ${PacBioBAMTest_CPP}
+)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PacBioBAM_CXX_FLAGS}")
+
+# define test executable
+add_definitions(-DPBBAM_TESTING)
+if(MSVC)
+    # VS2012+ pooh-pooh's Derek's "#define private public" trick
+    add_definitions(-D_ALLOW_KEYWORD_MACROS)
+endif()
+
+if(PacBioBAM_wrap_r)
+    # SWIG R does not support PBBAM_SHARED_PTR, but it does support boost::shared_ptr
+    # So force boost if we're wrapping for R.
+    add_definitions(-DPBBAM_USE_BOOST_SHARED_PTR)
+endif()
+add_executable(test_pbbam ${SOURCES})
+set_target_properties(test_pbbam PROPERTIES
+    RUNTIME_OUTPUT_DIRECTORY ${PacBioBAM_TestsDir}/bin
+)
+
+# set up unit test to run our executable
+add_test(
+    NAME UnitTests
+    WORKING_DIRECTORY ${PacBioBAM_TestsDir}/bin
+    COMMAND test_pbbam
+)
+add_dependencies(test_pbbam pbbam)
+target_link_libraries(test_pbbam
+    ${PacBioBAM_LIBRARIES}
+    ${CMAKE_THREAD_LIBS_INIT} # quirky pthreads 
+    gtest
+    gtest_main
+)
diff --git a/tests/data/aligned.bam b/tests/data/aligned.bam
new file mode 100644
index 0000000..158fa2a
Binary files /dev/null and b/tests/data/aligned.bam differ
diff --git a/tests/data/dataset/ali1.xml b/tests/data/dataset/ali1.xml
new file mode 100644
index 0000000..015068e
--- /dev/null
+++ b/tests/data/dataset/ali1.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:AlignmentSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.AlignmentSet" Name="DataSet_AlignmentSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+	<pbbase:ExternalResources>
+		<pbbase:ExternalResource Name="First Alignments BAM" Description="Points to an example Alignments BAM file." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:///mnt/path/to/alignments0.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments0.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+		<pbbase:ExternalResource Name="Second Alignments BAM" Description="Points to another example Alignments BAM file, by relative path." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:./alignments1.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments1.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+	</pbbase:ExternalResources>
+	<pbds:DataSets>
+		<pbds:DataSet UniqueId="ab95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="HighQuality Read Alignments">
+			<pbds:Filters> <!-- These Filters are in addition to those above. This provides a means to subset and label the parent DataSet further. -->
+				<pbds:Filter>
+                    <pbbase:Properties>
+                        <pbbase:Property Name="rq" Value="0.85" Operator=">"/>
+                    </pbbase:Properties>
+                </pbds:Filter>
+			</pbds:Filters>
+		</pbds:DataSet>
+		<pbds:DataSet UniqueId="ac95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="Alignments to chromosome 1">
+			<pbds:Filters>
+				<pbds:Filter>
+                    <pbbase:Properties>
+                        <pbbase:Property Name="RNAME" Value="chr1" Operator="=="/>
+                    </pbbase:Properties>
+                </pbds:Filter>
+			</pbds:Filters>
+		</pbds:DataSet>
+	</pbds:DataSets>
+</pbds:AlignmentSet>
diff --git a/tests/data/dataset/ali2.xml b/tests/data/dataset/ali2.xml
new file mode 100644
index 0000000..f71e2d2
--- /dev/null
+++ b/tests/data/dataset/ali2.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:AlignmentSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.AlignmentSet" Name="DataSet_AlignmentSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+	<pbbase:ExternalResources>
+		<pbbase:ExternalResource Name="First Alignments BAM" Description="Points to an example Alignments BAM file." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:///mnt/path/to/alignments2.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments2.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+		<pbbase:ExternalResource Name="Second Alignments BAM" Description="Points to another example Alignments BAM file, by relative path." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:./alignments3.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments3.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+	</pbbase:ExternalResources>
+	<pbds:DataSets>
+		<pbds:DataSet UniqueId="ab95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="HighQuality Read Alignments">
+			<pbds:Filters> <!-- These Filters are in addition to those above. This provides a means to subset and label the parent DataSet further. -->
+				<pbds:Filter>
+                    <pbbase:Properties>
+                        <pbbase:Property Name="rq" Value="0.85" Operator=">"/>
+                    </pbbase:Properties>
+                </pbds:Filter>
+			</pbds:Filters>
+		</pbds:DataSet>
+		<pbds:DataSet UniqueId="ac95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="Alignments to chromosome 1">
+			<pbds:Filters>
+				<pbds:Filter>
+                    <pbbase:Properties>
+                        <pbbase:Property Name="RNAME" Value="chr1" Operator="=="/>
+                    </pbbase:Properties>
+                </pbds:Filter>
+			</pbds:Filters>
+		</pbds:DataSet>
+	</pbds:DataSets>
+</pbds:AlignmentSet>
diff --git a/tests/data/dataset/ali3.xml b/tests/data/dataset/ali3.xml
new file mode 100644
index 0000000..d0dc0d6
--- /dev/null
+++ b/tests/data/dataset/ali3.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:AlignmentSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.AlignmentSet" Name="DataSet_AlignmentSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+	<pbbase:ExternalResources>
+		<pbbase:ExternalResource Name="First Alignments BAM" Description="Points to an example Alignments BAM file." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:///mnt/path/to/alignments2.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments2.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+		<pbbase:ExternalResource Name="Second Alignments BAM" Description="Points to another example Alignments BAM file, by relative path." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:./alignments3.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments3.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+	</pbbase:ExternalResources>
+	<pbds:DataSets>
+		<pbds:DataSet UniqueId="ab95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="HighQuality Read Alignments">
+			<pbds:Filters> <!-- These Filters are in addition to those above. This provides a means to subset and label the parent DataSet further. -->
+				<pbds:Filter>
+                    <pbbase:Properties>
+                        <pbbase:Property Name="rq" Value="0.75" Operator=">"/>
+                    </pbbase:Properties>
+                </pbds:Filter>
+			</pbds:Filters>
+		</pbds:DataSet>
+		<pbds:DataSet UniqueId="ac95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="Alignments to chromosome 1">
+			<pbds:Filters>
+				<pbds:Filter>
+                    <pbbase:Properties>
+                        <pbbase:Property Name="RNAME" Value="chr1" Operator="=="/>
+                    </pbbase:Properties>
+                </pbds:Filter>
+			</pbds:Filters>
+		</pbds:DataSet>
+	</pbds:DataSets>
+</pbds:AlignmentSet>
diff --git a/tests/data/dataset/ali4.xml b/tests/data/dataset/ali4.xml
new file mode 100644
index 0000000..015068e
--- /dev/null
+++ b/tests/data/dataset/ali4.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:AlignmentSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.AlignmentSet" Name="DataSet_AlignmentSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+	<pbbase:ExternalResources>
+		<pbbase:ExternalResource Name="First Alignments BAM" Description="Points to an example Alignments BAM file." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:///mnt/path/to/alignments0.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments0.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+		<pbbase:ExternalResource Name="Second Alignments BAM" Description="Points to another example Alignments BAM file, by relative path." MetaType="AlignmentFile.AlignmentBamFile" ResourceId="file:./alignments1.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:///mnt/path/to/alignments1.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+	</pbbase:ExternalResources>
+	<pbds:DataSets>
+		<pbds:DataSet UniqueId="ab95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="HighQuality Read Alignments">
+			<pbds:Filters> <!-- These Filters are in addition to those above. This provides a means to subset and label the parent DataSet further. -->
+				<pbds:Filter>
+                    <pbbase:Properties>
+                        <pbbase:Property Name="rq" Value="0.85" Operator=">"/>
+                    </pbbase:Properties>
+                </pbds:Filter>
+			</pbds:Filters>
+		</pbds:DataSet>
+		<pbds:DataSet UniqueId="ac95d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" Name="Alignments to chromosome 1">
+			<pbds:Filters>
+				<pbds:Filter>
+                    <pbbase:Properties>
+                        <pbbase:Property Name="RNAME" Value="chr1" Operator="=="/>
+                    </pbbase:Properties>
+                </pbds:Filter>
+			</pbds:Filters>
+		</pbds:DataSet>
+	</pbds:DataSets>
+</pbds:AlignmentSet>
diff --git a/tests/data/dataset/bam_mapping.bam b/tests/data/dataset/bam_mapping.bam
new file mode 100644
index 0000000..00637b9
Binary files /dev/null and b/tests/data/dataset/bam_mapping.bam differ
diff --git a/tests/data/dataset/bam_mapping.bam.bai b/tests/data/dataset/bam_mapping.bam.bai
new file mode 100644
index 0000000..a185e97
Binary files /dev/null and b/tests/data/dataset/bam_mapping.bam.bai differ
diff --git a/tests/data/dataset/bam_mapping.bam.pbi b/tests/data/dataset/bam_mapping.bam.pbi
new file mode 100644
index 0000000..8ad2fd5
Binary files /dev/null and b/tests/data/dataset/bam_mapping.bam.pbi differ
diff --git a/tests/data/dataset/bam_mapping_1.bam b/tests/data/dataset/bam_mapping_1.bam
new file mode 100644
index 0000000..9644940
Binary files /dev/null and b/tests/data/dataset/bam_mapping_1.bam differ
diff --git a/tests/data/dataset/bam_mapping_1.bam.bai b/tests/data/dataset/bam_mapping_1.bam.bai
new file mode 100644
index 0000000..d3d7d59
Binary files /dev/null and b/tests/data/dataset/bam_mapping_1.bam.bai differ
diff --git a/tests/data/dataset/bam_mapping_1.bam.pbi b/tests/data/dataset/bam_mapping_1.bam.pbi
new file mode 100644
index 0000000..11e85a0
Binary files /dev/null and b/tests/data/dataset/bam_mapping_1.bam.pbi differ
diff --git a/tests/data/dataset/bam_mapping_2.bam b/tests/data/dataset/bam_mapping_2.bam
new file mode 100644
index 0000000..419701d
Binary files /dev/null and b/tests/data/dataset/bam_mapping_2.bam differ
diff --git a/tests/data/dataset/bam_mapping_2.bam.bai b/tests/data/dataset/bam_mapping_2.bam.bai
new file mode 100644
index 0000000..32bfe5b
Binary files /dev/null and b/tests/data/dataset/bam_mapping_2.bam.bai differ
diff --git a/tests/data/dataset/bam_mapping_2.bam.pbi b/tests/data/dataset/bam_mapping_2.bam.pbi
new file mode 100644
index 0000000..9c46e0e
Binary files /dev/null and b/tests/data/dataset/bam_mapping_2.bam.pbi differ
diff --git a/tests/data/dataset/bam_mapping_staggered.xml b/tests/data/dataset/bam_mapping_staggered.xml
new file mode 100644
index 0000000..51a8b71
--- /dev/null
+++ b/tests/data/dataset/bam_mapping_staggered.xml
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<pbds:DataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" CreatedAt="2015-05-13T10:58:26" MetaType="PacBio.DataSet.DataSet" Name="" Tags="" UniqueId="30f72098-bc5b-e06b-566c-8b28dda909a8" Version="2.3.0" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+    <pbbase:ExternalResources>
+        <pbbase:ExternalResource ResourceId="file:tests/data/bam_mapping_1.bam">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:tests/data/bam_mapping_1.bam.bai"/>
+			</pbbase:FileIndices>
+        </pbbase:ExternalResource>
+        <pbbase:ExternalResource ResourceId="file:tests/data/bam_mapping_2.bam">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex ResourceId="file:tests/data/bam_mapping_2.bam.bai"/>
+			</pbbase:FileIndices>
+        </pbbase:ExternalResource>
+    </pbbase:ExternalResources>
+    <pbds:DataSets>
+        <pbds:DataSet CreatedAt="2015-05-13T10:58:26" UniqueId="c5402d06-4643-057c-e300-fe229b4e8909" Version="2.3.0" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+            <pbbase:ExternalResources>
+                <pbbase:ExternalResource ResourceId="file:tests/data/bam_mapping_2.bam">
+			        <pbbase:FileIndices>
+				        <pbbase:FileIndex ResourceId="file:tests/data/bam_mapping_2.bam.bai"/>
+			        </pbbase:FileIndices>
+                </pbbase:ExternalResource>
+            </pbbase:ExternalResources>
+        </pbds:DataSet>
+        <pbds:DataSet CreatedAt="2015-05-13T10:58:26" UniqueId="f8b54a55-5fb7-706f-ab35-39afc9c86924" Version="2.3.0" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+            <pbbase:ExternalResources>
+                <pbbase:ExternalResource ResourceId="file:tests/data/bam_mapping_1.bam">
+			        <pbbase:FileIndices>
+				        <pbbase:FileIndex ResourceId="file:tests/data/bam_mapping_1.bam.bai"/>
+			        </pbbase:FileIndices>
+                </pbbase:ExternalResource>
+            </pbbase:ExternalResources>
+        </pbds:DataSet>
+    </pbds:DataSets>
+</pbds:DataSet>
diff --git a/tests/data/dataset/barcode.dataset.xml b/tests/data/dataset/barcode.dataset.xml
new file mode 100644
index 0000000..3613e20
--- /dev/null
+++ b/tests/data/dataset/barcode.dataset.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:BarcodeSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.BarcodeSet" Name="DataSet_BarcodeSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+	<pbbase:ExternalResources>
+		<pbbase:ExternalResource Name="First Barcodes FASTA" Description="Points to an example Barcodes FASTA file." MetaType="BarcodeFile.BarcodeFastaFile" ResourceId="file:///mnt/path/to/barcode.fasta" Tags="Example"/>
+	</pbbase:ExternalResources>
+	<pbds:DataSetMetadata>
+		<pbds:TotalLength>400</pbds:TotalLength>
+		<pbds:NumRecords>30</pbds:NumRecords>
+		<pbsec:BarcodeConstruction>paired</pbsec:BarcodeConstruction>
+	</pbds:DataSetMetadata>
+</pbds:BarcodeSet>
diff --git a/tests/data/dataset/ccsread.dataset.xml b/tests/data/dataset/ccsread.dataset.xml
new file mode 100644
index 0000000..9baafab
--- /dev/null
+++ b/tests/data/dataset/ccsread.dataset.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:ConsensusReadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.ConsensusReadSet" Name="DataSet_ConsensusReadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+	<pbbase:ExternalResources>
+		<pbbase:ExternalResource Name="First ConsensusRead BAM" Description="Points to an example ConsensusRead BAM file." MetaType="PacBio.ConsensusReadFile.ConsensusReadBamFile" ResourceId="file:///mnt/path/to/ccsreads0.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex MetaType="PacBio.Index.PacBioIndex" ResourceId="file:///mnt/path/to/ccsreads0.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+		<pbbase:ExternalResource Name="Second ConsensusRead BAM" Description="Points to another example ConsensusRead BAM file." MetaType="PacBio.ConsensusReadFile.ConsensusReadBamFile" ResourceId="file:///mnt/path/to/ccsreads1.bam" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex MetaType="PacBio.Index.PacBioIndex" ResourceId="file:///mnt/path/to/ccsreads0.pbi"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+	</pbbase:ExternalResources>
+</pbds:ConsensusReadSet>
diff --git a/tests/data/dataset/contig.dataset.xml b/tests/data/dataset/contig.dataset.xml
new file mode 100644
index 0000000..77d7c4e
--- /dev/null
+++ b/tests/data/dataset/contig.dataset.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:ContigSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.ContigSet" Name="DataSet_ContigSet" Tags="AHAcontigs" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+	<pbbase:ExternalResources>
+		<pbbase:ExternalResource Name="First References FASTA" Description="Points to an example references FASTA file." MetaType="PacBio.ReferenceFile.ReferenceFastaFile" ResourceId="file:///mnt/path/to/reference.fasta" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex MetaType="PacBio.Index.SaWriterIndex" ResourceId="file:///mnt/path/to/reference.fasta.sa"/>
+				<pbbase:FileIndex MetaType="PacBio.Index.SamIndex" ResourceId="file:///mnt/path/to/reference.fasta.fai"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+	</pbbase:ExternalResources>
+	<pbds:DataSetMetadata>
+		<pbds:TotalLength>5000000</pbds:TotalLength>
+		<pbds:NumRecords>500</pbds:NumRecords>
+		<pbsec:Contigs>
+			<pbsec:Contig Name="gi|229359445|emb|AM181176.4|" Description="Pseudomonas fluorescens SBW25 complete genome|quiver" Length="6722109" Digest="f627c795efad7ce0050ed42b942d408e"/>
+		</pbsec:Contigs>
+	</pbds:DataSetMetadata>
+</pbds:ContigSet>
diff --git a/tests/data/dataset/fofn.fofn b/tests/data/dataset/fofn.fofn
new file mode 100644
index 0000000..71126cc
--- /dev/null
+++ b/tests/data/dataset/fofn.fofn
@@ -0,0 +1,3 @@
+ali1.xml
+ali2.xml
+bam_mapping.bam
diff --git a/tests/data/dataset/hdfsubread_dataset.xml b/tests/data/dataset/hdfsubread_dataset.xml
new file mode 100644
index 0000000..8a0e0e2
--- /dev/null
+++ b/tests/data/dataset/hdfsubread_dataset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:HdfSubreadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.HdfSubreadSet" Name="DataSet_HdfSubreadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+	<pbbase:ExternalResourcess>
+        <pbbase:ExternalResource Name="First Subreads BAM" Description="Points to an example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads0.bam" Tags="Example">
+            <pbbase:FileIndices>
+                <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads0.pbi"/>
+            </pbbase:FileIndices>
+		</pbbase:ExternalResource>
+        <pbbase:ExternalResource Name="Second Subreads BAM" Description="Points to another example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads1.bam" Tags="Example">
+            <pbbase:FileIndices>
+                <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads1.pbi"/>
+            </pbbase:FileIndices>
+		</pbbase:ExternalResource>
+	</pbbase:ExternalResourcess>
+	<pbds:Filters>
+		<pbds:Filter>
+            <pbbase:Properties>
+                <pbbase:Property Name="rq" Value="0.75" Operator=">" />
+            </pbbase:Properties>
+        </pbds:Filter>
+		<pbds:Filter>
+            <pbbase:Properties>
+                <pbbase:Property Name="QNAME" Value="100/0/0_100" Operator="=" />
+            </pbbase:Properties>
+		</pbds:Filter>
+	</pbds:Filters>
+	<pbds:DataSetMetadata>
+		<pbds:TotalLength>500000</pbds:TotalLength>
+		<pbds:NumRecords>500</pbds:NumRecords>
+		<pbmeta:Collections>
+			<pbmeta:CollectionMetadata Context="m152720_092723_00114_c100480560100000001823075906281381_s1_p0" InstrumentName="RS2" InstrumentId="43210">
+				<pbmeta:InstCtrlVer>2.3.0.0.140640</pbmeta:InstCtrlVer>
+				<pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2300.140640, HwVer=1.0</pbmeta:SigProcVer>
+				<pbmeta:RunDetails>
+					<pbmeta:RunId>e903682f-e502-465c-a2b6-9dd77c9f43fc</pbmeta:RunId>
+					<pbmeta:Name>beta4_130726_biotin_DEV_vs_MFG_PB11K_9458p</pbmeta:Name>
+				</pbmeta:RunDetails>
+				<pbmeta:WellSample Name="Well Sample 1" UniqueId="aaa2df90-d44f-4a48-9f35-3b99473c68f5">
+					<pbmeta:PlateId>2014-12-24_141_NGAT_Igor_bisPNA Enrichment_Mag Bead Elution Buffers</pbmeta:PlateId>
+					<pbmeta:WellName>B01</pbmeta:WellName>
+					<pbmeta:Concentration>10</pbmeta:Concentration>
+					<pbmeta:SampleReuseEnabled>true</pbmeta:SampleReuseEnabled>
+					<pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+					<pbmeta:SizeSelectionEnabled>true</pbmeta:SizeSelectionEnabled>
+					<pbmeta:UseCount>0</pbmeta:UseCount>
+					<pbmeta:Comments>Lorem ipsum</pbmeta:Comments>
+					<pbsample:BioSamplePointers>
+						<pbsample:BioSamplePointer>abc2df90-d44f-4a48-9f35-3b99473c68f5</pbsample:BioSamplePointer>
+					</pbsample:BioSamplePointers>
+				</pbmeta:WellSample>
+				<pbmeta:AutomationName>POC Protocol</pbmeta:AutomationName>
+				<pbmeta:CollectionNumber>0</pbmeta:CollectionNumber>
+				<pbmeta:CellIndex>0</pbmeta:CellIndex>
+				<pbmeta:CellPac Barcode="100480560100000001823075906281381"/>
+				<pbmeta:Primary>
+					<pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+					<pbmeta:ConfigFileName>1-3-0_Standard_C2.xml</pbmeta:ConfigFileName>
+					<pbmeta:SequencingCondition/>
+					<pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+					<pbmeta:CollectionPathUri>rsy://mp-rsync/vol56//RS_DATA_STAGING//2014-12-24_141_NGAT_Igor_bisPNA%20Enrichment_Mag%20Bead%20Elution%20Buffers_1094/B01_1</pbmeta:CollectionPathUri>
+					<pbmeta:CopyFiles>
+						<pbmeta:CollectionFileCopy>Fasta</pbmeta:CollectionFileCopy>
+					</pbmeta:CopyFiles>
+				</pbmeta:Primary>
+			</pbmeta:CollectionMetadata>
+		</pbmeta:Collections>
+		<pbsample:BioSamples>
+			<pbsample:BioSample UniqueId="abc2df90-d44f-4a48-9f35-3b99473c68f5" Name="consectetur purus" Description="Risus sit amet lectus vehicula vulputate quisque porta accumsan venenatis." CreatedAt="2015-01-20T13:27:23.9271737-08:00"/>
+		</pbsample:BioSamples>
+	</pbds:DataSetMetadata>
+</pbds:HdfSubreadSet>
+<!-- TODO what do internal references look like?-->
diff --git a/tests/data/dataset/lambda_contigs.fasta b/tests/data/dataset/lambda_contigs.fasta
new file mode 100644
index 0000000..509d085
--- /dev/null
+++ b/tests/data/dataset/lambda_contigs.fasta
@@ -0,0 +1,156 @@
+>lambda_NEB3011_contig_1
+GGGCGGCGACCTCGCGGGTTTTCGCTATTTATGAAAATTTTCCGGTTTAAGGCGTTTCCG
+TTCTTCTTCGTCATAACTTAATGTTTTTATTTAAAATACCCTCTGAAAAGAAAGGAAACG
+ACAGGTGCTGAAAGCGAGCTTTTTGGCCTCTGTCGTTTCCTTTCTCTGTTTTTGTCCGTG
+GAATGAACAATGGAAGTCAACAAAAAGCAGCTGGCTGACATTTTCGGTGCGAGTATCCGT
+ACCATTCAGAACTGGCAGGAACAGGGAATGCCCGTTCTGCGAGGCGGTGGCAAGGGTAAT
+GAGGTGCTTTATGACTCTGCCGCCGTCATAAAATGGTATGCCGAAAGGGATGCTGAAATT
+GAGAACGAAAAGCTGCGCCGGGAGGTTGAAGAACTGCGGCAGGCCAGCGAGGCAGATCTC
+CAGCCAGGAACTATTGAGTACGAACGCCATCGACTTACGCGTGCGCAGGCCGACGCACAG
+GAACTGAAGAATGCCAGAGACTCCGCTGAAGTGGTGGAAACCGCATTCTGTACTTTCGTG
+CTGTCGCGGATCGCAGGTGAAATTGCCAGTATTCTCGACGGGCTCCCCCTGTCGGTGCAG
+CGGCGTTTTCCGGAACTGGAAAACCGACATGTTGATTTCCTGAAACGGGATATCATCAAA
+GCCATGAACAAAGCAGCCGCGCTGGATGAACTGATACCGGGGTTGCTGAGTGAATATATC
+GAACAGTCAGGTTAACAGGCTGCGGCATTTTGTCCGCGCCGGGCTTCGCTCACTGTTCAG
+GCCGGAGCCACAGACCGCCGTTGAATGGGCGGATGCTAATTACTATCTCCCGAAAGAATC
+CGCATACCAGGAAGGGCGCTGGGAAACACTGCCCTTTCAGCGGGCCATCATGAATGCGAT
+GGGCAGCGACTACATCCGTGAGGTGAATGTGGTGAAGTCTGCCCGTGTCGGTTATTCCAA
+AATGCTGCTGGGTGTTTATGCCTACTTTATAGAGCATAAGCAGCGCAACACCCTTATCTG
+GTTGCCGACGGATGGTGATGCCGAGAACTTTATGAAAACCCACGTTGAGCCGACTATTCG
+TGATATTCCGTCGCTGCTGGCGCTGGCCCCGTGGTATGGCAAAAAGCACCGGGATAACAC
+GCTCACCATGAAGCGTTTCACTAATGGGCGTGGCTTCTGGTGCCTGGGCGGTAAAGCGGC
+AAAAAACTACCGTGAAAAGTCGGTGGATGTGGCGGGTTATGATGAACTTGCTGCTTTTGA
+TGATGATATTGAACAGGAAGGCTCTCCGACGTTCCTGGGTGACAAGCGTATTGAAGGCTC
+GGTCTGGCCAAAGTCCATCCGTGGCTCCACGCCAAAAGTGAGAGGCACCTGTCAGATTGA
+>lambda_NEB3011_contig_2
+GCGTGCAGCCAGTGAATCCCCGCATTTTATGCGTTTTCATGTTGCCTGCCCGCATTGCGG
+GGAGGAGCAGTATCTTAAATTTGGCGACAAAGAGACGCCGTTTGGCCTCAAATGGACGCC
+GGATGACCCCTCCAGCGTGTTTTATCTCTGCGAGCATAATGCCTGCGTCATCCGCCAGCA
+GGAGCTGGACTTTACTGATGCCCGTTATATCTGCGAAAAGACCGGGATCTGGACCCGTGA
+TGGCATTCTCTGGTTTTCGTCATCCGGTGAAGAGATTGAGCCACCTGACAGTGTGACCTT
+TCACATCTGGACAGCGTACAGCCCGTTCACCACCTGGGTGCAGATTGTCAAAGACTGGAT
+GAAAACGAAAGGGGATACGGGAAAACGTAAAACCTTCGTAAACACCACGCTCGGTGAGAC
+GTGGGAGGCGAAAATTGGCGAACGTCCGGATGCTGAAGTGATGGCAGAGCGGAAAGAGCA
+TTATTCAGCGCCCGTTCCTGACCGTGTGGCTTACCTGACCGCCGGTATCGACTCCCAGCT
+GGACCGCTACGAAATGCGCGTATGGGGATGGGGGCCGGGTGAGGAAAGCTGGCTGATTGA
+CCGGCAGATTATTATGGGCCGCCACGACGATGAACAGACGCTGCTGCGTGTGGATGAGGC
+CATCAATAAAACCTATACCCGCCGGAATGGTGCAGAAATGTCGATATCCCGTATCTGCTG
+GGATACTGGCGGGATTGACCCGACCATTGTGTATGAACGCTCGAAAAAACATGGGCTGTT
+CCGGGTGATCCCCATTAAAGGGGCATCCGTCTACGGAAAGCCGGTGGCCAGCATGCCACG
+TAAGCGAAACAAAAACGGGGTTTACCTTACCGAAATCGGTACGGATACCGCGAAAGAGCA
+GATTTATAACCGCTTCACACTGACGCCGGAAGGGGATGAACCGCTTCCCGGTGCCGTTCA
+CTTCCCGAATAACCCGGATATTTTTGATCTGACCGAAGCGCAGCAGCTGACTGCTGAAGA
+GCAGGTCGAAAAATGGGTGGATGGCAGGAAAAAAATACTGTGGGACAGCAAAAAGCGACG
+CAATGAGGCACTCGACTGCTTCGTTTATGCGCTGGCGGCGCTGCGCATCAGTATTTCCCG
+CTGGCAGCTGGATCTCAGTGCGCTGCTGGCGAGCCTGCAGGAAGAGGATGGTGCAGCAAC
+CAACAAGAAAACACTGGCAGATTACGCCCGTGCCTTATCCGGAGAGGATGAATGACGCGA
+CAGGAAGAACTTGCCGCTGCCCGTGCGGCACTGCATGACCTGATGACAGGTAAACGGGTG
+GCAACAGTACAGAAAGACGGACGAAGGGTGGAGTTTACGGCCACTTCCGTGTCTGACCTG
+AAAAAATATATTGCAGAGCTGGAAGTGCAGACCGGCATGACACAGCGACGCAGGGGACCT
+GCAGGATTTTATGTATGAAAACGCCCACCATTCCCACCCTTCTGGGGCCGGACGGCATGA
+CATCGCTGCGCGAATATGCCGGTTATCACGGCGGTGGCAGCGGATTTGGAGGGCAGTTGC
+GGTCGTGGAACCCACCGAGTGAAAGTGTGGATGCAGCCCTGTTGCCCAACTTTACCCGTG
+GCAATGCCCGCGCAGACGATCTGGTACGCAATAACGGCTATGCCGCCAACGCCATCCAGC
+TGCATCAGGATCATATCGTCGGGTCTTTTTTCCGGCTCAGTCATCGCCCAAGCTGGCGCT
+ATCTGGGCATCGGGGAGGAAGAAGCCCGTGCCTTTTCCCGCGAGGTTGAAGCGGCATGGA
+AAGAGTTTGCCGAGGATGACTGCTGCTGCATTGACGTTGAGCGAAAACGCACGTTTACCA
+TGATGATTCGGGAAGGTGTGGCCATGCACGCCTTTAACGGTGAACTGTTCGTTCAGGCCA
+>lambda_NEB3011_contig_3
+CCTGGGATACCAGTTCGTCGCGGCTTTTCCGGACACAGTTCCGGATGGTCAGCCCGAAGC
+GCATCAGCAACCCGAACAATACCGGCGACAGCCGGAACTGCCGTGCCGGTGTGCAGATTA
+ATGACAGCGGTGCGGCGCTGGGATATTACGTCAGCGAGGACGGGTATCCTGGCTGGATGC
+CGCAGAAATGGACATGGATACCCCGTGAGTTACCCGGCGGGCGCGCCTCGTTCATTCACG
+TTTTTGAACCCGTGGAGGACGGGCAGACTCGCGGTGCAAATGTGTTTTACAGCGTGATGG
+AGCAGATGAAGATGCTCGACACGCTGCAGAACACGCAGCTGCAGAGCGCCATTGTGAAGG
+CGATGTATGCCGCCACCATTGAGAGTGAGCTGGATACGCAGTCAGCGATGGATTTTATTC
+TGGGCGCGAACAGTCAGGAGCAGCGGGAAAGGCTGACCGGCTGGATTGGTGAAATTGCCG
+CGTATTACGCCGCAGCGCCGGTCCGGCTGGGAGGCGCAAAAGTACCGCACCTGATGCCGG
+GTGACTCACTGAACCTGCAGACGGCTCAGGATACGGATAACGGCTACTCCGTGTTTGAGC
+AGTCACTGCTGCGGTATATCGCTGCCGGGCTGGGTGTCTCGTATGAGCAGCTTTCCCGGA
+ATTACGCCCAGATGAGCTACTCCACGGCACGGGCCAGTGCGAACGAGTCGTGGGCGTACT
+TTATGGGGCGGCGAAAATTCGTCGCATCCCGTCAGGCGAGCCAGATGTTTCTGTGCTGGC
+TGGAAGAGGCCATCGTTCGCCGCGTGGTGACGTTACCTTCAAAAGCGCGCTTCAGTTTTC
+AGGAAGCCCGCAGTGCCTGGGGGAACTGCGACTGGATAGGCTCCGGTCGTATGGCCATCG
+ATGGTCTGAAAGAAGTTCAGGAAGCGGTGATGCTGATAGAAGCCGGACTGAGTACCTACG
+AGAAAGAGTGCGCAAAACGCGGTGACGACTATCAGGAAATTTTTGCCCAGCAGGTCCGTG
+AAACGATGGAGCGCCGTGCAGCCGGTCTTAAACCGCCCGCCTGGGCGGCTGCAGCATTTG
+AATCCGGGCTGCGACAATCAACAGAGGAGGAGAAGAGTGACAGCAGAGCTGCGTAATCTC
+CCGCATATTGCCAGCATGGCCTTTAATGAGCCGCTGATGCTTGAACCCGCCTATGCGCGG
+GTTTTCTTTTGTGCGCTTGCAGGCCAGCTTGGGATCAGCAGCCTGACGGATGCGGTGTCC
+GGCGACAGCCTGACTGCCCAGGAGGCACTCGCGACGCTGGCATTATCCGGTGATGATGAC
+GGACCACGACAGGCCCGCAGTTATCAGGTCATGAACGGCATCGCCGTGCTGCCGGTGTCC
+GGCACGCTGGTCAGCCGGACGCGGGCGCTGCAGCCGTACTCGGGGATGACCGGTTACAAC
+GGCATTATCGCCCGTCTGCAACAGGCTGCCAGCGATCCGATGGTGGACGGCATTCTGCTC
+GATATGGACACGCCCGGCGGGATGGTGGCGGGGGCATTTGACTGCGCTGACATCATCGCC
+CGTGTGCGTGACATAAAACCGGTATGGGCGCTTGCCAACGACATGAACTGCAGTGCAGGT
+CAGTTGCTTGCCAGTGCCGCCTCCCGGCGTCTGGTCACGCAGACCGCCCGGACAGGCTCC
+ATCGGCGTCATGATGGCTCACAGTAATTACGGTGCTGCGCTGGAGAAACAGGGTGTGGAA
+ATCACGCTGATTTACAGCGGCAGCCATAAGGTGGATGGCAACCCCTACAGCCATCTTCCG
+GATGACGTCCGGGAGACACTGCAGTCCCGGATGGACGCAACCCGCCAGATGTTTGCGCAG
+AAGGTGTCGGCATATACCGGCCTGTCCGTGCAGGTTGTGCTGGATACCGAGGCTGCAGTG
+TACAGCGGTCAGGAGGCCATTGATGCCGGACTGGCTGATGAACTTGTTAACAGCACCGAT
+GCGATCACCGTCATGCGTGATGCACTGGATGCACGTAAATCCCGTCTCTCAGGAGGGCGA
+ATGACCAAAGAGACTCAATCAACAACTGTTTCAGCCACTGCTTCGCAGGCTGACGTTACT
+GACGTGGTGCCAGCGACGGAGGGCGAGAACGCCAGCGCGGCGCAGCCGGACGTGAACGCG
+CAGATCACCGCAGCGGTTGCGGCAGAAAACAGCCGCATTATGGGGATCCTCAACTGTGAG
+GAGGCTCACGGACGCGAAGAACAGGCACGCGTGCTGGCAGAAACCCCCGGTATGACCGTG
+AAAACGGCCCGCCGCATTCTGGCCGCAGCACCACAGAGTGCACAGGCGCGCAGTGACACT
+GCGCTGGATCGTCTGATGCAGGGGGCACCGGCACCGCTGGCTGCAGGTAACCCGGCATCT
+GATGCCGTTAACGATTTGCTGAACACACCAGTGTAAGGGATGTTTATGACGAGCAAAGAA
+ACCTTTACCCATTACCAGCCGCAGGGCAACAGTGACCCGGCTCATACCGCAACCGCGCCC
+GGCGGATTGAGTGCGAAAGCGCCTGCAATGACCCCGCTGATGCTGGACACCTCCAGCCGT
+AAGCTGGTTGCGTGGGATGGCACCACCGACGGTGCTGCCGTTGGCATTCTTGCGGTTGCT
+GCTGACCAGACCAGCACCACGCTGACGTTCTACAAGTCCGGCACGTTCCGTTATGAGGAT
+GTGCTCTGGCCGGAGGCTGCCAGCGACGAGACGAAAAAACGGACCGCGTTTGCCGGAACG
+GCAATCAGCATCGTTTAACTTTACCCTTCATCACTAAAGGCCGCCTGTGCGGCTTTTTTT
+ACGGGATTTTTTTATGTCGATGTACACAACCGCCCAACTGCTGGCGGCAAATGAGCAGAA
+ATTTAAGTTTGATCCGCTGTTTCTGCGTCTCTTTTTCCGTGAGAGCTATCCCTTCACCAC
+GGAGAAAGTCTATCTCTCACAAATTCCGGGACTGGTAAACATGGCGCTGTACGTTTCGCC
+GATTGTTTCCGGTGAGGTTATCCGTTCCCGTGGCGGCTCCACCTCTGAATTTACGCCGGG
+ATATGTCAAGCCGAAGCATGAAGTGAATCCGCAGATGACCCTGCGTCGCCTGCCGGATGA
+AGATCCGCAGAATCTGGCGGACCCGGCTTACCGCCGCCGTCGCATCATCATGCAGAACAT
+GCGTGACGAAGAGCTGGCCATTGCTCAGGTCGAAGAGATGCAGGCAGTTTCTGCCGTGCT
+TAAGGGCAAATACACCATGACCGGTGAAGCCTTCGATCCGGTTGAGGTGGATATGGGCCG
+CAGTGAGGAGAATAACATCACGCAGTCCGGCGGCACGGAGTGGAGCAAGCGTGACAAGTC
+CACGTATGACCCGACCGACGATATCGAAGCCTACGCGCTGAACGCCAGCGGTGTGGTGAA
+TATCATCGTGTTCGATCCGAAAGGCTGGGCGCTGTTCCGTTCCTTCAAAGCCGTCAAGGA
+GAAGCTGGATACCCGTCGTGGCTCTAATTCCGAGCTGGAGACAGCGGTGAAAGACCTGGG
+CAAAGCGGTGTCCTATAAGGGGATGTATGGCGATGTGGCCATCGTCGTGTATTCCGGACA
+>lambda_NEB3011_contig_4
+GTACGTGGAAAACGGCGTCAAAAAGAACTTCCTGCCGGACAACACGATGGTGCTGGGGAA
+CACTCAGGCACGCGGTCTGCGCACCTATGGCTGCATTCAGGATGCGGACGCACAGCGCGA
+AGGCATTAACGCCTCTGCCCGTTACCCGAAAAACTGGGTGACCACCGGCGATCCGGCGCG
+TGAGTTCACCATGATTCAGTCAGCACCGCTGATGCTGCTGGCTGACCCTGATGAGTTCGT
+GTCCGTACAACTGGCGTAATCATGGCCCTTCGGGGCCATTGTTTCTCTGTGGAGGAGTCC
+ATGACGAAAGATGAACTGATTGCCCGTCTCCGCTCGCTGGGTGAACAACTGAACCGTGAT
+GTCAGCCTGACGGGGACGAAAGAAGAACTGGCGCTCCGTGTGGCAGAGCTGAAAGAGGAG
+CTTGATGACACGGATGAAACTGCCGGTCAGGACACCCCTCTCAGCCGGGAAAATGTGCTG
+ACCGGACATGAAAATGAGGTGGGATCAGCGCAGCCGGATACCGTGATTCTGGATACGTCT
+GAACTGGTCACGGTCGTGGCACTGGTGAAGCTGCATACTGATGCACTTCACGCCACGCGG
+GATGAACCTGTGGCATTTGTGCTGCCGGGAACGGCGTTTCGTGTCTCTGCCGGTGTGGCA
+GCCGAAATGACAGAGCGCGGCCTGGCCAGAATGCAATAACGGGAGGCGCTGTGGCTGATT
+TCGATAACCTGTTCGATGCTGCCATTGCCCGCGCCGATGAAACGATACGCGGGTACATGG
+GAACGTCAGCCACCATTACATCCGGTGAGCAGTCAGGTGCGGTGATACGTGGTGTTTTTG
+ATGACCCTGAAAATATCAGCTATGCCGGACAGGGCGTGCGCGTTGAAGGCTCCAGCCCGT
+CCCTGTTTGTCCGGACTGATGAGGTGCGGCAGCTGCGGCGTGGAGACACGCTGACCATCG
+GTGAGGAAAATTTCTGGGTAGATCGGGTTTCGCCGGATGATGGCGGAAGTTGTCATCTCT
+GGCTTGGACGGGGCGTACCGCCTGCCGTTAACCGTCGCCGCTGAAAGGGGGATGTATGGC
+CATAAAAGGTCTTGAGCAGGCCGTTGAAAACCTCAGCCGTATCAGCAAAACGGCGGTGCC
+TGGTGCCGCCGCAATGGCCATTAACCGCGTTGCTTCATCCGCGATATCGCAGTCGGCGTC
+ACAGGTTGCCCGTGAGACAAAGGTACGCCGGAAACTGGTAAAGGAAAGGGCCAGGCTGAA
+AAGGGCCACGGTCAAAAATCCGCAGGCCAGAATCAAAGTTAACCGGGGGGATTTGCCCGT
+AATCAAGCTGGGTAATGCGCGGGTTGTCCTTTCGCGCCGCAGGCGTCGTAAAAAGGGGCA
+GCGTTCATCCCTGAAAGGTGGCGGCAGCGTGCTTGTGGTGGGTAACCGTCGTATTCCCGG
+CGCGTTTATTCAGCAACTGAAAAATGGCCGGTGGCATGTCATGCAGCGTGTGGCTGGGAA
+AAACCGTTACCCCATTGATGTGGTGAAAATCCCGATGGCGGTGCCGCTGACCACGGCGTT
+TAAACAAAATATTGAGCGGATACGGCGTGAACGTCTTCCGAAAGAGCTGGGCTATGCGCT
+GCAGCATCAACTGAGGATGGTAATAAAGCGATGAAACATACTGAACTCCGTGCAGCCGTA
+CTGGATGCACTGGAGAAGCATGACACCGGGGCGACGTTTTTTGATGGTCGCCCCGCTGTT
+TTTGATGAGGCGGATTTTCCGGCAGTTGCCGTTTATCTCACCGGCGCTGAATACACGGGC
+GAAGAGCTGGACAGCGATACCTGGCAGGCGGAGCTGCATATCGAAGTTTTCCTGCCTGCT
+CAGGTGCCGGATTCAGAGCTGGATGCGTGGATGGAGTCCCGGATTTATCCGGTGATGAGC
+GATATCCCGGCACTGTCAGATTTGATCACCAGTATGGTGGCCAGCGGCTATGACTACCGG
+CGCGACGATGATGCGGGCTTGTGGAGTTCAGCCGATCTGACTTATGTCATTACCTATGAA
+ATGTGAGGACGCTATGCCTGTACCAAATCCTACAATGCCGGTGAAAGGTGCCGGGACCAC
+CCTGTGGGTTTATAAGGGGAGCGGTGACCCTTACGCGAATCCGCTTTCAGACGTTGACTG
+GTCGCGTCTGGCAAAAGTTAAAGACCTGACGCCCGGCGAACTGACCGCTGAGTCCTATGA
diff --git a/tests/data/dataset/lambda_contigs.xml b/tests/data/dataset/lambda_contigs.xml
new file mode 100644
index 0000000..e2bfb18
--- /dev/null
+++ b/tests/data/dataset/lambda_contigs.xml
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<pbds:ReferenceSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" CreatedAt="2015-05-28T10:56:36" MetaType="PacBio.DataSet.ReferenceSet" Name="" Tags="" UniqueId="596e87db-34f9-d2fd-c905-b017543170e1" Version="2.3.0" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd"><pbbase:ExternalResources><pbbase:ExternalResource ResourceId="file:tests/data/lambda_contigs.fasta" /></pbbase:ExternalResources></pbds:Re [...]
\ No newline at end of file
diff --git a/tests/data/dataset/m150430_142051_Mon_p1_b25.sts.xml b/tests/data/dataset/m150430_142051_Mon_p1_b25.sts.xml
new file mode 100644
index 0000000..abc631c
--- /dev/null
+++ b/tests/data/dataset/m150430_142051_Mon_p1_b25.sts.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><PipeStats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://pacificbiosciences.com/PipelineStats/PipeStats.xsd"><MovieName>m150430_142051_Mon_p1_b25</MovieName><MovieLength>40</MovieLength><NumFramesDropped>-1</NumFramesDropped><NumSequencingZmws>2876</NumSequencingZmws><TraceFileSize>2891592848</TraceFileSize><PulseFileSize>255406259</PulseFileSize><BaseFileSize>44432421</BaseFileSize> [...]
\ No newline at end of file
diff --git a/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam b/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam
new file mode 100644
index 0000000..fb08bf9
Binary files /dev/null and b/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam differ
diff --git a/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai b/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai
new file mode 100644
index 0000000..b87bfa7
Binary files /dev/null and b/tests/data/dataset/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai differ
diff --git a/tests/data/dataset/pbalchemy10kbp.xml b/tests/data/dataset/pbalchemy10kbp.xml
new file mode 100644
index 0000000..1b90cec
--- /dev/null
+++ b/tests/data/dataset/pbalchemy10kbp.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pbds:DataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" CreatedAt="2015-05-22T16:56:16" MetaType="PacBio.DataSet.DataSet" Name="" Tags="" UniqueId="58e3f7c5-24c1-b58b-fbd5-37de268cc2f0" Version="2.3.0" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+  <pbbase:ExternalResources>
+    <pbbase:ExternalResource ResourceId="file:tests/data/pbalchemy10kbp.pbalign.sorted.pbver1.bam">
+      <pbbase:FileIndices>
+        <pbbase:FileIndex ResourceId="file:tests/data/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai"/>
+      </pbbase:FileIndices>
+    </pbbase:ExternalResource>
+  </pbbase:ExternalResources>
+  <pbds:Filters>
+      <pbds:Filter>
+          <pbbase:Properties>
+              <pbbase:Property Name="rname" Value="E.faecalis.1" Operator="=" />
+          </pbbase:Properties>
+      </pbds:Filter>
+  </pbds:Filters>
+</pbds:DataSet>
diff --git a/tests/data/dataset/reference.dataset.xml b/tests/data/dataset/reference.dataset.xml
new file mode 100644
index 0000000..953f863
--- /dev/null
+++ b/tests/data/dataset/reference.dataset.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:ReferenceSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.ReferenceSet" Name="DataSet_ReferenceSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd">
+	<pbbase:ExternalResources>
+		<pbbase:ExternalResource Name="First References FASTA" Description="Points to an example references FASTA file." MetaType="PacBio.ReferenceFile.ReferenceFastaFile" ResourceId="file:///mnt/path/to/reference.fasta" Tags="Example">
+			<pbbase:FileIndices>
+				<pbbase:FileIndex MetaType="PacBio.Index.SaWriterIndex" ResourceId="file:///mnt/path/to/reference.fasta.sa"/>
+				<pbbase:FileIndex MetaType="PacBio.Index.SamIndex" ResourceId="file:///mnt/path/to/reference.fasta.fai"/>
+			</pbbase:FileIndices>
+		</pbbase:ExternalResource>
+	</pbbase:ExternalResources>
+	<pbds:DataSetMetadata>
+		<pbds:TotalLength>5000000</pbds:TotalLength>
+		<pbds:NumRecords>500</pbds:NumRecords>
+		<pbds:Organism>Tribble</pbds:Organism>
+		<pbds:Ploidy>Diploid</pbds:Ploidy>
+		<pbds:Contigs>
+			<pbds:Contig Name="gi|229359445|emb|AM181176.4|" Description="Pseudomonas fluorescens SBW25 complete genome|quiver" Length="6722109" Digest="f627c795efad7ce0050ed42b942d408e"/>
+		</pbds:Contigs>
+	</pbds:DataSetMetadata>
+</pbds:ReferenceSet>
diff --git a/tests/data/dataset/subread_dataset1.xml b/tests/data/dataset/subread_dataset1.xml
new file mode 100644
index 0000000..ac6325b
--- /dev/null
+++ b/tests/data/dataset/subread_dataset1.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:SubreadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.SubreadSet" Name="DataSet_SubreadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd" >
+    <pbbase:ExternalResources>
+        <pbbase:ExternalResource Name="First Subreads BAM" Description="Points to an example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads0.bam" Tags="Example">
+            <pbbase:FileIndices>
+                <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads0.pbi"/>
+            </pbbase:FileIndices>
+        </pbbase:ExternalResource>
+        <pbbase:ExternalResource Name="Second Subreads BAM" Description="Points to another example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads1.bam" Tags="Example">
+            <pbbase:FileIndices>
+                <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads0.pbi"/>
+            </pbbase:FileIndices>
+        </pbbase:ExternalResource>
+    </pbbase:ExternalResources>
+    <pbds:Filters>
+        <pbds:Filter>
+            <pbbase:Properties>
+                <pbbase:Property Name="rq" Value="0.75" Operator=">"/>
+            </pbbase:Properties>
+        </pbds:Filter>
+        <pbds:Filter>
+            <pbbase:Properties>
+                <pbbase:Property Name="QNAME" Value="100/0/0_100" Operator="=="/>
+            </pbbase:Properties>
+        </pbds:Filter>
+    </pbds:Filters>
+    <pbds:DataSetMetadata>
+        <pbds:TotalLength>500000</pbds:TotalLength>
+        <pbds:NumRecords>500</pbds:NumRecords>
+        <pbmeta:Collections>
+            <pbmeta:CollectionMetadata Context="m152720_092723_00114_c100480560100000001823075906281381_s1_p0" InstrumentName="RS" InstrumentId="43210">
+                <pbmeta:InstCtrlVer>2.3.0.0.140640</pbmeta:InstCtrlVer>
+                <pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2300.140640, HwVer=1.0</pbmeta:SigProcVer>
+                <pbmeta:RunDetails>
+                    <pbmeta:RunId>e903682f-e502-465c-a2b6-9dd77c9f43fc</pbmeta:RunId>
+                    <pbmeta:Name>beta4_130726_biotin_DEV_vs_MFG_PB11K_9458p</pbmeta:Name>
+                </pbmeta:RunDetails>
+                <pbmeta:WellSample Name="Well Sample 1" UniqueId="aaa2df90-d44f-4a48-9f35-3b99473c68f5">
+                    <pbmeta:PlateId>2014-12-24_141_NGAT_Igor_bisPNA Enrichment_Mag Bead Elution Buffers</pbmeta:PlateId>
+                    <pbmeta:WellName>B01</pbmeta:WellName>
+                    <pbmeta:Concentration>10</pbmeta:Concentration>
+                    <pbmeta:SampleReuseEnabled>true</pbmeta:SampleReuseEnabled>
+                    <pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+                    <pbmeta:SizeSelectionEnabled>true</pbmeta:SizeSelectionEnabled>
+                    <pbmeta:UseCount>0</pbmeta:UseCount>
+                    <pbmeta:Comments>Lorem ipsum</pbmeta:Comments>
+                    <pbsample:BioSamplePointers>
+                        <pbsample:BioSamplePointer>abc2df90-d44f-4a48-9f35-3b99473c68f5</pbsample:BioSamplePointer>
+                    </pbsample:BioSamplePointers>
+                </pbmeta:WellSample>
+                <pbmeta:Automation>
+                    <pbbase:AutomationParameters>
+			            <pbbase:AutomationParameter/>
+                    </pbbase:AutomationParameters>
+                </pbmeta:Automation>
+                <pbmeta:CollectionNumber>0</pbmeta:CollectionNumber>
+                <pbmeta:CellIndex>0</pbmeta:CellIndex>
+                <pbmeta:CellPac Barcode="100480560100000001823075906281381"/>
+                <pbmeta:Primary>
+                    <pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+                    <pbmeta:ConfigFileName>1-3-0_Standard_C2.xml</pbmeta:ConfigFileName>
+                    <pbmeta:SequencingCondition/>
+                    <pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+                    <pbmeta:CollectionPathUri>rsy://mp-rsync/vol56//RS_DATA_STAGING//2014-12-24_141_NGAT_Igor_bisPNA%20Enrichment_Mag%20Bead%20Elution%20Buffers_1094/B01_1</pbmeta:CollectionPathUri>
+                    <pbmeta:CopyFiles>
+                        <pbmeta:CollectionFileCopy>Bam</pbmeta:CollectionFileCopy>
+                    </pbmeta:CopyFiles>
+                </pbmeta:Primary>
+            </pbmeta:CollectionMetadata>
+        </pbmeta:Collections>
+        <pbsample:BioSamples>
+            <pbsample:BioSample UniqueId="abc2df90-d44f-4a48-9f35-3b99473c68f5" Name="consectetur purus" Description="Risus sit amet lectus vehicula vulputate quisque porta accumsan venenatis." CreatedAt="2015-01-20T13:27:23.9271737-08:00"/>
+        </pbsample:BioSamples>
+    </pbds:DataSetMetadata>
+</pbds:SubreadSet>
+<!-- TODO what do internal references look like?-->
diff --git a/tests/data/dataset/subread_dataset2.xml b/tests/data/dataset/subread_dataset2.xml
new file mode 100644
index 0000000..63da322
--- /dev/null
+++ b/tests/data/dataset/subread_dataset2.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:SubreadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.SubreadSet" Name="DataSet_SubreadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd" >
+    <pbbase:ExternalResources>
+        <pbbase:ExternalResource Name="First Subreads BAM" Description="Points to an example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads2.bam" Tags="Example">
+            <pbbase:FileIndices>
+                <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads2.pbi"/>
+            </pbbase:FileIndices>
+        </pbbase:ExternalResource>
+        <pbbase:ExternalResource Name="Second Subreads BAM" Description="Points to another example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads3.bam" Tags="Example">
+            <pbbase:FileIndices>
+                <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads3.pbi"/>
+            </pbbase:FileIndices>
+        </pbbase:ExternalResource>
+    </pbbase:ExternalResources>
+    <pbds:Filters>
+        <pbds:Filter>
+            <pbbase:Properties>
+                <pbbase:Property Name="rq" Value="0.75" Operator=">"/>
+            </pbbase:Properties>
+        </pbds:Filter>
+        <pbds:Filter>
+            <pbbase:Properties>
+                <pbbase:Property Name="QNAME" Value="100/0/0_100" Operator="=="/>
+            </pbbase:Properties>
+        </pbds:Filter>
+    </pbds:Filters>
+    <pbds:DataSetMetadata>
+        <pbds:TotalLength>500000</pbds:TotalLength>
+        <pbds:NumRecords>500</pbds:NumRecords>
+        <pbmeta:Collections>
+            <pbmeta:CollectionMetadata Context="m152720_092723_00114_c100480560100000001823075906281381_s1_p0" InstrumentName="RS" InstrumentId="43210">
+                <pbmeta:InstCtrlVer>2.3.0.0.140640</pbmeta:InstCtrlVer>
+                <pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2300.140640, HwVer=1.0</pbmeta:SigProcVer>
+                <pbmeta:RunDetails>
+                    <pbmeta:RunId>e903682f-e502-465c-a2b6-9dd77c9f43fc</pbmeta:RunId>
+                    <pbmeta:Name>beta4_130726_biotin_DEV_vs_MFG_PB11K_9458p</pbmeta:Name>
+                </pbmeta:RunDetails>
+                <pbmeta:WellSample Name="Well Sample 1" UniqueId="aaa2df90-d44f-4a48-9f35-3b99473c68f5">
+                    <pbmeta:PlateId>2014-12-24_141_NGAT_Igor_bisPNA Enrichment_Mag Bead Elution Buffers</pbmeta:PlateId>
+                    <pbmeta:WellName>B01</pbmeta:WellName>
+                    <pbmeta:Concentration>10</pbmeta:Concentration>
+                    <pbmeta:SampleReuseEnabled>true</pbmeta:SampleReuseEnabled>
+                    <pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+                    <pbmeta:SizeSelectionEnabled>true</pbmeta:SizeSelectionEnabled>
+                    <pbmeta:UseCount>0</pbmeta:UseCount>
+                    <pbmeta:Comments>Lorem ipsum</pbmeta:Comments>
+                    <pbsample:BioSamplePointers>
+                        <pbsample:BioSamplePointer>abc2df90-d44f-4a48-9f35-3b99473c68f5</pbsample:BioSamplePointer>
+                    </pbsample:BioSamplePointers>
+                </pbmeta:WellSample>
+                <pbmeta:Automation>
+                    <pbbase:AutomationParameters>
+                            <pbbase:AutomationParameter/>
+                    </pbbase:AutomationParameters>
+                </pbmeta:Automation>
+                <pbmeta:CollectionNumber>0</pbmeta:CollectionNumber>
+                <pbmeta:CellIndex>0</pbmeta:CellIndex>
+                <pbmeta:CellPac Barcode="100480560100000001823075906281381"/>
+                <pbmeta:Primary>
+                    <pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+                    <pbmeta:ConfigFileName>1-3-0_Standard_C2.xml</pbmeta:ConfigFileName>
+                    <pbmeta:SequencingCondition/>
+                    <pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+                    <pbmeta:CollectionPathUri>rsy://mp-rsync/vol56//RS_DATA_STAGING//2014-12-24_141_NGAT_Igor_bisPNA%20Enrichment_Mag%20Bead%20Elution%20Buffers_1094/B01_1</pbmeta:CollectionPathUri>
+                    <pbmeta:CopyFiles>
+                        <pbmeta:CollectionFileCopy>Bam</pbmeta:CollectionFileCopy>
+                    </pbmeta:CopyFiles>
+                </pbmeta:Primary>
+            </pbmeta:CollectionMetadata>
+        </pbmeta:Collections>
+        <pbsample:BioSamples>
+            <pbsample:BioSample UniqueId="abc2df90-d44f-4a48-9f35-3b99473c68f5" Name="consectetur purus" Description="Risus sit amet lectus vehicula vulputate quisque porta accumsan venenatis." CreatedAt="2015-01-20T13:27:23.9271737-08:00"/>
+        </pbsample:BioSamples>
+    </pbds:DataSetMetadata>
+</pbds:SubreadSet>
+<!-- TODO what do internal references look like?-->
diff --git a/tests/data/dataset/subread_dataset3.xml b/tests/data/dataset/subread_dataset3.xml
new file mode 100644
index 0000000..00a1786
--- /dev/null
+++ b/tests/data/dataset/subread_dataset3.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<pbds:SubreadSet xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd" MetaType="PacBio.DataSet.SubreadSet" Name="DataSet_SubreadSet" Tags="barcode moreTags mapping mytags" UniqueId="b095d0a3-94b8-4918-b3af-a3f81bbe519c" Version="2.3.0" CreatedAt="2015-01-27T09:00:01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pacificbiosciences.com/PacBioDataModel.xsd" >
+    <pbbase:ExternalResources>
+        <pbbase:ExternalResource Name="First Subreads BAM" Description="Points to an example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads2.bam" Tags="Example">
+            <pbbase:FileIndices>
+                <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads2.pbi"/>
+            </pbbase:FileIndices>
+        </pbbase:ExternalResource>
+        <pbbase:ExternalResource Name="Second Subreads BAM" Description="Points to another example Subreads BAM file." MetaType="SubreadFile.SubreadBamFile" ResourceId="file:///mnt/path/to/subreads3.bam" Tags="Example">
+            <pbbase:FileIndices>
+                <pbbase:FileIndex ResourceId="file:///mnt/path/to/subreads3.pbi"/>
+            </pbbase:FileIndices>
+        </pbbase:ExternalResource>
+    </pbbase:ExternalResources>
+    <pbds:Filters>
+        <pbds:Filter>
+            <pbbase:Properties>
+                <pbbase:Property Name="rq" Value="0.85" Operator=">"/>
+            </pbbase:Properties>
+        </pbds:Filter>
+        <pbds:Filter>
+            <pbbase:Properties>
+                <pbbase:Property Name="QNAME" Value="100/0/0_100" Operator="=="/>
+            </pbbase:Properties>
+        </pbds:Filter>
+    </pbds:Filters>
+    <pbds:DataSetMetadata>
+        <pbds:TotalLength>500000</pbds:TotalLength>
+        <pbds:NumRecords>500</pbds:NumRecords>
+        <pbmeta:Collections>
+            <pbmeta:CollectionMetadata Context="m152720_092723_00114_c100480560100000001823075906281381_s1_p0" InstrumentName="RS" InstrumentId="43210">
+                <pbmeta:InstCtrlVer>2.3.0.0.140640</pbmeta:InstCtrlVer>
+                <pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2300.140640, HwVer=1.0</pbmeta:SigProcVer>
+                <pbmeta:RunDetails>
+                    <pbmeta:RunId>e903682f-e502-465c-a2b6-9dd77c9f43fc</pbmeta:RunId>
+                    <pbmeta:Name>beta4_130726_biotin_DEV_vs_MFG_PB11K_9458p</pbmeta:Name>
+                </pbmeta:RunDetails>
+                <pbmeta:WellSample Name="Well Sample 1" UniqueId="aaa2df90-d44f-4a48-9f35-3b99473c68f5">
+                    <pbmeta:PlateId>2014-12-24_141_NGAT_Igor_bisPNA Enrichment_Mag Bead Elution Buffers</pbmeta:PlateId>
+                    <pbmeta:WellName>B01</pbmeta:WellName>
+                    <pbmeta:Concentration>10</pbmeta:Concentration>
+                    <pbmeta:SampleReuseEnabled>true</pbmeta:SampleReuseEnabled>
+                    <pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+                    <pbmeta:SizeSelectionEnabled>true</pbmeta:SizeSelectionEnabled>
+                    <pbmeta:UseCount>0</pbmeta:UseCount>
+                    <pbmeta:Comments>Lorem ipsum</pbmeta:Comments>
+                    <pbsample:BioSamplePointers>
+                        <pbsample:BioSamplePointer>abc2df90-d44f-4a48-9f35-3b99473c68f5</pbsample:BioSamplePointer>
+                    </pbsample:BioSamplePointers>
+                </pbmeta:WellSample>
+                <pbmeta:Automation>
+                    <pbbase:AutomationParameters>
+			            <pbbase:AutomationParameter/>
+                    </pbbase:AutomationParameters>
+                </pbmeta:Automation>
+                <pbmeta:CollectionNumber>0</pbmeta:CollectionNumber>
+                <pbmeta:CellIndex>0</pbmeta:CellIndex>
+                <pbmeta:CellPac Barcode="100480560100000001823075906281381"/>
+                <pbmeta:Primary>
+                    <pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+                    <pbmeta:ConfigFileName>1-3-0_Standard_C2.xml</pbmeta:ConfigFileName>
+                    <pbmeta:SequencingCondition/>
+                    <pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+                    <pbmeta:CollectionPathUri>rsy://mp-rsync/vol56//RS_DATA_STAGING//2014-12-24_141_NGAT_Igor_bisPNA%20Enrichment_Mag%20Bead%20Elution%20Buffers_1094/B01_1</pbmeta:CollectionPathUri>
+                    <pbmeta:CopyFiles>
+                        <pbmeta:CollectionFileCopy>Bam</pbmeta:CollectionFileCopy>
+                    </pbmeta:CopyFiles>
+                </pbmeta:Primary>
+            </pbmeta:CollectionMetadata>
+        </pbmeta:Collections>
+        <pbsample:BioSamples>
+            <pbsample:BioSample UniqueId="abc2df90-d44f-4a48-9f35-3b99473c68f5" Name="consectetur purus" Description="Risus sit amet lectus vehicula vulputate quisque porta accumsan venenatis." CreatedAt="2015-01-20T13:27:23.9271737-08:00"/>
+        </pbsample:BioSamples>
+    </pbds:DataSetMetadata>
+</pbds:SubreadSet>
+<!-- TODO what do internal references look like?-->
diff --git a/tests/data/dataset/transformed_rs_subread_dataset.xml b/tests/data/dataset/transformed_rs_subread_dataset.xml
new file mode 100644
index 0000000..6b93870
--- /dev/null
+++ b/tests/data/dataset/transformed_rs_subread_dataset.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pbds:HdfSubreadSet xmlns:uuid="java:java.util.UUID" xmlns:bax="http://whatever"
+               xmlns="http://pacificbiosciences.com/PacBioDataModel.xsd"
+               xmlns:xs="http://www.w3.org/2001/XMLSchema"
+               xmlns:fn="http://www.w3.org/2005/xpath-functions"
+               Name="Subreads from run r001173_42129_130607"
+               MetaType="PacBio.DataSet.SubreadSet"
+               Tags="pacbio.secondary.instrument=RS"
+               Version="0.5"
+               UniqueId="abbc9183-b01e-4671-8c12-19efee534647">
+   <pbbase:ExternalResources>
+      <pbbase:ExternalResource MetaType="PacBio.SubreadFile.BaxFile"
+          ResourceId="file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.0.bax.h5"/>
+      <pbbase:ExternalResource MetaType="PacBio.SubreadFile.BaxFile"
+          ResourceId="file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.1.bax.h5"/>
+      <pbbase:ExternalResource MetaType="PacBio.SubreadFile.BaxFile"
+          ResourceId="file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.2.bax.h5"/>
+   </pbbase:ExternalResources>
+   <pbds:DataSetMetadata>
+      <pbds:TotalLength>50000000</pbds:TotalLength>
+      <pbds:NumRecords>150000</pbds:NumRecords>
+      <pbmeta:Collections>
+         <pbmeta:CollectionMetadata Context="m130608_033634_42129_c100515232550000001823076608221351_s1_p0"
+                             InstrumentName="42129"
+                             InstrumentId="1">
+            <pbmeta:InstCtrlVer>2.0.1.0.124174</pbmeta:InstCtrlVer>
+            <pbmeta:SigProcVer>NRT at 172.31.128.10:8082, SwVer=2010.124174, HwVer=1.0</pbmeta:SigProcVer>
+            <pbmeta:RunDetails>
+               <pbmeta:RunId>r001173_42129_130607</pbmeta:RunId>
+               <pbmeta:Name>2013-06-07_42129_10kb_Ecoli_201-validation_2</pbmeta:Name>
+            </pbmeta:RunDetails>
+            <pbmeta:WellSample Name="P4-C2_Ecoli_10kb_MBS_stageHS">
+               <pbmeta:PlateId>2013-06-07_42129_10kb_Ecoli_201-validation_2</pbmeta:PlateId>
+               <pbmeta:WellName>P4-C2_Ecoli_10kb_MBS_stageHS</pbmeta:WellName>
+               <pbmeta:Concentration>0</pbmeta:Concentration>
+               <pbmeta:SampleReuseEnabled>false</pbmeta:SampleReuseEnabled>
+               <pbmeta:StageHotstartEnabled>true</pbmeta:StageHotstartEnabled>
+               <pbmeta:SizeSelectionEnabled>
+                                    false
+								</pbmeta:SizeSelectionEnabled>
+               <pbmeta:UseCount>1</pbmeta:UseCount>
+               <pbmeta:Comments>P4-C2_Ecoli_10kb_MBS_stageHS</pbmeta:Comments>
+               <pbsample:BioSamplePointers>
+                  <pbsample:BioSamplePointer>abafd4ed-5cf7-4b83-a869-1a5d239d30e2</pbsample:BioSamplePointer>
+               </pbsample:BioSamplePointers>
+            </pbmeta:WellSample>
+            <pbmeta:AutomationName>MagBead Standard Seq v2</pbmeta:AutomationName>
+            <pbmeta:CollectionNumber>2</pbmeta:CollectionNumber>
+            <pbmeta:CellIndex>1</pbmeta:CellIndex>
+            <pbmeta:CellPac Barcode="10051523255000000182307660822135"/>
+            <pbmeta:Primary>
+               <pbmeta:AutomationName>BasecallerV1</pbmeta:AutomationName>
+               <pbmeta:ConfigFileName>2-0-0_P4-C2.xml</pbmeta:ConfigFileName>
+               <pbmeta:SequencingCondition/>
+               <pbmeta:ResultsFolder>Analysis_Results</pbmeta:ResultsFolder>
+               <pbmeta:CollectionPathUri>rsy://mp-f030-io/vol54//RS_DATA_STAGING/42129/2013-06-07_42129_10kb_Ecoli_201-validation_2_1173/A01_2/</pbmeta:CollectionPathUri>
+               <pbmeta:CopyFiles>
+                  <pbmeta:CollectionFileCopy>Fasta</pbmeta:CollectionFileCopy>
+               </pbmeta:CopyFiles>
+            </pbmeta:Primary>
+         </pbmeta:CollectionMetadata>
+      </pbmeta:Collections>
+      <pbsample:BioSamples>
+         <pbsample:BioSample Name="P4-C2_Ecoli_10kb_MBS_stageHS" Description="P4-C2_Ecoli_10kb_MBS_stageHS"
+                    UniqueId="abafd4ed-5cf7-4b83-a869-1a5d239d30e2"/>
+      </pbsample:BioSamples>
+   </pbds:DataSetMetadata>
+</pbds:HdfSubreadSet>
diff --git a/tests/data/ex2.bam b/tests/data/ex2.bam
new file mode 100644
index 0000000..efba168
Binary files /dev/null and b/tests/data/ex2.bam differ
diff --git a/tests/data/ex2.bam.bai b/tests/data/ex2.bam.bai
new file mode 100644
index 0000000..f44c34d
Binary files /dev/null and b/tests/data/ex2.bam.bai differ
diff --git a/tests/data/ex2.sam b/tests/data/ex2.sam
new file mode 100644
index 0000000..b609d6c
--- /dev/null
+++ b/tests/data/ex2.sam
@@ -0,0 +1,3310 @@
+ at HD	VN:1.0	SO:coordinate	pb:3.0b7
+ at SQ	SN:seq1	LN:1575
+ at SQ	SN:seq2	LN:1584
+B7_591:4:96:693:509	73	seq1	1	99	36M	*	0	0	CACTAGTGGCTCATTGTAAATGTGTGGTTTAACTCG	<<<<<<<<<<<<<<<;<<<<<<<<<5<<<<<;:<;7	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:7:152:368:113	73	seq1	3	99	35M	*	0	0	CTAGTGGCTCATTGTAAATGTGTGGTTTAACTCGT	<<<<<<<<<<0<<<<655<<7<<<:9<<3/:<6):	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:8:5:734:57	137	seq1	5	99	35M	*	0	0	AGTGGCTCATTGTAAATGTGTGGTTTAACTCGTCC	<<<<<<<<<<<7;71<<;<;;<7;<<3;);3*8/5	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:1:289:587:906	137	seq1	6	63	36M	*	0	0	GTGGCTCATTGTAATTTTTTGTTTTAACTCTTCTCT	(-&----,----)-)-),'--)---',+-,),''*,	MF:i:-126	Aq:i:63	NM:i:5	UQ:i:38	H0:i:0	H1:i:0
+EAS56_59:8:38:671:758	137	seq1	9	99	35M	*	0	0	GCTCATTGTAAATGTGTGGTTTAACTCGTCCATGG	<<<<<<<<<<<<<<<;<;7<<<<<<<<7<<;:<5%	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:18:467:281	73	seq1	13	99	35M	*	0	0	ATTGTAAATGTGTGGTTTAACTCGTCCCTGGCCCA	<<<<<<<<;<<<8<<<<<;8:;6/686&;(16666	MF:i:18	Aq:i:39	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS114_28:5:296:340:699	137	seq1	13	99	36M	*	0	0	ATTGTAAATGTGTGGTTTAACTCGTCCATGGCCCAG	<<<<<;<<<;<;<<<<<<<<<<<8<8<3<8;<;<0;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:194:894:408	73	seq1	15	99	35M	*	0	0	TGTAAATGTGTGGTTTAACTCGTCCATTGCCCAGC	<<<<<<<<<7<<;<<<<;<<<7;;<<<*,;;572<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+EAS188_4:8:12:628:973	89	seq1	18	75	35M	*	0	0	AAATGTGTGGTTTAACTCGTCCATGGCCCAGCATT	==;=:;:;;:====;=;===:=======;==;===	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:68:402:50	137	seq1	22	99	35M	*	0	0	GTGTGGTTTAACTCGTCCATGGCCCAGCATTTGGG	<<<<<<<<<<<<<<:<<<9<6;9;;&697;7&<55	MF:i:18	Aq:i:66	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_30:6:298:115:564	137	seq1	22	99	35M	*	0	0	GTGTGGTTTAACTCGTCCATGGCCCAGCATTAGGG	<<<<<<<<<<<<<;<<<;<<<;<<<;<:<<;;5;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:188:662:155	73	seq1	24	99	36M	*	0	0	GTGGTTTAACTCGTCCATGGCCCAGCATTAGGGAGC	<<<<<<<<<<<<<<<<<<:;<<<4<<+<<14991;4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:225:608:291	73	seq1	28	99	35M	*	0	0	TTTAACTCGTCCATGGCCCAGCATTAGGGATCTGT	<<<<<<<<<<<<<<8&<<<;6<9;;+2++(%59(<	MF:i:18	Aq:i:58	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_66:7:328:397:316	73	seq1	29	99	35M	*	0	0	TTAACTCGTCCATGGCCCAGCATTAGGGAGCTGTG	<<<<<<<<<<<<<6=<<<;<<5<<<+<15:'<;;4	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:257:960:682	73	seq1	31	75	35M	*	0	0	AACTCGTCCATGGCCCAGCATTAGGGAGCTGTGGA	<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<9;;9<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:4:143:69:578	83	seq1	36	98	35M	=	185	184	GTACATGGCCCAGCATTAGGGAGCTGTGGACCCCG	===;=====48=844;=;+=5==*57,2+5&,5+5	MF:i:18	Aq:i:35	NM:i:2	UQ:i:38	H0:i:0	H1:i:1
+EAS114_32:5:78:583:499	147	seq1	37	74	35M	=	229	227	TCCATGGCCCAGCATTAGGGCGCTGTGGACCCTGC	<<8;<<<<<<1<<-1<+8<<&;:555;5-*77/51	MF:i:18	Aq:i:37	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS1_93:7:252:171:323	147	seq1	43	99	35M	=	234	226	GCCCAGCATTAGGGAGCTGTGGACCCTGCAGCCTG	<<<):<<<<<<<<<:<<<&5<<2<562<<<<-7--	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:106:316:452	83	seq1	49	99	36M	=	224	211	CATTAGGGAGCTGTGGACCCTGCAGCCTGGCTGTTG	;<<;<<<<;<;;;;7;<;<<<;<<;<<;4:<<;+&+	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_589:8:113:968:19	147	seq1	50	99	35M	=	219	204	ATTAGGGAGCTGTGGACCCTGCAGCCTGGCTGGGG	<<<<;<;<<<<<<:;;;.;;<75;);;;<.2+(;5	MF:i:18	Aq:i:63	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS54_65:3:321:311:983	83	seq1	51	99	35M	=	228	212	TTAGGGAGCTGTGGACCCTGCAGCCTGGCTGTGGG	<<<;<<<<<<<<+;;<47;<9;94430499<88+6	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:155:12:674	147	seq1	52	99	36M	=	224	208	TAGGGAGCTGTGGACCCTGCAGCCTGGCTGTGGGGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<+:9-<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:51:1429:1043	147	seq1	59	99	35M	=	209	185	CTGTGGACCCTGCAGCCTGGCTGTGGGGGGCGCCG	<<<<<<<<<<<<<:<<<;<<<<:):;<;;-15)+1	MF:i:18	Aq:i:68	NM:i:2	UQ:i:22	H0:i:1	H1:i:0
+B7_591:5:42:540:501	83	seq1	60	99	36M	=	224	200	TGTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTG	<<<<<<<<<<<<<<<<<<<<<<.;<<<<,804,858	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:223:142:410	83	seq1	60	99	35M	=	235	210	TGTGGACCCTGCAGCCTGGCTGGGGGGGGCGCAGT	<<<<<<<<<<<<<<:<5<<2<<(<:<<<:5,((7(	MF:i:18	Aq:i:39	NM:i:2	UQ:i:32	H0:i:0	H1:i:1
+EAS1_108:1:65:787:74	147	seq1	61	88	35M	=	213	187	GTGGACCCTGCAGCCTGGCTGGGGGGGGCACGGGG	<<<<<8-82<2823;-<;822222888,*(2%2-2	MF:i:18	Aq:i:21	NM:i:5	UQ:i:51	H0:i:0	H1:i:0
+EAS56_61:6:227:259:597	83	seq1	61	99	35M	=	248	222	GTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTG	<<<<<<<<<<;;<<<6;8:68333;<8(8,1,$$+	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:243:10:911	147	seq1	63	99	35M	=	236	208	GGACCCTGCAGCCTGGCTGTGGGGGCCGCTGTGGG	<<;<<<<<<<<<<7<<<<<7<<<<<:4<((<%;<+	MF:i:18	Aq:i:64	NM:i:2	UQ:i:22	H0:i:1	H1:i:0
+EAS221_1:2:90:986:1224	147	seq1	67	99	35M	=	267	235	CCTGCAGCCTGGCTGTGGGGGCCGCAGCGGGTGGG	<<:<<<<<<<<<<<<0<<<<<)<<63<+<<2'<-<	MF:i:18	Aq:i:41	NM:i:3	UQ:i:39	H0:i:0	H1:i:1
+EAS54_67:3:175:730:949	147	seq1	70	99	35M	=	230	195	GCAGCCTGGCTGTGGGGGCCGCAGTGGCTGAGGGG	<<<<<<<<<<8<;<<<<<0(<<;;,<<7<4%7626	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:76:493:708	83	seq1	73	44	35M	=	229	191	GCCTGGCTGTGGGGGCACCAGCCGCTGCGGGGGGT	<<<<1<<1<;626<;<''+;-'';+2'+;;)6--+	MF:i:-126	Aq:i:44	NM:i:5	UQ:i:34	H0:i:0	H1:i:0
+EAS1_97:7:20:979:96	147	seq1	79	99	35M	=	254	210	CTGTGGGGGCCGCAGTGGCTGAGGGGGGGAGGGGC	<<<<<<;<<<<<7<<,<<,:;,<<<<17)++':.'	MF:i:18	Aq:i:37	NM:i:4	UQ:i:43	H0:i:0	H1:i:1
+EAS114_26:3:284:261:124	147	seq1	79	99	35M	=	263	219	CTGTGGGGGCCGCAGTGGGTGAGGGGTGGAGGGGG	============'8====':=+====,=8,8'=++	MF:i:18	Aq:i:39	NM:i:5	UQ:i:64	H0:i:0	H1:i:1
+EAS221_1:2:29:1486:672	83	seq1	79	99	35M	=	256	212	CTGTGGGGGCCGCAGTGGCTGAGGGGTGCAGAGCC	<<<<<<<<<<<<<;<;<<<<<;<<<<8;;;<8;-;	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:218:877:489	147	seq1	80	10	35M	=	250	205	TGTGGGGGCCGCAGTGGCTGGGGGGGGGCGGGCGG	<<<<<<<;<<<07640<2<9(<9<<&9%(<(6%%3	MF:i:18	Aq:i:10	NM:i:6	UQ:i:34	H0:i:0	H1:i:0
+EAS51_64:7:242:862:732	73	seq1	95	66	35M	=	95	0	GGCTGAGGGGTGCAGAGCCGAGTCACGGGGTTGCC	<<<<<<<<<<<<<<<;<<<:<;+<3<::3<';:';	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:242:862:732	133	seq1	95	0	*	=	95	0	GGGTCTATGTGAACAAAGGCACTAAACACAGCTGT	<<<<<<<<<<8<<<<<78<<<378<<<77755++2	MF:i:-64
+EAS56_57:6:190:289:82	69	seq1	100	0	*	=	100	0	CTCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA	<<<7<<<;<<<<<<<<8;;<7;4<;<;;;;;94<;	MF:i:-64
+EAS56_57:6:190:289:82	137	seq1	100	73	35M	=	100	0	AGGGGTGCAGAGCCGAGTCACGGGGTTGCCAGCAC	<<<<<<;<<<<<<<<<<;<<;<<<<;8<6;9;;2;	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:190:727:308	83	seq1	103	99	35M	=	263	195	GGTGCAGAGCCGAGTCACGGGGTTGCCAGCACAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<::<<<844	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:141:80:875	83	seq1	110	99	35M	=	265	190	AGCCGAGTCACGGGGTTGCCAGCACAGGGGCTTAA	<<<<<<<<<<<<<<<<<<<<<<:<<8;<<8+7;-7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:40:1128:1940	147	seq1	112	99	35M	=	291	214	CCGAGTCACGGGGTTGCCAGCACAGGGGCTTAACC	<<<<<<<<<<<<<<<<<<<;<<5;;<<<9;;;;7:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:290:319:736	69	seq1	113	0	*	=	113	0	GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC	<<<<<<:7:<.<<<<7<<.<.<<.9*<4<:<4%74	MF:i:-64
+EAS51_62:5:290:319:736	137	seq1	113	73	35M	=	113	0	CGAGTCACGGGGTTGCCAGCACAGGGGCTTAACCT	==;=======7====6=;==:;;====66=::27:	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:132:493:921	69	seq1	119	0	*	=	119	0	GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC	<<<<<<<<<<<<<<<<<<<;<<<<77;0<;;6777	MF:i:-64
+B7_597:2:132:493:921	137	seq1	119	75	35M	=	119	0	ACGGGGTTGCCAGCACAGGGGCTTAACCTCTGGTG	<<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;;88:	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:283:799:560	147	seq1	121	66	35M	=	283	197	GGGGTTGCCAGCACAGGGGCTTAACCTCTGGTGAC	<<<<+<<<<8<<<+<<<<<;<<:07;8;7402447	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:1:225:195:543	83	seq1	123	99	35M	=	299	211	GGTTGCCAGCACAGGGGCTTAACCTCTGGTGACTG	<<<<<<<<<<<<<<<<<<<<<<<9<<;::388998	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:114:714:317	83	seq1	126	99	35M	=	311	220	TGCCAGCACAGGGGCTTAACCTCTGGTGACTGCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5;<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:70:147:84	147	seq1	128	73	35M	=	285	192	CCAGCACAGGGGCTTAACCTCTGGTGACTGCCAGA	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;(5<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:187:227:818	147	seq1	129	99	35M	=	290	196	CAGCACAGGGGCTTAACCTCTGGTGACTGCCAGAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<;<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:77:29:126	83	seq1	131	99	35M	=	315	219	GCACAGGGGCTTAACCTCTGGTGACTGCCAGAGCT	<<<<<<<<<<3<<<<<<<;;;7<;<<449<-:977	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:327:795:103	83	seq1	133	99	35M	=	302	204	ACAGGGGCTTAACCTCTGGTGACTGCCAGAGCTGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:139:117:262	69	seq1	135	0	*	=	135	0	GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC	<<<7<<<<<<<<<<<<<<<<<<<;<;<<<<<37;3	MF:i:-64
+EAS114_30:3:139:117:262	137	seq1	135	76	35M	=	135	0	AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG	<<<<;<<<<<<<<<<<<<:<<<<<:<<8<<<<:<:	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:29:817:854	73	seq1	135	77	35M	=	135	0	AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:29:817:854	133	seq1	135	0	*	=	135	0	GTTCTCAAGGTTGTTGCAAGGGGGTTTATGTGAAC	<<<<<<<<<<<<<<<1..;:;;;;1%407)07&7.	MF:i:-64
+EAS192_3:6:170:169:57	147	seq1	138	99	35M	=	296	193	GGCTTGACCTCTGGTGACTGCCAGAGCTGCTGGCC	<<<<<;<<<<<<;<<<<<<<<<<<<:<<<<<;;+%	MF:i:18	Aq:i:45	NM:i:2	UQ:i:30	H0:i:0	H1:i:1
+B7_595:4:84:802:737	83	seq1	140	68	35M	=	284	179	CTTAACCTCTGGTGACTGCCAGAGCTGCTGGCAAG	<<<<<<<<<<;9<9<<<;<<;73;<<<<<37;1+.	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:78:583:670	147	seq1	142	99	35M	=	316	209	TAACCTCTGGTGACTGCCAGAGCTGCTGGCAAGCT	<<<<<<<<<<;;;<;;<<<:7;5;<5;;<2--8-;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:90:435:691	83	seq1	147	99	35M	=	318	206	TCTGGTGACTGCCAGAGCTGCTGGCAAGCTAGAGT	<<<<<<<<<<;<<<;<<<<:<<<;<81;<<1;784	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:13:122:187	147	seq1	153	99	35M	=	343	225	GACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCCTT	<<<<<<<;<;<<<;<<<<:;6<<<<;;;;:<<%%<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS221_1:6:69:735:1915	83	seq1	154	99	35M	=	321	202	ACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCATTT	<<<<<<<<;<<<<<<<<<;<<<<;<8<<<<;1:<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:66:959:1311	147	seq1	159	95	35M	=	336	212	CAGAGCTGCTGGCAAGCTAGAGGCCCATCTGGAGC	;;4;;;+;;;-01;;&-;;4;;&;;73)(&**274	MF:i:18	Aq:i:31	NM:i:2	UQ:i:12	H0:i:0	H1:i:1
+EAS56_57:6:325:759:288	83	seq1	163	99	35M	=	341	213	GCTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCT	8<;<<<<81<<<<<;<<;<<<;9</;6;;809034	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:82:926:112	83	seq1	164	99	35M	=	328	199	CTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTC	<;<<<<<<<<<5<<<<<<<<<<<<<<<;<<1:<4<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:324:728:956	83	seq1	165	99	35M	=	322	192	TGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCT	<<<<<<<<<<<<<<<<<<<<8<<<:<::;;;;<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:294:525:849	147	seq1	167	99	35M	=	340	208	CTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCTAA	<<<<<<<<<<<<<<<<<<<<<<9+<:<<<<9;;15	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:159:125:297	147	seq1	170	99	35M	=	337	202	GCAAGCTAGAGTCCCATTTGGAGCCACTCTAAGAC	<<<<<<<<<<<<<<;<<<;<;<<6;)<:9;26;39	MF:i:18	Aq:i:43	NM:i:2	UQ:i:26	H0:i:0	H1:i:1
+EAS54_65:6:164:797:930	83	seq1	173	99	35M	=	332	194	AGCTAGAGACCCATTTGGAGCCCCTCTAAGCCGTT	<<<<<<<<<<<<<<<;;;:<<<<<;<;<<<<<,::	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_81:7:293:355:321	147	seq1	174	99	35M	=	356	217	GCTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTC	<<<:<;<<<<<<<;<<<<<<<<<;<<;4<<<:+:<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:1:209:653:400	147	seq1	175	99	35M	=	340	200	CTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCT	<;<9<<+<2<9<,;;64;<<<<;8<00*1<48:+8	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:62:1109:804	147	seq1	176	99	35M	=	350	209	TAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCTA	<<<<<<<<<<<<<:<<:<<<<<<:<:<<<<;;;;;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:303:402:142	147	seq1	181	99	35M	=	343	197	TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT	<8<<<<<<<<<<<<<<<<<<<<<<<46<648;;';	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:321:642:388	147	seq1	181	99	35M	=	357	209	TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<8;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:1:1140:1206	147	seq1	181	99	35M	=	368	222	TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT	;;;;;;;;;;;;;:9;;7;;:;:;97;:;:88888	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:155:68:326	83	seq1	182	99	36M	=	332	186	CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:19:886:279	83	seq1	182	99	35M	=	337	190	CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTA	<9<<<<<<<<<<<<6<28:<<85<<<<<2<;<9<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:4:143:69:578	147	seq1	185	98	35M	=	36	-184	ATTGGGAGCCCCTCTAAGCCGTTCTATTTGTAATG	222&<21<<<<12<7<01<<<<<0<<<<<<<20<<	MF:i:18	Aq:i:35	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_71:4:13:981:659	149	seq1	187	0	*	=	188	35	CGGGACAATGGACGAGGTAAACCGCACATTGACAA	+)---3&&3&--+0)&+3:7777).333:<06<<<	MF:i:-64
+EAS54_71:4:13:981:659	89	seq1	188	37	34M	=	187	-35	TGTAGCCCCTCTAAGGCGTTCTATTTGTAATGAA	()&)06636;;<664*6;<<<<<<<<<<<<<<<1	MF:i:64	Aq:i:0	NM:i:2	UQ:i:14	H0:i:0	H1:i:1
+B7_610:1:37:652:403	147	seq1	193	99	35M	=	347	189	CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT	<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:1:282:274:50	147	seq1	193	99	35M	=	371	213	CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT	<<<<<<<<<<<<<<<<<;<<<<<99<9<5909;5;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:133:460:542	83	seq1	195	99	36M	=	356	197	CCTATAAGCCGTTCTATTTGTAATGAAAACTATATT	<<<<<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_73:5:44:498:945	83	seq1	195	82	35M	=	377	217	CCTATAAGCCGTTCTATTTGTAATGAAAACTATAT	;<;<<<<<<<<<<9<;<:<<<<<<:<<<<;:;<3<	MF:i:18	Aq:i:37	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_610:1:139:152:856	83	seq1	198	99	35M	=	392	229	CTAAGCCGTTCTATTTGTAATGAAAACTATATTTA	<<<<<<<<;<<<<<<<<<<;<;<<<;<<<<;<;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:323:639:311	147	seq1	200	99	36M	=	357	193	AAGCCGTTCTATTTGTAATGAAAACTATATTTAGGC	<<<<<<<<<<<<<<<<<<<2<<<<<<;<<<<<<81<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:23	H0:i:1	H1:i:0
+EAS114_39:2:18:967:582	147	seq1	200	99	35M	=	398	233	AAGCCGTTCTATTTGTAATGAAAACTATATTTATG	<<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<<<8	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:186:850:838	83	seq1	205	99	35M	=	389	219	GTTCTATTTGTAATGAAAACTATATTTATGCTATT	<<<<<;<<<<<<<<<<<:<<<<<;<<<;</<<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:126:558:408	147	seq1	206	99	35M	=	368	197	TTCTATTTGTAATGAAAACTATATTTATGCTATTC	<<<<<<<<<<<<<:<<<<<<<<<<<<<<7<;<<;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:157:643:175	147	seq1	206	99	35M	=	380	209	TTCTATTTGTAATGAAAACTATATTTATGCTATTC	<<<<<<<<;<<<<<<<<<<<<<<<<<<<)<<<<;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:141:711:813	83	seq1	209	99	35M	=	370	196	TATTTGTAATGAAAACTATATTTATGCTATTCAGT	<<<<<<<<<<;<<<<<<<<<<<<<<;<<<<<<:+<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:115:538:276	147	seq1	209	99	35M	=	360	186	TATTTGTAATGAAAACTATATTTATGCTATTCAGT	<<<<<<<<;<<<;;<<<;<:<<<:<<<<<<;;;7;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:51:1429:1043	83	seq1	209	99	35M	=	59	-185	TATTTGTAATGAAAACTATATTTATGCTATTCAGT	9<5<<<<<<<<<<<<<9<<<9<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:176:168:513	147	seq1	210	99	35M	=	410	235	ATTTGTAATGAAAACTATATTTATGCTATTCAGTT	<<<<;<<<<<<<<<<<<<<<<<<<:&<<<<:;0;;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:282:817:710	83	seq1	211	99	35M	=	384	208	TTTGTAATGAAAACTATATTTATGCTATTCAGTTC	<<<<<<<<<<<<<<<<<<<<<<<;:<<<<:8,<<8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:65:787:74	83	seq1	213	88	35M	=	61	-187	TGTAATGAAAACTATATTTATGCTATTCAGTTCTA	44848=:1661/66==?:<=:?6><<<<1>><<<<	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:240:264:231	89	seq1	213	66	35M	=	213	-35	TGTAATGAAAACTATATTTATGCTATTCAGTTCTA	9;,;;62<9<)29<<<;96<<<;<<7<<<<<<;<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:240:264:231	149	seq1	213	0	*	=	213	35	CAACAGATCAAGAAGGAGGGGCAATGGACGAGTTA	%15+5022))0&<<)0)+7:4+&<0<<:0<<<7<<	MF:i:-64
+EAS1_93:7:14:426:613	83	seq1	214	99	35M	=	379	200	GTAATGAAAACTATATTTATGCTATTCAGTTCTAA	======;=;==========;;==3=;==-=<;<;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:173:995:93	147	seq1	215	99	35M	=	382	202	TAATGAAAACTATATTTATGCTATTCAGTTCTAAA	<<<<<<<<<<<<<<<<<<<7:<<<<;:<:<<<<:7	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:195:348:703	147	seq1	215	99	35M	=	353	173	TAATGAAAACTATATTTATGCTATTCAGTTCTAAA	<<<<<<<;<<<<<;:<<<<<<<<<<<<:<1:<:7<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:62:879:264	147	seq1	216	99	35M	=	396	215	AATGAAAACTATATTTATGCTATTCAGTTCTAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:4:83:452:970	83	seq1	216	99	35M	=	379	198	AATGAAAACTATATTTATGCTATTCAGTTCTAAAT	==========================;========	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:64:1318:1711	83	seq1	218	99	35M	=	389	206	TGAAAACTATATTTATGCTATTCAGTTCTAAATAT	<<<<<<<<<<<<<<<<7<<<<<<<:<<<<<2<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:113:968:19	83	seq1	219	99	35M	=	50	-204	GAAAACTATATTTATGCTATTCAGTTCTAAATATA	8;<;8;9<<<<<<<9<:<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:160:896:275	147	seq1	220	99	35M	=	387	202	AAAACTATATTTATGCTATTCAGTTCTAAATATAG	============<====<==<====<==<==;=:6	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:181:191:418	147	seq1	221	99	36M	=	387	202	AAACTATATTTATGCTATTCAGTTCTAAATATAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<988	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:242:354:637	83	seq1	222	99	36M	=	417	231	AACTATATTTATGCTATTCAGTTCTAAATATAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<6<;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:122:77:789	147	seq1	223	99	35M	=	396	208	ACTATATTTATGCTATTCAGTTCTAAATATAGAAA	<<<:<4<<9<:7<<<:<<<7<<<<<<<<<<9<9<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:42:540:501	147	seq1	224	99	36M	=	60	-200	CTATATTTATGCTATTCAGTTCTAAATATAGAAATT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:155:12:674	83	seq1	224	99	36M	=	52	-208	CTATATTTATGCTATTCAGTTCTAAATATAGAAATT	;<<<<<<<<<<;<<<<;<<<<8<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:106:316:452	147	seq1	224	99	36M	=	49	-211	CTATATTTATGCTATTCAGTTCTAAATATAGAAATT	:<<<<<;<<<<:<<:<<<<<<7<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:89:525:113	147	seq1	227	78	40M	=	397	210	TATTTATGCTATTCAGTTATAAATATAGAAATTGAAACAG	<1<7<6;+0;7;7'<70;-<7<:<:<<5<<:9<5:7:%:7	MF:i:18	Aq:i:39	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS54_65:3:321:311:983	147	seq1	228	99	35M	=	51	-212	ATTTATGCTATTCAGTTCTAAATATAGAAATTGAA	;;4;;<7<<<<<<77<<<<<<<<<<17<<<<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:76:493:708	147	seq1	229	44	35M	=	73	-191	TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA	5/)63.&1517(544(055(0454&7706566679	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:125:628:79	147	seq1	229	99	35M	=	400	205	TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA	==================<6<====<<:<==7;::	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:78:583:499	83	seq1	229	74	35M	=	37	-227	TTTACGCTATTCAGTACTAAATATAGAAATTGAAA	&6&9774&<;67<44&-4<;<9<7<<<<<;<<<<<	MF:i:18	Aq:i:37	NM:i:2	UQ:i:27	H0:i:0	H1:i:1
+EAS54_67:3:175:730:949	83	seq1	230	99	35M	=	70	-195	TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC	<<<<;+<<<<7<;<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:84:275:1572	147	seq1	230	99	35M	=	394	199	TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC	/6;;;4;;;;;;;;7;;4;.4;;;;;6;;;77077	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:248:753:731	83	seq1	231	99	35M	=	402	206	TATGCTATTCAGTTCTAAATATAGAAATTGAAACA	<<<<<<<<<<<8<<<<<<<<<<<<:<<<<&<:<.:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:9:1289:215	83	seq1	231	99	35M	=	394	198	TATGCTATTCAGTTCTAAATATAGAAATTGAAACA	;;;;;;9;;;67;;;;;99;9;;;;;;;;977747	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:188:802:71	147	seq1	232	99	35M	=	415	218	ATGCTATTCAGTTCTAAATATAGAAATTGAAACAG	<<<<<<<<<;<<<<<9<<<:<<<:<<<<<<:<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:7:252:171:323	83	seq1	234	99	35M	=	43	-226	GCTATTCAGTTCTAAATATAGAAATTGAAACAGCT	;8<;<=3=6==:====;;======;==========	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:223:142:410	147	seq1	235	99	35M	=	60	-210	CTATTCAGTTCTAAATATAGAAATTGAAACAGCTG	8;<<<;<<<<;<<<<<<;<;<<<<<<<<<<<<;<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:243:10:911	83	seq1	236	99	35M	=	63	-208	TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT	;<;;;<4;9:<<<;<<;<<<<<;;<<<<<<<<<<<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:5:730:1436	147	seq1	236	99	35M	=	403	202	TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT	;;;;;;;;;;;;;;;;;;8;;;;;8;;;;;67777	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:57:1672:1890	89	seq1	236	75	40M	=	236	-40	TATTCAGTTCTAAATATAGAAATTGAAACAGCTGTGTTTA	:;;;9<8;;*<<<<<<:<<<<<<<<1:<<<<<<<<<<<7<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:57:1672:1890	149	seq1	236	0	*	=	236	40	CCCCCCCCCCCCCCCCCAGCCACTGCGGCCCCCCCAGCCA	-+)%)'-'+,,<066,))090+:&486083:5&&:<<5<0	MF:i:-64
+EAS1_105:2:299:360:220	83	seq1	237	99	35M	=	403	201	ATTCAGTTCTAAATATAGAAATTGAAACAGCTGTG	<<<<<<<9<9<<<<<<<<<<<<<<<<<5<;<0<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:24:1037:84	147	seq1	238	99	35M	=	415	212	TTCAGTTCTAAATATAGAAATTGAAACAGCTGTGT	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<;:<57<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:86:823:683	147	seq1	240	99	35M	=	408	203	CAGTTCTAAATATAGAAATTGAAACAGCTGTGTTT	<<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;9<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:130:568:978	83	seq1	246	88	35M	=	434	223	TAAATATAGAAATTGAAACAGCTGTGTTTAGTGAC	7<<;<<;<7<:;<7<<<<<<<<);4;+<7+3+%;<	MF:i:18	Aq:i:24	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS114_45:4:73:1208:495	147	seq1	246	99	35M	=	431	220	TAAATATAGAAATTGAAACAGCTGTGTTTAGTGCC	;;;;;;;;;;;;;;;;;;;;;;;;5;;;;;37377	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:264:642:506	83	seq1	247	99	35M	=	420	208	AAATATAGAAATTGAAACAGCTGTGTTTATTGTAT	<<;<<<<<<;<<<;:;;:;;<<;<<<<;*+;*&.4	MF:i:18	Aq:i:56	NM:i:3	UQ:i:28	H0:i:1	H1:i:0
+EAS114_28:5:104:350:749	147	seq1	247	99	36M	=	415	204	AAATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT	<<8<<<<<<<<<<<;<<<<<<<<0;<<<9;<85;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:227:259:597	147	seq1	248	99	35M	=	61	-222	AATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT	<8<;2;9;<;;-92<;;;<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:113:809:364	83	seq1	250	99	35M	=	413	198	TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<7<;<;<<<4	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:218:877:489	83	seq1	250	86	35M	=	80	-205	TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG	9<<<8<<<;<9<<<<<<<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:20:979:96	83	seq1	254	99	35M	=	79	-210	GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA	'9996;(:;-<;1<<<<=<<<<=<<<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:259:219:114	83	seq1	254	99	35M	=	411	192	GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA	<<<<<<<<<<<<<<<;<<<<<<7<7<<<<<0<<9<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:13:1034:1144	83	seq1	256	99	35M	=	429	208	AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA	<<<<<<<<<<<<<<<<<<<<<<<<3<<<;<<;<++	MF:i:18	Aq:i:69	NM:i:2	UQ:i:48	H0:i:1	H1:i:0
+EAS221_1:2:29:1486:672	147	seq1	256	99	35M	=	79	-212	AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA	<<:<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<++	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS139_11:7:46:695:738	147	seq1	259	74	35M	=	428	204	TGAAACAGCTGAGTTTAGCGCCTGTGTTCACATAG	<;<<<<;<<),&4<3<<7&7<0;)).3;79;7<;0	MF:i:-126	Aq:i:74	NM:i:3	UQ:i:18	H0:i:0	H1:i:0
+EAS139_11:8:26:1221:222	147	seq1	261	99	35M	=	446	220	AAACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:190:727:308	147	seq1	263	99	35M	=	103	-195	ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG	;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:284:261:124	83	seq1	263	99	35M	=	79	-219	ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG	===27===.====&===========;;========	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:141:80:875	147	seq1	265	99	35M	=	110	-190	AGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCA	6/<;84<;<;<<<<<<5<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:24:1135:563	147	seq1	266	99	40M	=	446	220	GCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAACC	<<<<:<<<<:1:<<<<<<.<<<<<<<<;<;;;43+:30::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:90:986:1224	83	seq1	267	99	35M	=	67	-235	CTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAAC	<7*37;;;;;;;9<<;<7<<<<<<<<<<<;;<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:287:492:169	83	seq1	269	99	36M	=	449	216	GTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAAC	<<<7<<<<<<<<<<<<<<<<<<<<<<<8;;<;6<<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:48:9:409	83	seq1	271	75	18M5I12M	=	464	228	GTTTAGTGCCTTTGTTCACATAGACCCCCTTGCAA	<<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS139_19:1:87:1222:878	147	seq1	272	10	40M	=	435	203	TATAGGGCCTTTGTTCAAACCCCTTGCAACAACCTTGAGA	&+6<6&<:<<9<1112<<;)9227</);;;2-79;)/769	MF:i:18	Aq:i:10	NM:i:3	UQ:i:41	H0:i:0	H1:i:0
+B7_591:7:200:192:373	147	seq1	275	75	14M5I17M	=	451	212	AGTGCCTTTGTTCACATAGACCCCCTTGCAACAACC	<<<<<<<<<<<<<<<<<<<<<<<<<:<:<;5<<;<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_65:1:163:846:223	147	seq1	278	74	11M5I19M	=	463	220	GCCTTTGTTCACATAGACCCCCTTGCAACAACCTT	<<<<;<<;4<<<;;9<<<<<+<<;<</27;;47;.	MF:i:-126	Aq:i:74	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:7:283:799:560	83	seq1	283	66	35M	=	121	-197	ACATAGACCCCCTTGCAACAACCTTGAGAACCCCA	<4<6<8;;6<<<+;<:<<;<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:66	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+B7_595:4:84:802:737	147	seq1	284	68	35M	=	140	-179	CATAGACCCCCTTGCAACAACCTTGAGAACCCCAG	+<1<-;69;;;;8;:<<6<;<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:68	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS51_66:5:308:400:602	147	seq1	285	71	35M	=	470	220	ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG	;<<<<<<<<<<<<<<<<<<<<<<<<;;;<<;<;76	MF:i:-126	Aq:i:71	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS54_81:2:285:367:932	147	seq1	285	74	35M	=	440	190	ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG	===========;======;=====;=======5==	MF:i:-126	Aq:i:74	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_39:1:70:147:84	83	seq1	285	73	35M	=	128	-192	ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG	<<<:<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<;	MF:i:-126	Aq:i:73	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS51_62:3:314:386:190	83	seq1	287	98	35M	=	459	207	AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA	++<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<<<	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS56_65:1:53:272:944	83	seq1	287	99	35M	=	447	195	CAACCCCCTTGCAACAACCTTGCGAACCCCAGGGA	<<<<<<<<<<<<.7<.<<<<<<-<-<<<<<&<222	MF:i:18	Aq:i:41	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS188_7:5:112:51:128	147	seq1	287	99	35M	=	477	225	AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA	++<<<<<<<<<<<<<5<<<<<<<<<<<<<<;<;<6	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS56_57:6:44:280:641	147	seq1	288	99	35M	=	454	201	AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA	;<<<<<<<<<<66<;<<<<<;<<2;;;<<;;;;,;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:75:946:1035	83	seq1	288	99	35M	=	480	227	AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA	<<<<<<<<<<;<<<;<<<<<<<8;<6<<<<44<:4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:187:227:818	83	seq1	290	99	35M	=	129	-196	CCCCCTTGCAACAACCTTGAGAACCCCAGGGAATT	<<9<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:40:1128:1940	83	seq1	291	99	35M	=	112	-214	CCCCTTACAACAACCTTGAGAACCCCAGGGAATTT	<<<:///77:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:14	H0:i:1	H1:i:0
+EAS54_71:4:72:63:435	83	seq1	293	99	34M	=	490	232	CCTTGCAACAACCTTGAGAACCCCAGGGAATTTG	<<<<<<<<<<<<<<<<<<<<;<<<;<;;39:7:7	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:271:244:568	83	seq1	294	99	35M	=	481	222	CTTGCAACAACCTTGAGAACCCCAGGGAATTTGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:82:902:868	83	seq1	295	99	35M	=	471	211	TTGCAACAACCTTGAGAACCCCAGGGAATTTGTCA	<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:313:83:546	147	seq1	296	99	35M	=	454	193	TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA	<<<<<<<<<<;<<<<<<<<<<<<<<4<<<:<;<<9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:57:786:414	147	seq1	296	99	35M	=	453	192	TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA	<<<<<<<<<<<<<<<<<<<<<<<:<<:<<:;;7<7	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:260:985:520	147	seq1	296	99	35M	=	468	207	TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA	<<<<<<<<<<<<<<<<<;:;<<;<:<<<,:1;)<;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:170:169:57	83	seq1	296	99	35M	=	138	-193	TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA	778<:<<<9<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:199:327:965	147	seq1	297	91	35M	=	494	232	NCAACAACCTTGAGAACCCCAGGGAATTTGTCAAT	!,+*+++++++++++*+++++++**)+*+**+(**	MF:i:18	Aq:i:19	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+B7_610:5:147:68:353	147	seq1	299	99	35M	=	486	222	AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT	<;<;<<7<<<<<<<7<<;;<7<4<8<<<8.;4;;;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:1:225:195:543	147	seq1	299	99	35M	=	123	-211	AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT	;;8;;+;(<<<<<<<<7;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:303:184:14	147	seq1	301	99	35M	=	479	213	CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA	<<<<<<8<0<<<<-<-98<<--<<<6;076;75+&	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:326:309:149	147	seq1	301	99	35M	=	467	201	CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA	<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<;;;;:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:327:795:103	147	seq1	302	99	35M	=	133	-204	AACCTTGAGAACCCCAGGGAATTTGTCAATGTCAG	;::;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:110:355:323	83	seq1	303	99	35M	=	477	209	ACCTTGAGAACCCCAGGGAATTTGTCAATGTCAGG	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<;;<<8;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:18:1418:237	83	seq1	304	99	35M	=	503	234	CCTTGAGAACCCCAGGGAATTTGTCAATGTCAGGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<7<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:112:203:90	147	seq1	305	99	35M	=	470	200	CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA	<<:<<<<<<<<.<<<<<<<<<<<<6<:867<8884	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:319:246:304	83	seq1	305	99	35M	=	472	202	CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:114:714:317	147	seq1	311	99	35M	=	126	-220	AACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGC	;8<;:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:5:327:991:508	83	seq1	312	99	35M	=	495	218	ACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGCA	<<<<<<<<<<<<<<<<<<<<<;<;:<7:47;:75;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:77:29:126	147	seq1	315	99	35M	=	131	-219	ACAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT	()9;;<<<<<<<<<<5<<<7<<<<<<;<<<;7<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS219_1:1:37:1004:1136	83	seq1	315	99	35M	=	473	193	CCAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT	<<<<<<<<<<<<<<;<<<;<<<<<:<<;;369<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:78:583:670	83	seq1	316	99	35M	=	142	-209	CAGGGAATTTGTCAATGTCAGGGAAGGAGCATTTT	8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:90:435:691	147	seq1	318	99	35M	=	147	-206	GGGAATTTGTCAATGTCAGGGAAGGAGCATTTTGT	;;<;;;+<<:<<<:<;;<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:69:735:1915	147	seq1	321	99	35M	=	154	-202	AATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAG	<<::<<<7<<<<7<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:324:728:956	147	seq1	322	99	35M	=	165	-192	ATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAGT	<;;;;5;<<0<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:269:280:716	83	seq1	323	99	35M	=	490	202	TTTGTCAATGTCAGGGAAGGAGCATTTTTTCAGTT	<<<<<<<<<2<<:2:1<<7/2/:3<<<<*<3($<<	MF:i:18	Aq:i:58	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+EAS54_73:3:88:24:744	147	seq1	325	84	35M	=	484	194	TGTCAATGTCAGGGAAGGAGCATTTTTGAAGTTTA	<7*:<<::.'<<<<:<<:<<'<63'6+'303*%%+	MF:i:18	Aq:i:21	NM:i:5	UQ:i:53	H0:i:0	H1:i:0
+EAS1_108:7:82:926:112	147	seq1	328	99	35M	=	164	-199	CAATGTCAGGGAAGGAGCATTTTGTCAGTTGCCAA	<1:/<*6<<6<<<<<6<<<<<<4<<<<82<+<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS56_63:7:185:213:330	147	seq1	328	99	35M	=	502	209	CAATGTCAGGGAAGGAGCATTTTGTCAGTTACCAA	<<<<<<<<<;<<;<<<<<;<<<<;;;<<;<<;<38	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:277:458:330	147	seq1	329	99	36M	=	490	197	AATGTCAGGGAAGGAGCCTTTTGTCAGTTACCAAAT	<<7<<<<<<<<<2<<<%,<6<&<<,<<<<:<<<<(7	MF:i:18	Aq:i:41	NM:i:1	UQ:i:11	H0:i:0	H1:i:1
+B7_595:1:81:1000:375	147	seq1	329	90	35M	=	524	230	NATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAA	!.............................+.(+.	MF:i:18	Aq:i:19	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS220_1:8:33:672:473	83	seq1	330	99	35M	=	515	220	ATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAAT	<<<<<<<<7<7<7<<62<<<<66<15*/99*5241	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:164:797:930	147	seq1	332	99	35M	=	173	-194	GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGT	;;:;8<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:155:68:326	147	seq1	332	99	36M	=	182	-186	GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGTG	;<<<:6<<<<<<6<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:202:39:380	83	seq1	334	99	35M	=	513	214	CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT	<<<<<<<<<<<<<<<<<;<<:;<<18<84:<&<+<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:42:1091:1726	83	seq1	334	99	35M	=	502	203	CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT	<<<<<<<<<<<<<<<<<<<<<<8<<<<<<8:<.<:	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:66:959:1311	83	seq1	336	95	35M	=	159	-212	GGGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT	67.68:4::6;;;7:6:;:5;8;;<<:;;<;;;;<	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:200:559:765	83	seq1	337	99	36M	=	521	220	GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTAT	<<<<<<<<<<<<<<7<<<<<<;<<;;4<7<9;<<-;	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:328:669:662	83	seq1	337	99	34M	=	512	210	GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT	<<<<<<<<<<<<<<<<<<<<<<<<+9;<;;.<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:159:125:297	83	seq1	337	99	35M	=	170	-202	GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA	89<;;8<<;<;<4<;<8<<<<;;8<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:19:886:279	147	seq1	337	99	35M	=	182	-190	GAAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA	9%<2)2.2::<;<<<2<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:67	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+B7_595:1:209:653:400	83	seq1	340	99	35M	=	175	-200	AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA	<69<98<+<<6<<4<<<<</4<<:<4<<<<<<<<<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:294:525:849	83	seq1	340	99	35M	=	167	-208	AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA	;<;:;:<;<;<<<3<<<;<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:87:1375:1303	147	seq1	340	99	35M	=	529	224	AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA	<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:325:759:288	147	seq1	341	99	35M	=	163	-213	GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC	9;<9<;<;;<;<;<;<<<:<;<<<;<<<<<;<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:76:786:458	147	seq1	341	99	35M	=	502	196	GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC	<<.<<<<2<<:84<:<<<:<8<<)<)429<2<<8<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:210:880:606	147	seq1	341	99	35M	=	518	212	GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAT	<<<<<<<<<<<<<<<<<<;<<<<<<:<<<<3<<8&	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS192_3:3:257:611:440	83	seq1	341	99	35M	=	524	218	GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC	<<<<<<<<<<<<<<<<<<<<8<<<<;<<<<8<<+5	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:303:402:142	83	seq1	343	99	35M	=	181	-197	AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA	;;;;;<9<<8;<<<<7<<;<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:13:122:187	83	seq1	343	99	35M	=	153	-225	AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA	<<&<;;<<<;7<<<<;<;<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:80:885:513	147	seq1	344	99	35M	=	507	198	GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG	<<<<<<<<<<<<<<<<<<<:<<<<2:<;<<75<7;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:90:1873:89	83	seq1	344	99	35M	=	531	222	GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<7<<<7	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:1:37:652:403	83	seq1	347	99	35M	=	193	-189	TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG	<;<<<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:8:28:701:724	147	seq1	347	99	35M	=	521	209	TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG	<<<<<<7<<<<<<7::<:<<-<<::::::<747::	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:66:655:769	83	seq1	348	99	35M	=	515	202	TTTGTCAGTTACCAAATGTGTTTATTACCAGAGGG	8;<<<<<8<<<<<;<<<7<;<<<<<;<7<27<;;7	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:231:339:551	147	seq1	350	99	35M	=	527	212	TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT	<<<<<<;<<<<<<;<<<<<<<<<<;5<<46;<;:1	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:129:694:359	147	seq1	350	88	35M	=	525	210	TGTCAGTTACCAAATGTGTTTATTACCCGAGGGAT	============+7=======:==;;;'=;==7;=	MF:i:18	Aq:i:43	NM:i:1	UQ:i:6	H0:i:0	H1:i:1
+EAS220_1:2:62:1109:804	83	seq1	350	99	35M	=	176	-209	TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT	<<<<<:<<<::<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:157:935:374	83	seq1	353	99	35M	=	512	194	CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA	<<<<<<<<<<;<<;;<<<<<<<<<::8'5++;+11	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:103:111:720	83	seq1	353	99	36M	=	512	195	CAGTTACCAAATGTGTTTATTACCAGAGGGATGGAG	<<<<<<<<<<<<<<<<<<<<<<<<<5<<<5;<5<:;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:311:100:539	147	seq1	353	99	35M	=	508	190	CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA	<<<<;<<<<;<<<<<;<<<<<<<<<:<::;7;<0;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:195:348:703	83	seq1	353	99	35M	=	215	-173	CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA	<9<<9</<<<<<<<<<<<<<<2<8<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:72:308:839	147	seq1	354	99	40M	=	517	203	AGTTACCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG	<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<99494416:	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:133:460:542	147	seq1	356	99	36M	=	195	-197	TTACCAAATGTGTTTATTACCAGAGGGATGGAGGGA	;:;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:293:355:321	83	seq1	356	99	35M	=	174	-217	TTACCAAATGTGTTTATTACCAGAGGGATGGAGGG	<<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:323:639:311	83	seq1	357	99	36M	=	200	-193	TACCAAATGTGTTTATTACCAGAGGGATGGAGGGAA	-94<<<<<<<4<<<<<<<<2<<<<<7<<<-<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:321:642:388	83	seq1	357	99	33M	=	181	-209	TACCAAATGTGTTTATTACCAGAGGGATGGAGG	19<<<<<8<<<<<<<<;<<<<<<<<<<7<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:4:262:456:74	83	seq1	357	99	35M	=	504	182	TACCAAATGTGTTTATTACCAGAGGGATGGAGGGA	<<<<<<<<<<<<<<<<<<<<:;;:;7:<::7<7:3	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:8:95:426:791	83	seq1	359	99	35M	=	547	223	CCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG	<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<,<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:115:538:276	83	seq1	360	99	35M	=	209	-186	CAAATGTGTTTATTACCAGAGGGATGGAGGGAAGA	:<<<<<<<<;;<5<<;<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:196:533:921	83	seq1	361	99	35M	=	526	200	AAATGTGTTTATTACCAGAGGGATGGAGGGAAGAG	=====1========8===:===7======971=3=	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:121:380:656	83	seq1	362	99	35M	=	542	215	AATGTGTTTATTACCAGAGGGATGGAGGGAAGAGG	<<<<<<<<<<<<<<<<<<<<<<<<:<:<<83<:<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:34:970:1374	83	seq1	363	99	35M	=	520	192	ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG	<<<<<<<<<<<<<<;7<77;<<;<;;9;;:86:::	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:29:1061:574	147	seq1	363	99	35M	=	563	235	ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG	<<<<<<<<<<<<<<<<<<;<<<<<<;<<8<:<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:124:243:35	83	seq1	364	60	35M	=	544	215	TGTGTTTATTACCAGAGGGATGGAGGGAAGAGCGA	<<<<<;;<<<<<<:<<<.<<<:++5+:1(;1;$<(	MF:i:18	Aq:i:60	NM:i:1	UQ:i:3	H0:i:1	H1:i:0
+EAS114_30:2:272:750:698	147	seq1	365	80	35M	=	538	208	GTGTTTATTACCAGAGGGATGGAGGGATGACGGAC	<)<<<<<7;<<<4<;7<<<<78068:(%<3*861,	MF:i:18	Aq:i:37	NM:i:2	UQ:i:13	H0:i:0	H1:i:1
+EAS56_53:3:126:558:408	83	seq1	368	99	35M	=	206	-197	TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT	<:<<:;;<<<<<<<<8<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:1:1140:1206	83	seq1	368	99	35M	=	181	-222	TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT	77977::99;;;:;;<;;;:;;;<<;<;;;;<;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:141:711:813	147	seq1	370	99	35M	=	209	-196	TATTACCAGAGGGATGGAGGGAAGAGGGACGCTGA	=<5<5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:1:282:274:50	83	seq1	371	99	35M	=	193	-213	ATTACCAGAGGGATGGAGGGAAGAGGGACGCTGAA	</7;/:<<<<<<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:46:485:482	83	seq1	371	94	35M	=	530	194	ATTACCAGAGGGATGAAGGGAAGAGGGACGCTGAA	<<<<<<<<<<<<<<<<<<<<<<<6<<<<<:<:89<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_63:1:119:446:185	147	seq1	372	99	35M	=	562	225	TTACCAGAGGGATGGAGGGAAGAGGGACGCTGAAG	<<<<<<<7<<<4<<<<9<<54<:<7<5:<::7-5;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:168:69:605	147	seq1	373	67	36M	=	565	228	TACCCGAGGGATGGAGGGTAGAGGGACGCTGAAGTG	<<<4(<<<<<<<<<<<<<(1<6<-<2<<7<<6<<++	MF:i:18	Aq:i:26	NM:i:4	UQ:i:59	H0:i:0	H1:i:0
+EAS114_32:6:78:909:394	147	seq1	373	81	35M	=	554	216	TACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGA	<<<<<<8<<<&<<<-<<<14,4;<<-0<2+<)/82	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:5:41:118:1246	83	seq1	374	99	35M	=	548	209	ACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGAA	<<<<<<<<<<<<<<<<<<<<<<<</<<<<<<1<<(	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:44:498:945	147	seq1	377	82	35M	=	195	-217	ATAGGGATGGAGGGAAGAGGGCCGCTGAAGAACTT	<%*50<7<4<<<7<,<<.<8/,9<:</<<<;<;<<	MF:i:18	Aq:i:37	NM:i:2	UQ:i:15	H0:i:0	H1:i:1
+EAS114_39:5:50:972:1286	147	seq1	377	99	35M	=	559	217	AGAGGGATGGAGGGAAGAGGGACGCTGAAGAACTT	<<<<<<<<<<<<<<<<<;<<<<<<<<<6<<7:7:;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:82:164:1924	147	seq1	378	99	35M	=	542	199	GAGGGATGGAGGGAAGAGGGACGCTGAAGAACTTT	<<<<<<<<<<<<<<<<<<<<8<<<<<<3<<'<7<8	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:7:14:426:613	147	seq1	379	99	35M	=	214	-200	AGGGAGGGAGGGAAGAGGGACGCTGAAGAACTTTG	:<<<<&<<<<<<<<<<<<<<6<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_61:4:83:452:970	147	seq1	379	99	35M	=	216	-198	AGGGATGGAGGGAAGAGGGACGCTGAAGAACTTTG	<<<39<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:157:643:175	83	seq1	380	99	35M	=	206	-209	GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA	;<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:61:1797:113	83	seq1	380	99	35M	=	551	206	GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA	<<<<<<;<<<<;:<3<<<<;;<<<8<<;:<<;3<.	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:90:828:633	147	seq1	381	99	36M	=	537	192	GGATGGAGGGAAGAGGGACGCTGAAGAACTTTGATG	<<<<<<<<<<<8<;96<;<<<<<99<2<<;<96<8;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:61:433:385	147	seq1	381	99	35M	=	579	233	GGATGGAGGGAAGAGGGACGCTGAAGCACTTTGAT	<<<<<<<<<<<<<<<<<;<<;<<6<<)91<<;;,;	MF:i:18	Aq:i:43	NM:i:1	UQ:i:8	H0:i:0	H1:i:1
+EAS1_93:2:173:995:93	83	seq1	382	99	35M	=	215	-202	GCTGGAGGGAAGAGGGACGCTGAAGAACTTTGATG	<(0<<9<<<7<<<<<<7<<<<<<<<<7<<<<<<<<	MF:i:18	Aq:i:73	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS54_71:3:254:32:275	83	seq1	382	99	34M	=	575	228	GATGGAGGGAAGAGGGACGCTGAAGAACTTTGAT	<<<<<<<<<<<<<<<<<<<<<<;;<:<::<:2*<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:282:817:710	147	seq1	384	99	35M	=	211	-208	TGGAGGGAAGAGGGACGCTGAAGAACTTTGATGCC	366=6;======8====:========;========	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:75:217:337	147	seq1	386	99	35M	=	568	217	GAGGGAAGAGGGACGCTGAAGAACTTTGATGCCCT	;;;;;;;;;;;;;;;;;;8;;;;;;;;;;;88787	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:181:191:418	83	seq1	387	99	36M	=	221	-202	AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:160:896:275	83	seq1	387	99	35M	=	220	-202	AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTC	;;;9;<<<<<<;<;;<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:88:1656:896	83	seq1	387	99	40M	=	538	191	AGGGAAGAGGGATGCTGAAGAACTTTGATGCCCTCTTCTT	<<<9<<<<<<<9<<<;<<<<<<<<<;6<<;7<<<<::9:;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_597:8:186:850:838	147	seq1	389	99	35M	=	205	-219	GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT	<;<;<;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:64:1318:1711	147	seq1	389	99	35M	=	218	-206	GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:78:1478:1446	83	seq1	389	99	35M	=	560	206	GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<:<<<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:82:879:246	147	seq1	391	99	35M	=	576	220	AAGAGGGACGCTGAAGAATTTTGATGCCCTCTTCT	<<<<<<<<<<<<<<<<<<&<<<77<<-<<<6<62<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_610:1:139:152:856	147	seq1	392	99	35M	=	198	-229	AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT	<<<<<;<<<<<<<<<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:162:503:769	83	seq1	392	99	35M	=	571	214	AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT	========================:==========	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:216:988:883	147	seq1	392	99	35M	=	584	227	AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT	<<<<<<<<<<<<8;<;88<;8;;;;828;8;8;;;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:118:523:591	147	seq1	393	99	35M	=	563	205	GAGGGACGCTGAAGAACTTTGATGCCCTCTTCTTC	<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<;;<;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:3:168:741:680	147	seq1	394	99	35M	=	562	203	AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC	<<<<<<<<<<<<<<<<<<<<<<<<<1<<<<<<<<<	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:9:1289:215	147	seq1	394	99	35M	=	231	-198	AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC	7747*7;;;;+;;:2;7;:1;;9:;:;:;;:;::;	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:84:275:1572	83	seq1	394	99	35M	=	230	-199	AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC	777777::7:;74;:;:7;:::;;;;:;;8;;;<;	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:122:77:789	83	seq1	396	99	35M	=	223	-208	GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA	9<;<:<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:62:879:264	83	seq1	396	99	35M	=	216	-215	GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA	====:=<============================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:89:525:113	83	seq1	397	78	40M	=	227	-210	GACGCTGAAGAACTTTGATTCCCTCTTCTTCCAAAGATGA	);:+4-&<<+<<:<+<)<<<7<8<8:<:<<:<82::<<2<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_39:2:18:967:582	83	seq1	398	99	35M	=	200	-233	ACGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAG	<:<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:140:522:212	147	seq1	399	99	35M	=	568	204	CGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA	<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<;95;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:125:628:79	83	seq1	400	99	34M	=	229	-205	GCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA	95&<<<<<<<63<<<6<<<<8<;<<8<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:185:312:167	147	seq1	401	99	35M	=	562	196	CTGAAGAACTTTGATGCCCTCTTCTTCCAAAGATG	===========================;855;===	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:248:753:731	147	seq1	402	99	35M	=	231	-206	TGAAGAACTTTGATGCCCTCTTCTTCCAAAGATGA	7;55;=,=89=====3===9=======9=======	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:299:360:220	147	seq1	403	99	35M	=	237	-201	GAAGAACTTAGATGCCCTCTTCTTCCAAAGATGAA	66<;;4;<<()<<4<<<<<<;<<;<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:7	H0:i:0	H1:i:1
+EAS114_45:6:5:730:1436	83	seq1	403	99	35M	=	236	-202	GAAGAACTTTGATGCCCTCTTCTTCCAAAGATGAA	7977979;;;;;;;;;7;3<;2<;26;<;<<;;<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:134:868:252	83	seq1	404	99	36M	=	595	227	AAGAACTTTGATGCCCTCTTCTTCCAAAGATGAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<<:<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:165:431:857	83	seq1	406	99	35M	=	559	188	GAACTTTGATGCCCTCTTCTTCCAAAGATGAAACG	<<<<<<<<<<<<<<<<<<<<<<<6&:<7<:76,;;	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:86:823:683	83	seq1	408	99	35M	=	240	-203	ACTTTGATGCCCTCTTCTTCCAAAGATGAAACGCG	<4<<<<<<<<:<<6<<7<<<8<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:176:168:513	83	seq1	410	99	35M	=	210	-235	TTTGATGCCCTCTTCTTCCAAAGATGAAACGCGTA	;0;;;7:<<<<<<<;<<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:259:219:114	147	seq1	411	99	35M	=	254	-192	TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA	666<:6/:6::6::<:::<<<;<<<<<<<<;<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:84:1013:1074	89	seq1	411	71	35M	=	411	-35	TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA	8;;<;8744<7<<4<<47<<<<<<7<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:84:1013:1074	149	seq1	411	0	*	=	411	35	GCAAGGGGGTCTATGTGAACAAAGGCACTAAACAC	<7<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-64
+EAS54_81:7:325:150:465	83	seq1	412	99	35M	=	598	221	TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<3;;:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:179:13:782	147	seq1	412	99	35M	=	568	191	TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC	<<<<<<<<<<<<<<<<<:<<:7<<<<::<7<:-:1	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:113:809:364	147	seq1	413	99	35M	=	250	-198	GATGCCCTCTTCTTCCAAAGATGAAACGCGTAACT	;<;;;<<<:<6<<<::<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:188:802:71	83	seq1	415	99	35M	=	232	-218	TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC	;;;;<:::<<<<<7<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:204:264:413	83	seq1	415	96	34M	=	593	213	TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTG	<<<<<<<<<<<<<;:59<+<<:<<<9<<;:62<)	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:104:350:749	83	seq1	415	99	36M	=	247	-204	TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGCG	;<93;9;<3;<<<;<<<<<;<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:24:1037:84	83	seq1	415	99	35M	=	238	-212	TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC	<;<<;<<<7<<7&<<<<<<;<<<;<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:242:354:637	147	seq1	417	99	36M	=	222	-231	CCCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT	8<;;;;;<<<8;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:37:761:635	83	seq1	418	99	35M	=	581	198	CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT	<6<<<<<<6<<<<<<<<<<<<<<<<<8<8<<4<4<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:44:1578:1674	83	seq1	418	99	35M	=	573	190	CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT	;<<;<<;<<;;;;;9<;9;;<9:;;<:;9;76669	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:120:63:653	83	seq1	420	99	35M	=	598	213	TCTTCTTCCAAAGATGAAACGCGTAACTGCGCTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<9<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:264:642:506	147	seq1	420	99	35M	=	247	-208	ACTTCATCCAAAGATGAAACGCGTAACTGCGCTCT	&;(-/)-1&:<<9<25<<<<2<1<';8<<<:888<	MF:i:18	Aq:i:56	NM:i:2	UQ:i:13	H0:i:1	H1:i:0
+EAS188_7:3:101:572:491	83	seq1	425	99	35M	=	600	210	TTCCAAAGATGAAACGCGTAACTGCGCTCTCATTC	<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<1<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:27:1881:486	147	seq1	427	99	35M	=	607	215	CCAAAGATGAAACGCGTAACTGCGCTCTCATTCAC	;;;;;;;;;;;;;;1;;;;;;;;78;8;8;8878/	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:120:14:944	147	seq1	428	99	35M	=	621	228	CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT	<<<<<<<<<<<<<<<;<<<<<;<<<<<<<:;8;;7	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:46:695:738	83	seq1	428	74	35M	=	259	-204	CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT	<<<<2<5<<-<<<<<<<4<<<<<<<<<<<<<<3<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:13:1034:1144	147	seq1	429	99	35M	=	256	-208	AAAGATGAAACGCGTAACTGCGCTCTCATTCACTC	<<:%<9)<<<<<<8<<<<9<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:6:91:360:585	83	seq1	430	99	35M	=	586	191	AAGATGAAACGCGTAACTGCGCTCTCATTCACTCC	<<<<9<<<<<;<<<;<<77<<<;<;;<;;<;<;;<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:73:1208:495	83	seq1	431	99	35M	=	246	-220	AGATGAAACGCGTAACTGCGCTCTCATTCACTCCA	8-889<<;<;;:<;<;;;;;;<<;;<;;;;<<;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:16:1081:1894	147	seq1	431	99	35M	=	624	228	AGATGAAACGCGTAACTGGGCTCTCATTCACTCCA	<<<<<<<<<<<<<<<<<<8<<<<;<<;<<<<<<<+	MF:i:18	Aq:i:45	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+EAS188_4:7:35:408:348	85	seq1	433	0	*	=	433	35	GGTTCTCAAGGTTGTTGCAATGGGGTCTATGTGAA	.73<;<<:77<<<<<<<<<<-<<;<<<<<<<<<<<	MF:i:-64
+EAS188_4:7:35:408:348	153	seq1	433	35	35M	=	433	-35	AAGAAACGCGTAACTGCGCTCTCATACACTCCAGC	4,'3<6;)2);<3<-6<;<;7+7<5+<<<7<<<<<	MF:i:64	Aq:i:0	NM:i:2	UQ:i:21	H0:i:0	H1:i:1
+EAS56_53:4:130:568:978	147	seq1	434	88	35M	=	246	-223	TGAAACGCGAAACTGCACTCTCATTCACTCCAGCT	--;066;;62<<<2&<+<+<2;<<2<<<;<<<7<<	MF:i:18	Aq:i:24	NM:i:2	UQ:i:27	H0:i:0	H1:i:0
+EAS139_19:1:87:1222:878	83	seq1	435	34	40M	=	272	-203	TCAGCGCGTCACTCCGCTCTCATTCACCCCAGCTCCCTGT	!!;*:885<&<<<)8&<:<<<8<8<::*<4<88<<<8<<<	MF:i:18	Aq:i:10	NM:i:6	UQ:i:42	H0:i:0	H1:i:0
+EAS51_64:6:143:763:480	85	seq1	436	0	*	=	436	35	CTGAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA	;<&-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-64
+EAS51_64:6:143:763:480	153	seq1	436	70	35M	=	436	-35	AAACGCGTAACTGCGCTCTCATTCACTCCAGCTCC	::3<:6<<<:<<<<7<<<<<<<<)6<<<1<<<<;<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:4:145:607:216	147	seq1	437	99	35M	=	596	194	AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC	<<<<<<<<8<<<<<<<<<<4<<<7<:<<1<<;;99	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:46:285:790	89	seq1	437	72	35M	=	437	-35	AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC	;;<8<;<<<<88<8<<;;<;<<;<<<<<<<<;<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:46:285:790	149	seq1	437	0	*	=	437	35	TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG	!!<<3<<<;;<<<<<<<<<;<;7<<7<<<<<<;<<	MF:i:-64
+EAS56_59:4:329:577:757	85	seq1	437	0	*	=	437	35	TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG	!!<<<<9;<:<<;<<<<<<<<;<<<<<<<<<<<<<	MF:i:-64
+EAS56_59:4:329:577:757	153	seq1	437	72	35M	=	437	-35	AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC	;;;888;<<<<<<6<<<2;<<<<<<;<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:57:722:347	147	seq1	439	99	35M	=	599	195	CGCGTAACTGCGCTCTCATTCACTCCAGCTCCCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:285:367:932	83	seq1	440	74	35M	=	285	-190	GCGTAACTGCGCTCTCATTCACTCCAGCTCCCTGT	9=5==;=;7===;==;===================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:38:842:395	73	seq1	442	77	35M	*	0	0	GTAACTGCGCTCTCATTCACTCCAGCTCCCTGTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<93<;9	MF:i:32	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:8:14:601:624	147	seq1	446	99	35M	=	622	211	CTGCGCTCTCATTCACTCCAGCTCCCTGTCAACCC	<<1<<<<<<<<<<<<<<<<<3<<::<<7<<1,<:(	MF:i:18	Aq:i:69	NM:i:2	UQ:i:18	H0:i:1	H1:i:0
+EAS114_45:3:3:1377:1663	83	seq1	446	99	35M	=	626	215	CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA	<<;;;;<:;;:<;;<;;<;:;;<;9;;::977676	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:26:1221:222	83	seq1	446	99	35M	=	261	-220	CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA	<<<<<<<:<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:82:566:1096	83	seq1	446	99	35M	=	621	210	CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA	<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<;<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:24:1135:563	83	seq1	446	99	40M	=	266	-220	CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA	6+96:87<&8<<79:<;<<<<:<<;<<<<<<;;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:53:272:944	147	seq1	447	99	35M	=	287	-195	TGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAA	&94<4&8.6<6&;<:0:8;;:6;<;:<*<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:287:492:169	147	seq1	449	99	36M	=	269	-216	CGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG	;/;6<<<<4(<(<<<<6<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:49:163:904	147	seq1	450	99	35M	=	616	201	GCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78958	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:200:192:373	83	seq1	451	75	36M	=	275	-212	CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC	<<<8<<<4<4<<<<<:<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:253:285:104	147	seq1	451	99	35M	=	627	211	CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA	======================:========7==;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:151:159:43	83	seq1	452	99	35M	=	645	228	TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC	<<<<<<<;<<<8<<<;<;8<<<<7<77;;79<09+	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:1:115:868:887	147	seq1	452	99	35M	=	650	233	TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC	>>>>>>>>>>>>>>;<>>>>><<>>>;<+<</;;1	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:57:786:414	83	seq1	453	99	35M	=	296	-192	CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC	;;;8;1;:<<<<;<::;;<<<<;<;;<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:197:170:559	89	seq1	453	71	35M	=	453	-35	CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC	<:<;;:<5<5<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:197:170:559	149	seq1	453	0	*	=	453	35	TTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAACA	:;;;;<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-64
+EAS1_103:7:313:83:546	83	seq1	454	99	35M	=	296	-193	TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT	;)<994<;<<<<<<<;<<<<<<<<<<<<<<5<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:44:280:641	83	seq1	454	99	35M	=	288	-201	TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT	9;<<9;9;;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:1:60:837:923	147	seq1	457	61	36M	=	641	220	TTCACGCCAGCTCCCTGTCACCCAATGGACCTCTGA	<<<<<4<<+<<*<<<<88<<<<<'*<4-+<<4&<40	MF:i:18	Aq:i:24	NM:i:2	UQ:i:24	H0:i:0	H1:i:1
+EAS114_45:5:85:401:1190	147	seq1	458	99	35M	=	652	229	TCACTCCAGCTCCCTGTCACCCAATGGACCTGTGA	4;;;1;;;;;;.6;;;(;;/;/;3;;;7;(3&063	MF:i:18	Aq:i:55	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:314:386:190	147	seq1	459	98	35M	=	287	-207	CACTCCAGCTCCCTGTCACCCAATGGACCTGTGAT	76;%;<<3<9;<69<<<7;;;<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:2:831:692	83	seq1	462	99	35M	=	634	207	TCCAGCTCCCTGTCACCCAATGGACCTGTGATATC	<<<<<<<<;<<<<<<<<<<9<<:9<<<;;96<796	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:163:846:223	83	seq1	463	74	35M	=	278	-220	CCAGCTCCCTGTCACCCAATGGACCTGTGATATCT	<7<5<*<<<<0<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:48:9:409	147	seq1	464	75	35M	=	271	-228	CAGCTCCCTGTCACCCAATGGACCTGTGATATCTG	<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:134:751:831	83	seq1	465	99	36M	=	651	222	AGCTCCCTGTCACCCAATGGACCTGTGATATCTGGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<948	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:326:309:149	83	seq1	467	99	35M	=	301	-201	CTCCCTGTCACCCAATGGACCTGTGATATCTGGAT	;;<<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:260:985:520	83	seq1	468	99	35M	=	296	-207	TCCCTGTCACCCAATGGACCTGTGATATCTGGATT	;9;7<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:112:203:90	83	seq1	470	99	35M	=	305	-200	CCTGTCACCCAATGGACCTGTGATATCTGGATTCT	;<;:;<;;;<<<<<<<<<:<<<7<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:308:400:602	83	seq1	470	71	35M	=	285	-220	CCTGTCACCCAATGGACCTGTGATATCTGGATTCT	;77;2<<;<7<<;<<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:82:902:868	147	seq1	471	99	35M	=	295	-211	CTGTCACCCAATGGACCTGTGATATCTGGATTCTG	<<;;<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:153:977:200	147	seq1	472	99	35M	=	640	203	TGTCACCCAATGGACCTGTGATATCTGGATTCTGG	;<<;<<<<7<<;;;;;<<6<<<<<86;;8<;8;6;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:319:246:304	147	seq1	472	99	35M	=	305	-202	TGTCACCCAATGGACCTGTGATATCTGGATTCTGG	;;<;;;<<<<8;<<<<;<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:37:1004:1136	147	seq1	473	99	35M	=	315	-193	GTCACCCAATGGACCTGTGATATCTGGATTCTGGG	</8<<<<7<+<<<<<<<,<<<<<<<<<6<<<<1<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:59:396:359	83	seq1	474	99	35M	=	670	231	TCACCCAATGGACCTGTGATATCTGGATTCTGGGA	<<9;;<;<;;;;<;;9;;;;;<;;;;;<;;77677	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:45:1769:1130	147	seq1	476	99	35M	=	635	194	ACCCAATGGACCTGTGATATCTGGATTCTGGGAAA	;;;;;;;;;;;;9;;;;;;19;;;9;;;;176777	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:110:355:323	147	seq1	477	99	35M	=	303	-209	CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT	6069;1<<;4<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:28:708:463	83	seq1	477	99	36M	=	672	231	CCCAATGGACCTGTGATATCTGGATTCTGGGAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;<:<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:112:51:128	83	seq1	477	99	35M	=	287	-225	CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT	;9<;;:<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:303:184:14	83	seq1	479	99	35M	=	301	-213	CAATGGACCTGTGATATCTGGATTCTGGGAAATTC	:<<.<;;7<:<<<<<<7<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:84:101:328	147	seq1	480	99	35M	=	673	228	AATGGACCTGTGATATCTGGATTCTGGGAAATTCT	<<<;<<<<<<<<;<<<<<<<<<<:<;;<44;;<;<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:228:354:203	83	seq1	480	99	34M	=	643	198	AATGGACCTGTGATATCTGGATTCTGGGAAATTC	88<<<8<<<<<<<<<8<<<<<<<<<4<<<4/9/;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:38:856:336	83	seq1	480	99	33M	=	656	211	AATGGACCTGTGATATCTGGATTCTGGGAAATT	<<<<<<<<<<<;;<;<;<:69<<;<5-500373	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:75:946:1035	147	seq1	480	99	35M	=	288	-227	AATGGACCTGTGATATCTGGATTCTGGGAAATTCT	<<)4</<5<<<<<<<<<<<<<<<<<<<<<66<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:271:244:568	147	seq1	481	99	35M	=	294	-222	ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT	;<<<<<<;<;<<<<<<<<<<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:8:129:477:427	83	seq1	481	99	35M	=	652	206	ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT	<<<<<<<<<<<<<<<<<<;;<<<<::<9<;<<;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:262:297:601	147	seq1	482	99	35M	=	635	188	TGGACCTGTGATATCTGGATTCTGGGAAATTCTTC	<<<<;<<9<<57<<7<<<;<<;77-;;53<<;;<7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:88:24:744	83	seq1	484	84	35M	=	325	-194	GTCCTGTGATATCTGGATTCTGGGAAATTCTTCAT	4%++88;-9<;<<<+8<<<:<;8:<<<<<<<<<<<	MF:i:18	Aq:i:21	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+B7_610:5:147:68:353	83	seq1	486	99	35M	=	299	-222	CCTTTGATATCTGGATTCTGGGAAATTCTTCATCC	<<;;<<<<<<<<+;<<;<<0;<<<<;<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS51_78:7:316:961:576	83	seq1	488	65	35M	=	666	213	TGTGATATCTGGATTCTGGGAAATTCTTCATCCCG	<<<<<<<;<<<<;<<:<<;<;<<:;<9+34;;6%/	MF:i:18	Aq:i:65	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS56_61:8:7:171:402	83	seq1	489	99	35M	=	682	228	GTGATATCTGGATTCTGGGAAATTCTTCATCCTGG	<<<<<<<<<<<<<<<;/<<<<;<<<<<;<<1<<<4	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:277:458:330	83	seq1	490	99	36M	=	329	-197	TGATATCTGGATTCTGGGAAATTCTTCATCCTGGAC	<<<<<8;<<<1<;7<<<;<<<<<<<<7<<7<<<<;7	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:269:280:716	147	seq1	490	99	35M	=	323	-202	TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA	6;<;;6:;<<<;64;<<<<<<<<;<<;<<;<<<<<	MF:i:18	Aq:i:58	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:72:63:435	147	seq1	490	99	35M	=	293	-232	TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA	::<;<<<<;;;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:8:46:900:610	83	seq1	491	99	35M	=	684	228	GATATCTGGATTCTGGGAAATTCTTCATCCTGGAC	<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<;;4;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:189:467:475	83	seq1	493	99	35M	=	683	225	TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC	<<<<<<<<<<<<;;;<<<<<<<<<:<<<<:+<<;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:201:959:19	83	seq1	493	99	35M	=	681	223	TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC	<<<<<<<<<<<<<<;<<<:<;<<;<<;+;+<3494	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:240:593:842	83	seq1	494	99	35M	=	660	201	ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT	============<================9===:=	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:29:381:169	147	seq1	494	99	35M	=	641	182	ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT	<<<<<<<<<<<2<288;<<;<<:4<:<<;&92929	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:199:327:965	83	seq1	494	91	35M	=	297	-232	ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT	<5<:<<<58<:<<<<<<8<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:87:323:895	83	seq1	494	99	35M	=	671	212	ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT	;<<;;;;<<;<959;;;<;:<<;9<;;;4377788	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:5:327:991:508	147	seq1	495	99	35M	=	312	-218	TCTGGATTCTGGGAAATTCTTCATCCTGGACCCTG	0:;::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:6:882:784	147	seq1	496	99	35M	=	686	225	CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGA	<<<<<<<<<<<<<:<<<<<<<<<<<<:6::::<,2	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:175:705:982	83	seq1	496	89	36M	=	660	200	CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG	<<<<;<<;<<<<<<<<<<<<<;<<+<:;39;+<40<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:30:92:753	83	seq1	497	99	35M	=	673	211	TGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG	<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:245:323:744	147	seq1	499	99	35M	=	679	215	GATTCTGGGAAATTCTTCATCCTGGACCCTGAGAG	<;<<<<<<<<<<<<<<<<<<<<<;<+<<<<<<<4<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:76:786:458	83	seq1	502	99	35M	=	341	-196	TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT	;<;:7<.<<<<<8;<<<<<<<6<;8<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:185:213:330	83	seq1	502	99	35M	=	328	-209	TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT	;4<<<;<<<<<<<<;<<;;;<<<<9<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:42:1091:1726	147	seq1	502	99	35M	=	334	-203	TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT	4443838<4<8<87<<3</8<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:12:158:458	83	seq1	503	84	36M	=	675	208	CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT	<77<<<7<<<<<<<<<<<<5<4;<<;5<;;+2<+;;	MF:i:18	Aq:i:15	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:277:590:364	147	seq1	503	99	35M	=	681	213	CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC	<<<<<8<<<<<<<<;<<<<<;;<7<<;;7858;;8	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:18:1418:237	147	seq1	503	99	35M	=	304	-234	CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC	<<:<<<<<<<<:<<<<<<<<<:<<<<<<<<<<<<:	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:4:262:456:74	147	seq1	504	99	35M	=	357	-182	TGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT	862;<<<:;<;<<<;;;<<<<;;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:186:989:869	83	seq1	505	99	34M	=	655	185	GGGAAATTCTTCATCCTGGACCCTGAGAGATTCT	<<<<<<<<<<<<<<<<<<<<7;:<<<<<<<<<$<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:80:885:513	83	seq1	507	99	35M	=	344	-198	GAAATTCTTCATCCTGGACCCTGAGAGATTCTGCA	<7<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:311:100:539	83	seq1	508	99	35M	=	353	-190	AAATTCTTCATCCTGGACCCTGAGAGATTCTGCAG	;<;<<;;<;<<;<<<<<;9<<<;<<<<<<<<9<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:199:511:426	147	seq1	509	99	35M	=	669	195	AATTCTTCATCCTGGACCCTGAGAGATTCTGCAGC	<<<<<<<<<<<<<<;<<<<<<:<<<<<<<<<;:<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:26:227:1053	83	seq1	510	99	35M	=	663	188	ATTCTTCATCCTGGACCCTGAGAGATTCTGCAGCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:172:622:707	83	seq1	511	99	35M	=	685	209	TTCTTCATCCTGGACCCTGAGAGATTCTGCAGCCC	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<5:<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:157:935:374	147	seq1	512	99	35M	=	353	-194	TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCA	94988994.<:<+42::<<<<<:<:<4<<<<;<1<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:103:111:720	147	seq1	512	99	36M	=	353	-195	TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG	;4<<<;)<<-<9<;<<7<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:328:669:662	147	seq1	512	99	35M	=	337	-210	TCTTCATCCTGTACCCTGAGAGATTCTGCAGCCCA	4<<;<<8<.<88.<<;4<<<<<<<4<.<<<<7<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+EAS51_64:5:202:39:380	147	seq1	513	99	35M	=	334	-214	CTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG	/92/;2<+2<<<<64<<<<<<<<<<<<<<<<7<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:66:655:769	147	seq1	515	99	35M	=	348	-202	TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT	8<<;:69<;:;9<2<*9<;6<<<<<17<;<3+<;<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:4:7:526:343	83	seq1	515	99	35M	=	698	218	TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT	<<<<<<<<<<<<<<<:<<<5<<<<<<5;<<<+8<;	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:33:672:473	147	seq1	515	99	35M	=	330	-220	TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT	5<70<<55<4<24.5<<<<<<<<<6<<<<<<2<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:72:308:839	83	seq1	517	99	40M	=	354	-203	ATCGTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT	:8:.:<;<<5<<<<<<<<<<<<<<<<;:<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:2	UQ:i:40	H0:i:0	H1:i:1
+EAS56_61:1:210:880:606	83	seq1	518	99	35M	=	341	-212	TCCTGGACCCTGAGAGATTCTGCAGCCCAGCTCCA	.<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:80:760:490	83	seq1	520	99	34M	=	686	201	CTGGACCCTGAGAGATTCTGCAGCCCAGCTCCAG	<<<<<<<<<<8<;<7<<<<<<;<;;<2<;<<<1,	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:34:970:1374	147	seq1	520	99	35M	=	363	-192	CTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGA	<6<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_593:1:200:559:765	147	seq1	521	99	36M	=	337	-220	TGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT	8<;;4<3;<;<<<<<<5<<;;<<98;;<<<<;<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_53:8:28:701:724	83	seq1	521	99	35M	=	347	-209	TGGACCCTGAGAGATTCTGCAGCCCAGCTCCAGAT	.;..3;8.8<8;<<;9<9<<<7;<<<<<<<<7<<7	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:318:345:156	147	seq1	522	99	35M	=	695	208	GGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT	<<<<<<<<:<<<<<<<<5<:5<<<3:'<72')*;9	MF:i:18	Aq:i:39	NM:i:1	UQ:i:6	H0:i:0	H1:i:1
+B7_595:1:81:1000:375	83	seq1	524	90	35M	=	329	-230	ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGC	;8<;+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:13:1155:631	147	seq1	524	99	40M	=	668	184	ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTG	<<<<<<;<<;<<<<<<;<<<<<9<;<;94<<%<<<7:777	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:257:611:440	147	seq1	524	99	35M	=	341	-218	ACCCTGAGAGATTCTGCAGCCCAGATCCAGATTGC	2<;;8<;;<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_26:6:129:694:359	83	seq1	525	88	35M	=	350	-210	CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT	7777<7<7;77+<3<<;<<;<<<<;<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_11:6:11:285:1567	147	seq1	525	99	35M	=	685	195	CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_95:1:196:533:921	147	seq1	526	99	35M	=	361	-200	CCTGAGAGATTCTGCAGCCCAGATCCAGATTGCTT	7<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_11:2:6:251:1557	147	seq1	526	99	35M	=	700	209	CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:20:492:850	83	seq1	526	78	35M	=	694	203	CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT	<7<<<<<<<<<<<.<54<7&<<<7<74<2<<<2<<	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:231:339:551	83	seq1	527	99	35M	=	350	-212	CTGAGAGATTCTGCAGCCCAGATCCAGATTGCTTG	<;<<;<<<<<<<<<<;:<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_19:4:68:1122:79	83	seq1	528	99	40M	=	687	199	TGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCT	<<<<<<<<<<<<<;<<<<;<<<<<<;<<<4;<<4;99::;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:87:1375:1303	83	seq1	529	99	35M	=	340	-224	GAGAGATTCTGCAGCCCAGATCCAGATTGCTTGTG	:<;<(<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS220_1:8:46:485:482	147	seq1	530	94	35M	=	371	-194	AGAGATTCTGCAGCCCAGATCCAGATTGCTTGTGG	<<<<<::<<<<<<<<6<<<<<<<<<6<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS218_4:7:90:1873:89	147	seq1	531	99	35M	=	344	-222	GAGATTCTGCAGCCCAGATCCAGATTGCTTGTGGT	<<<<;49<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_26:5:238:31:968	83	seq1	534	99	35M	=	717	218	ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTG	9======8====*=====,=1=======<=7:::,	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:78:773:660	147	seq1	534	99	36M	=	711	213	ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTGA	<<<<<<<<;<<<<<<<<<8<8<<;<<<;<<;7<<4:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:90:828:633	83	seq1	537	99	36M	=	381	-192	CTGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG	<<<;<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_30:2:272:750:698	83	seq1	538	80	35M	=	365	-208	TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG	0<;8;64;<<<;<;.<+;:<4;4<;<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_19:3:88:1656:896	147	seq1	538	99	40M	=	387	-191	TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCTGC	6/8::*9/*3*'<88<:9*<<<8<<<;<<<<<<<<;<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+EAS54_61:6:126:541:194	147	seq1	540	97	35M	=	730	225	CAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGC	<<<<<<<<8<<<<<8<<<<<<<<<8<<<428+<80	MF:i:18	Aq:i:43	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+EAS114_28:4:9:55:730	147	seq1	540	99	36M	=	722	218	CAGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT	>>=>>+==>>==<==<=8=><:;8/;7</5724-2;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:278:918:892	83	seq1	541	99	35M	=	720	214	AGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT	=============:====================8	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:243:876:758	83	seq1	541	99	35M	=	712	206	AGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;78<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_65:5:121:380:656	147	seq1	542	99	35M	=	362	-215	GCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTG	:;<<;<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:82:164:1924	83	seq1	542	99	35M	=	378	-199	GCCCAGCACCAGATTGCTTGTGGTCTGACAGGCTG	6<<<<<<-<<<<<<<<<2<<06<9<<<<<1<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS114_30:6:163:312:891	83	seq1	543	99	35M	=	709	201	CCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTGC	<<<<<<<<<;<<<<<<<<<<<<<<<<:;;<;;<;0	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:124:243:35	147	seq1	544	60	35M	=	364	-215	GCATATCCAGATTGCTGGTGGTCTGACAGGCAGCA	&+<+;<694;+&99<<2<;423<26<-<<<<,<3<	MF:i:-126	Aq:i:60	NM:i:2	UQ:i:28	H0:i:0	H1:i:0
+B7_591:1:191:462:705	83	seq1	545	99	36M	=	721	212	CAGATCCAGATTGCTTGTGGTCTGACAGGCTGCAAC	<<<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<::<6	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_610:8:95:426:791	147	seq1	547	99	35M	=	359	-223	GNTCCAGATTGCTTGTGGTCTGACAGGCTGCAACT	!!!!<<<<<;;<<<<;<<;<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:1	UQ:i:23	H0:i:1	H1:i:0
+EAS218_4:5:41:118:1246	147	seq1	548	99	35M	=	374	-209	CTCCAGATTGCTTGTGGTCTGACAGGCTGCAACTG	<<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:27:973:518	83	seq1	549	99	35M	=	691	177	TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT	<<<<<<<<<<<<<<;<<<<7<<<<<<<<88;0:8;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:4:679:110	83	seq1	549	99	35M	=	705	191	TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT	<<<<<<<<<<<<<<<<<<<;<<<<<<<<::<;;:7	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:297:283:948	147	seq1	550	99	35M	=	727	212	CCAGATTGCTTGTGGTCTGACAGGCTGCAACTGTG	<<<<<<<<<<<<<<<<<<<<<<<:<<9;)+1;19-	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:61:1797:113	147	seq1	551	99	35M	=	380	-206	CAGATAGCTTGTGGTCTGACAGGCTGCAACTGTGA	<<0<<&<<<<;<<4;;3<;<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS188_7:6:205:873:464	83	seq1	552	99	35M	=	743	226	AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG	<<<<<<<<<7<<<<<<<<<<<<:<<,:<:<<<<::	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:33:1168:1762	83	seq1	552	99	35M	=	728	211	AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG	<<<<<<<<<<<<<<<<;<<;<;<<<<<<<<:;2::	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:78:909:394	83	seq1	554	81	35M	=	373	-216	ATTGCTTGGTGTCTGACAGGCTGCAACTGTGAGCC	6167&+&&/&//734/3<<<9*<;;3<3<;9<<3<	MF:i:18	Aq:i:21	NM:i:2	UQ:i:19	H0:i:0	H1:i:0
+EAS1_103:2:226:302:758	147	seq1	556	99	35M	=	751	230	TGCTTGTGGTCTGACAGGCTGCAACTTTGAGCGNT	<<<<<<<;;;,<;<92;66<;))42<&2&(/1!!!	MF:i:18	Aq:i:33	NM:i:2	UQ:i:9	H0:i:0	H1:i:1
+EAS114_28:5:206:671:49	147	seq1	557	99	36M	=	719	198	GCTTGTGGTCTGACAGGCTGCAACTGTGAGCCATCA	<<<<<<;<<<<8<<<;;<<<3<<8<8<35+,55;,3	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:165:431:857	147	seq1	559	99	35M	=	406	-188	TTGGGGTCTGACAGGCTGCAACTGTGAGCCATCAC	''7'/;'1%0447<<<*<6<<<*<*<<<<6<<<<<	MF:i:18	Aq:i:53	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS114_39:5:50:972:1286	83	seq1	559	99	35M	=	377	-217	TTGTGGTCTGACAGGCTGCAACTGTGAGCCATCAC	:;;7;7;;0<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:288:552:440	147	seq1	560	87	35M	=	747	222	TGTGGTCTGACAGGCTGCAACTGTGAGCCTTCCAT	<<<<71<77<<<:<<<&<4<<77<16<88&36+%%	MF:i:18	Aq:i:26	NM:i:4	UQ:i:26	H0:i:1	H1:i:0
+EAS221_1:8:78:1478:1446	147	seq1	560	99	35M	=	389	-206	TGTGGTCTGACAGGCTGCAACTGTGAGCCATCACA	<8,8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:275:851:240	83	seq1	561	99	35M	=	743	217	GTGGTCTGACAGGCTGCAACTGTGAGCCATCACAA	<<<<<<<<<<<<<<<<<<<<<<<:<<4<7<<<<<<	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:185:312:167	83	seq1	562	99	35M	=	401	-196	TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT	<<8:<8<<<<<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:1:119:446:185	83	seq1	562	99	35M	=	372	-225	TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT	+70730;<0<77;;<<<<<9<<<<<<9<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:3:168:741:680	83	seq1	562	99	35M	=	394	-203	TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT	<<5<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:67:1797:1931	83	seq1	562	99	35M	=	750	223	TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:228:182:717	83	seq1	563	99	35M	=	729	201	GGTCTGACAGGCTGCAACTGTGAGCCATCCCCATG	<=9============5==5=<,59<=1=<&;&;;7	MF:i:18	Aq:i:66	NM:i:2	UQ:i:10	H0:i:1	H1:i:0
+EAS112_34:7:118:523:591	83	seq1	563	99	35M	=	393	-205	GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG	4:--&0:67<<8:<<<<<<<<<<<:4<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:29:1061:574	83	seq1	563	99	35M	=	363	-235	GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG	<87<5<<9<<<66<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:168:69:605	83	seq1	565	67	36M	=	373	-228	TCTGACAGGCGGCAACTGTGAGCCATCACAATGAAC	'<'<144<0<&<<<<<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:26	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS221_3:4:90:247:212	83	seq1	567	99	35M	=	733	201	TGACAGGCTGCAACTGTGAGCCATCACAATGAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<8<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:140:522:212	83	seq1	568	99	35M	=	399	-204	GACAGGCTGCAACTGTGAGCCATCACAATGAACAA	:;8;:::<<:<<<<<<<<<7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:179:13:782	83	seq1	568	99	35M	=	412	-191	GACAGTCTACAACTGTGAGCCATCACAATGAACAA	&37.3&;3'*<3<;9<9<<5<<<<<<<<<9<<<<<	MF:i:18	Aq:i:39	NM:i:2	UQ:i:11	H0:i:0	H1:i:1
+EAS114_45:3:75:217:337	83	seq1	568	99	35M	=	386	-217	GACAGGCTGCAACTGTGAGCCATCACAATGAACAA	4779797;;;<;:4;;<<<77<;;;7<<;<;<;<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:168:528:288	147	seq1	570	99	35M	=	740	205	CAGGCTGCAACTGTGAGCCATCACAATGAACAACA	<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<;<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:162:503:769	147	seq1	571	99	35M	=	392	-214	AGGCTGCAACTGTGAGCCATCACAATGAACAACAG	;:;1;=8=;:+=====;&==7==============	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:163:618:570	147	seq1	571	99	35M	=	751	215	AGGCTGCAACTGTGAGCCATCACAATGAACAACAG	<<<<<<<8<<<<<<<<<<<<<+<.7<<..<;&;8;	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:2:251:121:479	147	seq1	572	99	35M	=	750	213	GGCTGCAACTGTGAGCCATCACAATGAACAACAGG	<<<<<<<<<<<;:<<<<;:;:<:<;:188;7:<+(	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:44:1578:1674	147	seq1	573	99	35M	=	418	-190	GCTGCAACTGTGAGCCATCACAATGAACAACAGGA	62631;;4;;;8;;48;;7;8;;;;;;;;;8;;;;	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:263:74:407	147	seq1	574	99	35M	=	754	215	CTGCAACTGTGAGCCATCACAATGAACAACAGGAA	<<<<2<<<<<<:<<<9<<4<<<<:<<<<9<999.7	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:254:32:275	147	seq1	575	99	35M	=	382	-228	TGCAACTGTGAGCCATCACAATGAACAACAGGAAG	(6+<;+6:9<<:7:<95<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:82:879:246	83	seq1	576	99	35M	=	391	-220	ACAACTGTGAGCCATCACAATGAACAACAGGAAGA	%+=661;&===:&==1<5======1==========	MF:i:18	Aq:i:43	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS54_71:4:165:397:25	147	seq1	576	99	35M	=	759	217	GCAACTGTGAGCCATCACAATGAACAACAGGAAGA	<<7<<<<<<)97<6<:3:60:3+37-37+<:33:3	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:148:776:486	147	seq1	578	99	35M	=	755	212	AACTGTGAGCCATCACAATGAACAACAGGAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:59:1576:946	83	seq1	578	99	35M	=	761	218	AACTGTGAGCCATCACAATGAACAACAGGAAGAAA	<:<<<<<<<<<<<<:<:<<<<<<<8<<::1<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:61:433:385	83	seq1	579	99	35M	=	381	-233	ACTGTGAGCCATCACAATGAACAACAGGAAGAAAA	<*97<<<<&9<<;<&<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:37:761:635	147	seq1	581	99	35M	=	418	-198	TGTGAGCCATCACAATGAACAACAGGAAGAAAAGG	+37:<088<+<<;<<;<<<<<;<<;<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:178:192:499	147	seq1	582	99	35M	=	768	221	GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT	<<<<<<<;<1<<<<<<;<<;6<<3666;;;;;/6/	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:93:945:176	83	seq1	582	99	35M	=	745	198	GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT	<<<<<<<<<<<<<<<<<<<<<;<<<<;;<;:7;<3	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:216:988:883	83	seq1	584	99	35M	=	392	-227	AAGCCAACACAATGAACAACAGGAAGAAAAGGTCT	(=/1+=&:=&======<==<===============	MF:i:18	Aq:i:68	NM:i:2	UQ:i:12	H0:i:1	H1:i:0
+EAS114_39:1:12:884:219	83	seq1	584	99	35M	=	756	207	GAGCCATCACAATGAACAACAGGAAGAAAAGGTCT	<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<5:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:61:628:681	147	seq1	586	99	36M	=	746	196	GCCATCACAATGAACAACAGGAAGAAAAGGTCTTTC	<<<<<<<<<<<<<<<<<<<;<<<<<<<:<<;;;;;;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:6:91:360:585	147	seq1	586	99	35M	=	430	-191	GACATCACAATGAACAACAGGAAGAAAAGGTCTTT	5&&<<3:;<<<<<<)<<3<<<<<<<;;<<<<;<<<	MF:i:18	Aq:i:67	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS139_11:6:89:1151:1878	83	seq1	587	99	35M	=	757	205	CCATCACAATGAACAACAGGAAGAAAAGGTCTTTC	<;;<<<<<;;;<<<<4;;::;<;8;;<;;8:<8<4	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:40:1596:1433	83	seq1	587	99	40M	=	756	209	CCATCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<1<<<<<::;::	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:4:1620:413	83	seq1	588	99	35M	=	768	215	CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA	<<<<<<<<<<6<<<6<<<;<6<9-1<;<&66<<<2	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:65:1928:1125	83	seq1	588	99	35M	=	784	231	CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA	<<;<<<7<<7<;<7<<<<<<<7<<<<;<.-;<+88	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:123:998:248	147	seq1	589	99	35M	=	776	222	ATCACAATGAACAACAGGAAGAAAAGGTCTTTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;9<<<68<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:240:603:890	147	seq1	590	99	36M	=	740	186	TCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA	<<<<<<<<<<<<<<<<<<;<:<<:<<;<<<<<8865	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:20:762:748	147	seq1	591	99	35M	=	777	221	CACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA	===================================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:246:313:499	83	seq1	592	99	35M	=	757	200	ACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG	<<<<<<<<<<<<<;<;<<<<<<<<;<<<<<;;<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:6:7:858:437	83	seq1	593	99	35M	=	773	215	CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG	<<<<<<<<<<<<<<<<<<<<<;<3<<<<<<<<<33	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:150:933:810	147	seq1	593	99	35M	=	755	197	CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG	===================================	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:204:264:413	147	seq1	593	96	35M	=	415	-213	CAATGAACAACAGAAAGAAAAGTTCTTTCAAAAGG	1==(4=::;/7::&===;====/=;===;;=====	MF:i:18	Aq:i:27	NM:i:2	UQ:i:19	H0:i:0	H1:i:0
+EAS139_11:3:65:556:1505	147	seq1	593	99	35M	=	790	232	CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG	<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:62:386:959	83	seq1	594	99	35M	=	752	193	AATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGT	<<8<<<<;<<<<-<<87;</<;<+<;5<+;;<3;+	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:134:868:252	147	seq1	595	99	36M	=	404	-227	ATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGA	<;<<<8<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:1:252:19:955	83	seq1	596	84	35M	=	771	210	TGAACAAAAGGAAGAAAAGGTCTTTCAAAAGGTGA	<<<<<<<<<<4<<<<9<<+9)9<<4:9+<<0<909	MF:i:18	Aq:i:41	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_67:4:145:607:216	83	seq1	596	99	35M	=	437	-194	TGAAAAACAGGAAGAAAAGGTCTTTCAAAAGGTGA	/;<<&<<8<<<<<<<<<<<<<;872<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_65:8:140:924:923	147	seq1	597	99	35M	=	767	205	GAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGAT	<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<5;<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:120:63:653	147	seq1	598	99	35M	=	420	-213	AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG	<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:204:779:181	147	seq1	598	99	35M	=	779	216	AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG	<<<<<<5<<:<<<<<8<<,<<<<<<<<<<91<91<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:325:150:465	147	seq1	598	99	35M	=	412	-221	AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG	<<:<<<<<<<<;<:<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:57:722:347	83	seq1	599	99	35M	=	439	-195	ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:177:266:842	147	seq1	599	99	35M	=	784	220	ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT	=====)===========8=====7882855355'5	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:183:852:253	147	seq1	599	99	35M	=	773	209	ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<;;<8	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:30:887:404	147	seq1	600	99	35M	=	789	224	CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG	<<<<<<<<<<;<<<<<<<<<<<<<<<<:(<<<7;7	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:101:572:491	147	seq1	600	99	35M	=	425	-210	CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG	8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:2:73:730:487	83	seq1	604	99	35M	=	770	201	AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT	<<<<<<<<<<<<<<<<<<<9<<<<<<:<<<;<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:172:896:83	83	seq1	604	99	34M	=	786	217	AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGT	<<<<<<<<<<<<<<<<<:;;+;<<<<<<<<9;;;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:154:762:630	147	seq1	604	99	35M	=	792	223	AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:99:756:130	147	seq1	606	99	35M	=	798	227	GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:11:360:1577	83	seq1	606	99	35M	=	781	210	GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT	<<<<<<<<<<<<<<<<<4<;;<<;;<;<<<8<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:27:1881:486	83	seq1	607	99	35M	=	427	-215	AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC	99797;;9:<:;;;<;;;;<<<;;;;<;<;;<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:5:497:687	83	seq1	607	99	35M	=	789	217	AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:142:63:937	147	seq1	609	99	36M	=	777	204	GAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC	<<<<<<<<<<<<<<<<<:<<<<<<<<<;<<:<<:<:	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:36:485:632	147	seq1	610	99	36M	=	784	210	AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<;<18;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:8:36:927:478	83	seq1	610	99	35M	=	798	223	AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC	<<<<<<<<<<<<<<<<;<<<<<:<:<<<<8<9;<8	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:169:862:829	147	seq1	611	99	35M	=	772	195	AAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA	<<<<<<<<<<<<<<<<<;<<<;<;<<<<:<;;<78	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:63:424:1643	147	seq1	614	99	35M	=	798	219	GGTCTTTCAAAAGGTGATGTGTGTTCTCATCAACC	;;<<<<<<;<<<<<<<<<<5;9;<<<<<<<<<<;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:20:41:138	83	seq1	615	99	35M	=	774	194	GTCTTTCAAAAGGTGATGTGTGTTCTCATCAACCT	<<<<<<<<<<<<<<<<<<<<<<<<7<;<<<<<(<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:49:163:904	83	seq1	616	99	35M	=	450	-201	TCTTTCAAAAGGTGATGTGTGTTCTCATCAACCTC	79779<<<<<;;;;9;;<<7<;*9<<<7<<;<<;<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:135:543:760	83	seq1	619	99	35M	=	787	203	TTCAAAAGGTGATGTGTGTTCTCATCAACCTCATA	<<<<;;<;<<<<<<<9<<<<<<<<<<<;<<<<5<:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:131:742:561	147	seq1	620	99	35M	=	790	205	TCAAAAGGTGATGTGTGTTCTCATCAACCTCATAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:120:14:944	83	seq1	621	99	35M	=	428	-228	CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA	:;<<;<;<;<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:82:566:1096	147	seq1	621	99	35M	=	446	-210	CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA	<<<<<<<<<<:<<<<<<<:<<<<<<:<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:8:14:601:624	83	seq1	622	99	35M	=	446	-211	AAAAGGTGATGTGTGTTCTCATCAACCTCATACAC	1;;;;==5===.(=9=5=========8====;===	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:5:538:401	83	seq1	624	99	40M	=	788	204	AAGGTGATGTGTGTTCTCATCAACCTCATACACACACATG	<<<<;<<<<<<<<<<<<<<<;<::7<<;<53:<98;;;;;	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:16:1081:1894	83	seq1	624	99	35M	=	431	-228	AAGGTGATGTGTGTTCTCATCAACCTCATACACAC	;5;;&<;<<<<<<<<;<;<<;<<<;<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:3:1377:1663	147	seq1	626	99	35M	=	446	-215	GGTGATGTGTGTTCTCATCAACCTCATACACACAC	6-88663;8;81;;66;8;;89939;;;67;2;;;	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:253:285:104	83	seq1	627	99	35M	=	451	-211	GTGATGTGTGTTCTCATCAACCTCATACACACACA	2<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:66:1282:1215	83	seq1	627	99	35M	=	794	202	GTGATGTGTGTTCTCATCAACCTCATACACACACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:2:1200:1076	147	seq1	629	99	35M	=	786	192	GATGTGTGTTCTCATCAACCTCATACACACACATG	;;;;;;;;;;/;;;;;;;;6;;9;489;;;88888	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:194:688:289	83	seq1	631	99	35M	=	795	199	TGTGTGTTCTCATCAACCTCATACACACACATGGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<:;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:8:19:855:491	83	seq1	631	99	35M	=	783	187	TGTGTGTTCTCATCAACCTCATACACACACATGGT	<<<<<<<<<<<;<<.:<<<<;;;<4<:<:<7<;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:215:133:909	83	seq1	631	99	34M	=	789	193	TGTGTGTTCTCATCAACCTCATACACACACATGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<996(	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:35:378:681	83	seq1	632	99	35M	=	812	215	GTGTGTTCTCATCAACCTCATACACACACATGGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:40:758:116	147	seq1	632	99	40M	=	814	222	GTGTGTTCTCATCAACCTCATACACACACATGGTTTAGGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:7262	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:2:831:692	147	seq1	634	99	35M	=	462	-207	GTGTTCTCATCAACCTCATACACACACATGGTTTA	2749'979<9<<<6;<<<0<;<<<<<3<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:162:594:858	83	seq1	634	99	35M	=	818	219	GTGTTCTCATCAACCTCATACACACACATGGTTTA	<<<<<<<<<<<<<<<<<9<;<<<<<<<<<<3<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:233:478:792	83	seq1	634	99	35M	=	791	192	GTGTTCTCATCAACCTCATACACACACATGGTTTA	<<<<<<<<<<<<<<<<<<<+<<<<<<<9<<<+;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:262:297:601	83	seq1	635	99	35M	=	482	-188	TGTTCTCATCAACCTCATACACACACATGGTTTAG	;;<26;;;<;<7;<<<<<99<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:45:1769:1130	83	seq1	635	99	35M	=	476	-194	TGTTCTCATCAACCTCATACACACACATGGTTTAG	88989;<;97;9<<;<;;;;9<98<<<<<<<;<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:153:977:200	83	seq1	640	99	35M	=	472	-203	TCATCAACCTCATACACACACATGGTTTAGGGGTA	1:<83<<9;;9<<9;;<<;<<;;;;<;;<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:1:60:837:923	83	seq1	641	61	36M	=	457	-220	CATCAACCGCATACACTCACATGGTTTAGGGGTATA	0<4<<<02.<99+<+&!<<<<+<<<<<<<<<<<<3<	MF:i:18	Aq:i:24	NM:i:2	UQ:i:13	H0:i:0	H1:i:0
+EAS51_66:3:29:381:169	83	seq1	641	99	35M	=	494	-182	CATCAACCTCATACACACACATGGTTTAGGGGTAT	2<82<;66<:<;<:<;<;<8<<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:96:836:737	83	seq1	642	99	35M	=	841	234	ATCAACCTCATACACACACATGGTTTAGGGGTATA	<<<<<<71<<<<<<<<<<899<:5<<<96858<<.	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:228:354:203	147	seq1	643	99	35M	=	480	-198	TCAACCTCATACACACACATGGTTTAGGGGTATAA	%1<851<5<<<982<<<<<<<<::<<<<7<<<<3<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:151:159:43	147	seq1	645	99	35M	=	452	-228	AACCTCATACACACACATGGTTTAGGGGTATAATA	;;4;6<<;<<<<7<77<6;<6<<<<<;;<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:182:404:693	147	seq1	646	99	35M	=	812	201	ACCTCATACACACACATGGTTTAGGGGTATAATAC	<<<<<<<<<<<<<<<<<<<<<<:::<6<;<94;77	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:4:841:339	147	seq1	646	99	35M	=	793	182	ACCTCATACACACACATGGTTTAGGGGTATAATAC	<<<<<<<<<<<<<<<<<;<7<<&;;<5<+<;7<<;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:156:857:494	147	seq1	648	99	35M	=	838	225	CTCATACACACACATGGTTTAGGGGTATAATACCT	<<<<<<<<<<<<<<<<<6<<<<<<<<<<<<<<:<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:165:464:123	83	seq1	650	99	35M	=	814	199	CATACACACACATGGTTTAGGGGTATAATACCTCT	===============7==============8====	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:1:115:868:887	83	seq1	650	99	35M	=	452	-233	CATACACACACATGGTTTAGGGGTATAATACCTCT	==;==8=;=;=========================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:134:751:831	147	seq1	651	99	36M	=	465	-222	ATACACACACATGGTTTAGGGGTATAATACCTCTAC	;:<4<8<<<;<;<<5<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:192:716:235	147	seq1	651	99	35M	=	798	182	ATACACACACATGGTTTAGGGGTATAATACCTCTA	======================9==:<==:;;69;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:40:594:752	83	seq1	651	99	35M	=	831	215	ATACACACACATGGTTTAGGGGTATAATACCTCTA	<<<<<<<<<<;<<<;<<<::;<:;<;:<;;;<;<:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:184:17:636	89	seq1	652	76	35M	=	652	-35	TACACACACATGGTTTAGGGGTATAATACCTCTAC	8<89<<:<<<;;;<<<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:184:17:636	149	seq1	652	0	*	=	652	35	TTTTTTTTTTTTTTTTTTTTTTTTTTTTCACAGGT	!!!!!!!!!!!!!!!!!!!!!!!!!!!77777777	MF:i:-64
+EAS1_108:8:129:477:427	147	seq1	652	99	35M	=	481	-206	TACACACACATGGTTTAGGGGTATAATACCTCTAC	<<<9;<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:130:912:658	147	seq1	652	99	35M	=	841	224	TACACACACATGGTTTAGGGGTATAATACCTCTAC	<<<<<;<<<<<<;<<<<<<<<<<<<<<<<<7<;;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:85:401:1190	83	seq1	652	99	35M	=	458	-229	TACACACACATGGTTTAGGGGTATAATACCTCTAC	64778:;69739:;+9::7;;;<;6<;7;;;;;7<	MF:i:18	Aq:i:55	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:4:1502:1911	147	seq1	652	99	40M	=	802	190	TACACACACATGGTTTAGGGGTATAATACCTCTACATGGC	<<<:4<<<<<<;<<<<;9;5<95<;<<;9+;1612:1:::	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:198:691:595	147	seq1	655	99	35M	=	847	227	ACACACATGGTTTAGGGGTATAATACCTCTACATG	==============&===============;7;=1	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:186:989:869	147	seq1	655	99	35M	=	505	-185	ACACACATGGTTTAGGGGTATAATACCTCTACATG	;<<;:<<<7:<<<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:38:856:336	147	seq1	656	99	35M	=	480	-211	CACACATGGTTTAGGGGTATAATACCTCTACATGG	2;4;4<:;6:5:<<;:;<<;<<;<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:49:271:588	147	seq1	658	99	35M	=	830	207	CACATGGTTTAGGGGTATAATACCTCTACATGGCT	<<<<<<<<<<<<<<5:<<<<<<:<<<<<<<:7%9<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:240:593:842	147	seq1	660	99	35M	=	494	-201	CATGGTTTAGGGGTATAATACCTCTACATGGCTGA	*<<<;<<6<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:175:705:982	147	seq1	660	89	36M	=	496	-200	CATGGTTTAGGGGTATAATACCTCTACATGGCTGAT	')'''''')'''''*')*)'*)')))+,'*)+'*,!	MF:i:18	Aq:i:19	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS221_3:6:26:227:1053	147	seq1	663	99	35M	=	510	-188	GGTTTAGGGGTATAATACCTCTACATGGCTGATTA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:316:961:576	147	seq1	666	65	35M	=	488	-213	TTACGGGTGTAATCTCTCTACATGGCTAATTATGA	(++%%+++),+,+*++,+,,-,**+,-&-,+-+--	MF:i:-126	Aq:i:65	NM:i:5	UQ:i:36	H0:i:0	H1:i:0
+EAS56_63:5:96:788:614	147	seq1	667	99	35M	=	862	230	TAGGGGTATAATACCTCTACATGGCTGATTATGAA	<<<<<<<<<<<<<<<<<<<<<<;6;<<;;<;;7;9	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:13:1155:631	83	seq1	668	99	40M	=	524	-184	AGGGGTATAATACCTCTACATGGCTGATTATGAAAACAAT	;:398<<;<<<<<;<3<;;<<<<;;<<<<<<<<<<;<<;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:199:511:426	83	seq1	669	99	35M	=	509	-195	GGGGTATAATACCTCTACATGGCTGATTATGAAAA	<:7:<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:124:241:608	83	seq1	670	99	35M	=	856	221	GGGTATAATACCTCTACATGGCTGATTATGAAAAC	<<<<<<<<<;<<<<<<<<<;;<<<;<<<<;;8;;:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:59:396:359	147	seq1	670	99	35M	=	474	-231	GGGTATAATACCTCTACATGGCTGATTATGAAAAC	28288;;;;;;;;;::;;;;:;;;;;;;;;;;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:87:323:895	147	seq1	671	99	35M	=	494	-212	GGTATAATACCTCTACATGGCTGATTATGAAAACA	55777;;;939;9;;9;;;;9;;;;;;;;;;;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:28:708:463	147	seq1	672	99	36M	=	477	-231	GTATAATACCTCTACATGGCTGATTATGAAAACAAT	;;<;<<====3=====5===================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:84:101:328	83	seq1	673	99	35M	=	480	-228	TATAATACCTCTACATGGCTGATTATGAAAACAAT	<<<<<<<<:<<<<<<<<<6<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:30:92:753	147	seq1	673	99	35M	=	497	-211	TATAATACCTCTACATGGCTGATTATGAAAACAAT	<<<<<<;<<<<<<:<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:8:88:90:59	73	seq1	674	37	35M	=	674	0	ATAATACCTCTACATGTCTGATTATGAAAACAATG	<<<<<<<4;7;<<<;;47;&9..1;6&4<755;1;	MF:i:64	Aq:i:0	NM:i:1	UQ:i:19	H0:i:0	H1:i:1
+EAS112_32:8:88:90:59	133	seq1	674	0	*	=	674	0	TGCACCTCCCTGTTCACCTAGATGCTAGGAGGACA	=7595=92=72.=+5(:4=9092((.2&(&%07%.	MF:i:-64
+B7_593:1:12:158:458	147	seq1	675	84	36M	=	503	-208	TAATAATGCTACATGGATGATTATGAAATCAATGTT	++++++$((+*+++++++++++++&+++++++++++	MF:i:18	Aq:i:15	NM:i:5	UQ:i:40	H0:i:0	H1:i:0
+B7_593:4:28:781:723	83	seq1	676	99	36M	=	855	215	AATACCTCTACATGGCTGATTATGAAAACAATGTTC	<<<<<<<<<7<<<;;<<;;<<;<5<4<7<;7<+:<9	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:27:856:401	147	seq1	679	99	35M	=	871	227	ACCTCTACATGGCTGATTATGAAAACAATGTTCCC	======6===;2==;===;=+=92=;5+=&556:6	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:245:323:744	83	seq1	679	99	35M	=	499	-215	ACCTCTACATGGCTGATTATGAAAACAATGTTCCC	/.848299;&;9;9;=2.=7========;;=====	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:31:948:254	83	seq1	680	99	35M	=	849	204	CCTCTACATGGCTGATTATGAAAACAATGTTCCCC	<<<<<<<<<<<<<<<<<<<;<<<<<:<<8<;;;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:277:590:364	83	seq1	681	99	35M	=	503	-213	CTCTACATGGCTGATTATGAAAACAATGTTCCCCA	:::<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:201:959:19	147	seq1	681	99	35M	=	493	-223	CTCTACATGGCTGATTATTAAAACAATGTTCCCCA	;4;.9<:0&/<5<::<<9/.<<<<<<<<<<<<;<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS56_61:8:7:171:402	147	seq1	682	99	35M	=	489	-228	TCTACATGGCTGATTATGAAAACAATGTTCCCCAG	:086::::847:<7<<7<<<<<<;7<<;<<<<7<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:67:317:249	83	seq1	683	26	35M	=	840	192	CTACATGGCTGATTATGAAATCTATGTTCCCCATA	<<<<<<;<<<<;:;<<7;<<.<&3<;;<<(;;6.<	MF:i:18	Aq:i:26	NM:i:3	UQ:i:31	H0:i:0	H1:i:0
+EAS51_64:4:189:467:475	147	seq1	683	99	35M	=	493	-225	CTACATGGCTGATTATGAAAACAATGTTCCCCAGA	*.;*;7<75<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:8:46:900:610	147	seq1	684	99	35M	=	491	-228	TACATGGCTGATTATGAAAACAATGTTCCCCAGAT	<;5<;<<<;<<<<<<;<<<<<<<<<<8<<<<<8<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:232:351:909	83	seq1	685	80	36M	=	843	194	ACATGGCTGATTATGAAATCAATGTTCCCCAGATGC	<<<<<99<<<<<<99<7<'<9<<<6<<+<;7;<<&;	MF:i:18	Aq:i:39	NM:i:2	UQ:i:11	H0:i:0	H1:i:1
+EAS139_11:6:11:285:1567	83	seq1	685	99	35M	=	525	-195	ACATGGCTGATTATGAAAACAATGTTCCCCAGATA	<8<4<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:172:622:707	147	seq1	685	99	35M	=	511	-209	ACATGGCTGATTATGAAAACAATGTTCCCCAGATA	92<3996;<<<<<<<<<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:6:882:784	83	seq1	686	99	35M	=	496	-225	CATGGCTGATTATGAAAACAATGTTCCCCAGATAC	4;7<;64<<:<<4<<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:80:760:490	147	seq1	686	99	35M	=	520	-201	CATGGCTGATTATGAAAACAATGTTCCCCAGATAC	%::::+<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:68:1122:79	147	seq1	687	99	40M	=	528	-199	ATGGCTGATTATGAAAACAATGTTCCCCAGATACCATCCC	::77*:1<<<<<<<<<<<<<<<:;<<<;<<<<<<8<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:264:988:663	83	seq1	688	99	35M	=	875	222	TGGCTGATTATGAAAACAATGTTCCCCAGATACCA	<<<<<<<<<<<1<4<<<4<<0<;<-<74*(<&51-	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:3:233:911	147	seq1	688	99	35M	=	868	215	TGGCTGATTATGAAAACAATGTTCCCCAGATACCA	<<<<<<<<<<<<<<<<<;<<<<<<<<<<;<;<<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:187:925:547	83	seq1	689	99	35M	=	857	203	GGCTGATTATGAAAACAATGTTCCCAAGATACCAT	43<<<:9<;;;:7<<<<6<:<8<-4-/,81<(48:	MF:i:18	Aq:i:37	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS56_65:5:75:637:650	147	seq1	691	99	35M	=	868	212	CTGATTATGAAAACAATGTTCCCCAGATACCATCC	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:27:973:518	147	seq1	691	99	35M	=	549	-177	CTGATTATGAAAACAATGTTCCCCAGATACCATCC	+<<<<<<9<<<<<<<<<<<;<;<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:20:492:850	147	seq1	694	10	35M	=	526	-203	AGTATGAAAACAATGTTCCCCAGATGCCGTCCCGG	:.5:+.;;&91:;79:766:1:9+6&:1&&:+:))	MF:i:18	Aq:i:10	NM:i:4	UQ:i:31	H0:i:0	H1:i:0
+EAS51_64:4:318:345:156	83	seq1	695	99	35M	=	522	-208	TTATGAAAACAATGTTCCCCAGATACCATCCCTGT	;8<8<<<<<;<<:<<;<;77<<<<<;<<;<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:5:863:302	83	seq1	698	99	35M	=	866	203	TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:4:7:526:343	147	seq1	698	99	35M	=	515	-218	TGAAAACAGTGTTCCCCAGATACCATCCCTGTCTT	(7:;;;<<;;;<1<1<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS114_26:2:73:513:102	83	seq1	698	99	35M	=	868	205	TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT	===========================;=======	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:6:251:1557	83	seq1	700	99	35M	=	526	-209	AAAACAATGTTCCCCAGATACCATCCCTGTCTTAC	<<<<<<<<<<<<6:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:147:64:416	83	seq1	701	99	35M	=	870	204	AAACAATGTCCCCCAGATACCATCCCTGTCTTACT	<<<<<<<<<<<<<<<;<<<<<;<<<<;;:<;;;;;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_595:3:297:637:86	147	seq1	704	99	35M	=	869	200	CAATGTTCCCCAGATACCATCCCTGTCTTACTTCC	<<<<<<<<<<<<;+<+;<;<:<<<<<9<<957<;(	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:160:272:398	147	seq1	705	99	35M	=	891	221	AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA	9<<<3<<<<<<<<<<<9<<;8<<<<;<+.;;89..	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:4:679:110	147	seq1	705	99	35M	=	549	-191	AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:163:312:891	147	seq1	709	99	35M	=	543	-201	TTCCCCAGATACCGTCCCTGTCTTACTTCCAGCTC	0.<;;8<<<0<<<<<<<<<<6<<<<<<8<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_28:3:78:773:660	83	seq1	711	99	36M	=	534	-213	CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC	7<;7<<<7;9<<8;<<<<<<;<<<<<<<<<<7<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:5:63:875:1339	147	seq1	711	99	35M	=	879	203	CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCC	<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:243:876:758	147	seq1	712	99	35M	=	541	-206	CCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC	0%3<1;.70;3363;31;<<<<<<6<<<;<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:104:153:698	147	seq1	713	99	36M	=	896	219	CCAGATACCATCCCTGTCTTACTTCCAGCTCCCCAG	;<<<<<<;6<<<<<<<<<<;<<<<;<;;;<.<::50	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:86:498:373	147	seq1	716	99	35M	=	894	213	GATACCATCCCTGTCTTACTTCCAGCTCACCAGAG	<<<<<<<<<<<<<<<<<<<<<<<5:<<<:<;7+67	MF:i:18	Aq:i:69	NM:i:1	UQ:i:25	H0:i:1	H1:i:0
+EAS1_95:6:87:734:888	147	seq1	717	99	35M	=	900	218	ATACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG	===========;8=========;;=;====;;3(;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:238:31:968	147	seq1	717	99	35M	=	534	-218	ACACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG	=(.7=5%===9:7==+==77===============	MF:i:18	Aq:i:69	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS54_65:3:290:558:349	83	seq1	719	99	35M	=	869	185	ACCATCCCTGTCTTACTTCCAGCTCCCCAGCGGGA	<<<;<<;<;<188<<<8::<686+4:<<6:&3)*&	MF:i:18	Aq:i:59	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_28:5:206:671:49	83	seq1	719	99	36M	=	557	-198	ACCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA	;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:278:918:892	147	seq1	720	99	35M	=	541	-214	CCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA	=6=3=<===&=========================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:1:191:462:705	147	seq1	721	99	36M	=	545	-212	CATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAG	<<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:9:55:730	83	seq1	722	99	36M	=	540	-218	ATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAGC	<:<;;<6<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:45:462:455	147	seq1	723	99	35M	=	874	186	TCCCTGTCTTACTTCCAGCTCCCCAGACGGAACGC	<<<<<<8<<<;<;<<<;<<<<<<<6;8&:80;733	MF:i:18	Aq:i:43	NM:i:2	UQ:i:27	H0:i:0	H1:i:1
+EAS114_28:2:149:650:44	147	seq1	726	99	36M	=	902	212	CTGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC	<<<<<<<<<<<<<<<<<<<<<<<<<;6<<;<<7<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:297:283:948	83	seq1	727	99	35M	=	550	-212	TGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC	6;;3;6<<66<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:33:1168:1762	147	seq1	728	99	35M	=	552	-211	GTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCA	79<9;3<<<4<<<97<;;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:228:182:717	147	seq1	729	99	35M	=	563	-201	TCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAA	778;8;474<<<;2;;<2<<<<<<<<;<;;9<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:8:1351:1986	147	seq1	729	99	35M	=	911	217	TCTTACTTCCAGATCCCCAGAGGGAAAGCTTTCAA	<<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS51_64:4:163:31:455	147	seq1	730	99	35M	=	886	191	CTTACTTCCAGCTCCCCAGAGGGACAGCTNNCAAC	<+<<<<<<<;0+<<<<;06070-9(0(9<!!5)05	MF:i:18	Aq:i:31	NM:i:3	UQ:i:7	H0:i:0	H1:i:1
+EAS54_61:6:126:541:194	83	seq1	730	97	35M	=	540	-225	AGTACGACCAGCTCCCCAGAGGGAAAGCTTTCAAC	+%&:/+(46=47&71/2==;=;8====28212===	MF:i:18	Aq:i:43	NM:i:4	UQ:i:40	H0:i:1	H1:i:0
+EAS51_62:7:178:286:414	147	seq1	731	99	35M	=	907	211	TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG	<<<<<<<<<<<<<<<<8<<<<<<<<<1<<<1;998	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:35:361:546	147	seq1	731	99	35M	=	892	196	TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG	<<<<<<<<<<<<<<<<;<5<<<<<;<2<<<:<8<4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:90:247:212	147	seq1	733	99	35M	=	567	-201	ACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCT	7655:;87;<;;;8<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:149:354:667	83	seq1	734	99	35M	=	888	189	CTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCTT	<<<<<<<<<<<<<<<<<<<><<<<<<<<;<:<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:240:603:890	83	seq1	740	99	36M	=	590	-186	GCTCCCAAGAGGGAAAGCTTTCAACGCTTCTAGCCA	;+&+//&<<<<<<<<<<9<<<8<<<<9<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_591:7:129:956:115	147	seq1	740	99	36M	=	927	223	GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;877-	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:168:528:288	83	seq1	740	99	35M	=	570	-205	GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCC	8<%<31;<<;<;<<<<<<<;<<<<<<<<<<;<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:275:851:240	147	seq1	743	99	35M	=	561	-217	CCCCAGAGGGAAAGCTTTCAACGTTTCTAGCCATT	66614/&3616630666&66666&66666868666	MF:i:18	Aq:i:31	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS188_7:6:205:873:464	147	seq1	743	99	35M	=	552	-226	CCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCATT	<-((+:+;289<--;<;-;<:;;<<<;;<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:37:610:260	147	seq1	745	99	35M	=	913	203	CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC	<<<;<;<<7<<<<<<<<<<<<<<;6<963;;;3;1	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:93:945:176	147	seq1	745	99	35M	=	582	-198	CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC	6;;;8<<3<<8.<;6)<<<<<9<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:61:628:681	83	seq1	746	99	36M	=	586	-196	CAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTCTT	95<<<<<<<<;<<<<;<<<:<<;;<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:288:552:440	83	seq1	747	87	35M	=	560	-222	AGAGGGAACGCTTTCAACTCTTCTAGCCATTTCTT	9<<%'%<<.2<<<<<<<<5:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:26	NM:i:2	UQ:i:33	H0:i:0	H1:i:0
+EAS56_53:2:170:265:818	147	seq1	748	10	35M	=	920	207	GAGGGGAAGCTTTCAACGCTTCTAGCACTTTCTTT	<<<<<(5/959<8.<9<8<<<2<&59&&:22:8+(	MF:i:18	Aq:i:10	NM:i:3	UQ:i:17	H0:i:0	H1:i:0
+B7_595:2:251:121:479	83	seq1	750	99	35M	=	572	-213	GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG	<<<<<6'..663;&<<;<<9<<<9<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:67:1797:1931	147	seq1	750	99	35M	=	562	-223	GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:226:302:758	83	seq1	751	99	35M	=	556	-230	GGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGG	;<<<<9;<<<<<<<<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:33	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:163:618:570	83	seq1	751	99	35M	=	571	-215	GGAAAGCTGTCAACGCTTCTAGCCATTTCTTTTGG	<9774<88&:8<:8<8:8<8<<<<<;88<88<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS1_97:3:73:292:429	83	seq1	752	99	35M	=	920	203	GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTTGC	<<<<<<<<<<7<<;<<<<<<<2<<<5<<<<<:%)<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_108:3:82:356:253	83	seq1	752	99	35M	=	927	210	GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC	===================<========;===39=	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:62:386:959	147	seq1	752	99	35M	=	594	-193	AAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC	%;71131((<<6<92(+<1<<;<-3<8<<;<;;<<	MF:i:18	Aq:i:57	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_62:3:263:74:407	83	seq1	754	99	35M	=	574	-215	AAGCTTTCAACGCTTCTAGCCATTTCTTTTGGCAT	;;88<::+;<)<5<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:67:620:344	83	seq1	755	99	35M	=	905	185	AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT	<<<<2<:2<<<<<<7<<<<:<<*<<<<<<***3<<	MF:i:18	Aq:i:33	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:148:776:486	83	seq1	755	99	35M	=	578	-212	AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT	;:<<<;<<;<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:150:933:810	83	seq1	755	99	35M	=	593	-197	AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT	:89===:=:=;;==;====================	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:102:467:897	83	seq1	756	97	35M	=	940	219	GCTTTCAACGCTTCTAGCCATTTCTTTTGTCTTTT	<<<<9<<<<9<2<<<&,/</<<<<7<<;&&<$;*<	MF:i:18	Aq:i:37	NM:i:2	UQ:i:8	H0:i:1	H1:i:0
+EAS114_39:1:12:884:219	147	seq1	756	99	35M	=	584	-207	GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTT	7;::<:<<<7<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:40:1596:1433	147	seq1	756	99	40M	=	587	-209	GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT	-:8:1841<4;<88<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:7:761:623	83	seq1	757	99	35M	=	938	216	CTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTG	<<<<<<<<<<<<<8<<<<;;<0<<<<<;;<;<;;&	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:246:313:499	147	seq1	757	99	35M	=	592	-200	CTTTAAACGCTTCTAGCCATTTCTTTTGGCATTTG	+;77%;;;&:;:7;<<<<<6<:<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS139_11:6:89:1151:1878	147	seq1	757	99	35M	=	587	-205	CTTTCAACGATTCTAGCCATTTCTTTTGGCATTTG	8<66,,<<<<<<:<<<<<9<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_71:4:165:397:25	83	seq1	759	99	34M	=	576	-217	TTCAACGCTTCTAGCCATTTCTTTTGGCATTTGC	&(33'60;-'+'<7;<<*3-<;;183<<<;<;<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:59:1576:946	147	seq1	761	99	35M	=	578	-218	CAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT	9<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:256:407:470	147	seq1	762	99	35M	=	939	212	AACGCTTCTAGCCATTTCTTTTGGCATTTGCCTTC	<<<<<<<<;<;<<<<<<<<<;;<</<<;;83;7;9	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:148:437:481	147	seq1	764	99	36M	=	949	221	CGCTTCTAGCCATTTCTTTTGGCATTTGCCTTCAGA	<<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<;0;8	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:140:924:923	83	seq1	767	99	35M	=	597	-205	TTTTAGCCATTTCTTTTGGCATTTGCCTTCAGACC	<<&<<;;<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_103:4:143:560:194	83	seq1	768	99	35M	=	946	213	TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC	<<<<;;<<<<<<<<<<<6<;<<<<;;<<;9<999<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:178:192:499	83	seq1	768	99	35M	=	582	-221	TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC	86<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:4:1620:413	147	seq1	768	99	35M	=	588	-215	TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC	-<<<7<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:2:73:730:487	147	seq1	770	99	35M	=	604	-201	TAGCCATTTCTTTTGGCATTTGCCTTCAGACCCTA	<;;<<2;<;<<<;0<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:179:389:585	147	seq1	770	24	35M	=	953	218	TGGCCACTTTTTATCGCATTTCCCTTTAGAACCTA	<.4<9.4+.+'&-220<+<4<6<<20*6;<0(9<%	MF:i:-126	Aq:i:24	NM:i:7	UQ:i:103	H0:i:0	H1:i:0
+B7_595:1:252:19:955	147	seq1	771	84	35M	=	596	-210	AGCCAGTTCTTTTGGCATTTGCCTTCAGACCCTCC	<8<884<<<<<<68<<<<<<<2<;<<;<+<<<;<<	MF:i:18	Aq:i:41	NM:i:2	UQ:i:46	H0:i:0	H1:i:1
+EAS54_71:4:169:862:829	83	seq1	772	99	34M	=	611	-195	GCCATTTCTTTTGGCATTTGCCTTCAGACCCTAC	,1<6<<<<<7<<<<<<<<<<<<<<<<<7<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:6:7:858:437	147	seq1	773	99	35M	=	593	-215	CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC	7;<4;;:;80<;<;<<<<<<:<<;<<<;;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:183:852:253	83	seq1	773	99	35M	=	599	-209	CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC	;<9<;<<<<<<<<;<<<<<;<<<;<<<<;<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:20:41:138	147	seq1	774	99	35M	=	615	-194	CATTTCTTTTGGCATTTGCCTTCAGACCCTACACG	;;;<;<<<::<<<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:123:998:248	83	seq1	776	99	35M	=	589	-222	TTTCTTTTGGCATTTGCCTTCAGACCCTACACGAA	;:;5;<;:<9<<<<<:<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:142:63:937	83	seq1	777	99	36M	=	609	-204	TTCTTTTGGCATTTGCCTTCAGACCCTACACGAATG	;;;<;<<<<;<<<<<;:<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:20:762:748	83	seq1	777	99	35M	=	591	-221	TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT	=:747;7=;;==7=;==7===7==7;=========	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:149:953:349	83	seq1	777	99	35M	=	915	173	TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT	<<<<<<<<;<<<<<<<<<<<;7:<:<<:<:;;::;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:46:981:766	147	seq1	778	99	35M	=	933	190	TCTTTTGGCATTTGCCTTCAGACCCTACACGAATG	<<<<<<<<<<<<<;<<<<<-<;<<<<-<-<;-:6;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:204:779:181	83	seq1	779	99	35M	=	598	-216	CTTTTGGCATTTGCCTTCAGACCCTACACGAATGC	;:;/*<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:11:360:1577	147	seq1	781	99	35M	=	606	-210	TTTGGCATTTGCCTTCAGACCCTACACGAATGCGT	1<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:5:491:391	83	seq1	782	99	35M	=	917	170	TTGGCATTTGCCTTCAGACCCTACACGAATGCGTC	=========;===;==:4=========;3;==7;=	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:186:199:927	83	seq1	783	99	35M	=	802	54	TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT	<77<<<<2<;<<<<<06<<<<<<<<60<<684/6&	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:8:19:855:491	147	seq1	783	99	35M	=	631	-187	TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT	8<<<<;:<<<<:<<<<<:<;;<<<<<<<;<<<;<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:36:485:632	83	seq1	784	99	36M	=	610	-210	GGCATTTGCCTTCAGACCCTACACGAATGCGTCTCT	0;;;<<;<<<;<<<<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:177:266:842	83	seq1	784	99	35M	=	599	-220	GGCATTTGCCTTCAGACCCTACACGAATGCGTCTC	<9<<6;9<;9;;<<<<;;;9<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:65:1928:1125	147	seq1	784	99	35M	=	588	-231	GGCATTTGCCTTCAGACCCTACACGAATACGTCTC	<+<<<2<4<<<0<<4<<<<<6<<<6<<<'<<<<0<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:6	H0:i:0	H1:i:1
+EAS221_3:4:66:584:407	147	seq1	785	99	35M	=	954	204	GCATTTGCCTTCAGACCCTACACGAATGCGTCTCT	<<<*9<9<<<1<<<<<<<<*<59<4<)<2<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:172:896:83	147	seq1	786	99	35M	=	604	-217	CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA	;<.5.;;<+;<<<<<<<4<<<<<<<;<<<<<;<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:2:1200:1076	83	seq1	786	99	35M	=	629	-192	CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA	7779779;9;:;;4;;9;;:7;<<<7;;;:<;<<;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:135:543:760	147	seq1	787	99	35M	=	619	-203	ATTTGCCTTCAGACCCTACACGAATGCGTCTCTAC	;;.;;8;<8;<<32;<<<<<7<<<<<9<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:5:538:401	147	seq1	788	99	40M	=	624	-204	TTTGCCTTCACACCCTACACGAATGCGTCTCTGCCACAGG	671&7::49:&0<<<(<::<&<<<:<<<<<<<&<<<<1<<	MF:i:18	Aq:i:39	NM:i:2	UQ:i:10	H0:i:0	H1:i:1
+EAS54_71:6:215:133:909	147	seq1	789	99	35M	=	631	-193	TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA	7758;<;<;8<<<<;<;<<<<<:;<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:30:887:404	83	seq1	789	99	35M	=	600	-224	TTGCCTTCAGACCCTGCACGAATGCGTCTCTACCA	<<<<5<;::<<<;<<.<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:13	H0:i:0	H1:i:1
+EAS219_1:1:5:497:687	147	seq1	789	99	35M	=	607	-217	TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA	<8<<8<<<;<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:131:742:561	83	seq1	790	99	35M	=	620	-205	TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC	<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:65:556:1505	83	seq1	790	99	35M	=	593	-232	TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC	<6<8<<4<8;;;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:233:478:792	147	seq1	791	99	35M	=	634	-192	GCCTTCAGACCCTACACGAATGCGTCTCTACCACA	6<;9:<<9-<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:66:257:524	83	seq1	791	99	35M	=	959	203	GCCTTCAGACCCTACACGAATGCGTCTCTACCACC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<%	MF:i:18	Aq:i:73	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS56_53:4:154:762:630	83	seq1	792	99	35M	=	604	-223	CCTTCAGACCCTACACGAATGCGTCTCTACCACAG	<<-::<91<<<<;<;<<<<;<<<<<<<<;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:4:841:339	83	seq1	793	99	35M	=	646	-182	CTTCAGACCCTACACGAATGCGTCTCTACCACAGG	77-):22<<<33;<5<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:66:1282:1215	147	seq1	794	99	35M	=	627	-202	TTCAGACCCTACACGAATGCGTCTCTACCACAGGG	::;<;<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:194:688:289	147	seq1	795	99	35M	=	631	-199	TCAGACCCTACACGAATGCGTCTCTACCACAGGGG	;8;%28<;<<<<<<<<;<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:8:36:927:478	147	seq1	798	99	35M	=	610	-223	GACCCTACACGAATGCGTCTCTACCACAGGGGGCT	,6;;;3;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:99:756:130	83	seq1	798	99	35M	=	606	-227	GACCCTACACGAATGCGTCTCTACCACAGGGGGCT	;;<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:192:716:235	83	seq1	798	99	35M	=	651	-182	GACCCTACACGAATGCGTCTCTACCACAGGGGGCT	<5<<<8<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:63:424:1643	83	seq1	798	99	35M	=	614	-219	GACCCTACACGAATGCGTCTCTACCACAGGGGGCT	9+<<<+7<<<<<<<<<<<<<<<<<8<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:14:360:580	83	seq1	799	99	35M	=	963	199	ACCCTACACGAATGCGTCTCTACCACAGGGGGCGG	===========3===;5<==8;====79==.=5'5	MF:i:18	Aq:i:68	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS51_78:7:186:199:927	147	seq1	802	99	35M	=	783	-54	CTACGCGAATGCGTCTCTACCACAGGGGGCTGCGC	-;++)6<*8+;&<&/<<<<7<<71<<<<<6<<<7<	MF:i:18	Aq:i:57	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS139_19:3:4:1502:1911	83	seq1	802	99	40M	=	652	-190	CTACACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTTT	:+:::5/;99<;<&<*<-9<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:187:791:153	83	seq1	803	99	35M	=	958	190	TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG	<<<<<<<<<<<<<<<<<<<<<:+;;<;<88*6;68	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:63:527:1923	83	seq1	803	99	35M	=	981	213	TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG	<<<<<<<<<<<<<<<<<:<<<<3<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:31:98:804	83	seq1	805	99	35M	=	982	212	CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGC	=======9===;============5=;9=;=;==&	MF:i:18	Aq:i:74	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS218_4:7:89:1487:520	147	seq1	805	99	35M	=	997	227	CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGT	8<<<6/<<<<<<<<<:<<8<:<<3<<:668<86<3	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:69:88:1154	83	seq1	805	99	35M	=	992	222	CACGAATGCGTCTCTACCACAGGCGGCTGCGCGGT	<<<<<<<<<<<<<<<<<<<<<<<2<<<<:<<<<<7	MF:i:18	Aq:i:47	NM:i:1	UQ:i:17	H0:i:0	H1:i:1
+EAS114_26:1:99:212:522	147	seq1	806	99	35M	=	1002	231	ACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTT	================8==;====;=;===1==:8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:35:378:681	147	seq1	812	99	35M	=	632	-215	GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT	:<5-<);;;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:182:404:693	83	seq1	812	99	35M	=	646	-201	GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT	<;7;;4<<<<<<<7<<7<<<<<<<<<8<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:119:761:239	83	seq1	813	99	35M	=	999	221	CGTCTCTACCACAGGGGGCTGCGCGGTTTCCCATC	<<<<<<<<<<<<6<<<<<<;<2<<<<;<<<<<;;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:165:464:123	147	seq1	814	99	35M	=	650	-199	GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCA	9;<)<<%<<9<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:40:758:116	83	seq1	814	99	40M	=	632	-222	GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG	25/8/:<75:2<<<<<<7<<;<<<<<<<88;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:55:506:125	83	seq1	817	99	35M	=	982	200	TCTACCACAGGGGGCTGCGCGGTTTCCCATCATGA	<<<<<<<<<;<9<;<<;558<<<<5(5*<<<<<51	MF:i:18	Aq:i:35	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:162:594:858	147	seq1	818	99	35M	=	634	-219	CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA	90;<99;==99==;4=:========;=====;===	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:55:74:1040	83	seq1	818	99	35M	=	975	192	CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:100:708:1984	83	seq1	819	99	35M	=	1015	231	TACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<7%:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:92:367:1495	147	seq1	820	99	35M	=	987	202	ACCACAGGGGGCTGCGCGGTTTCCCATCATGAAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<6<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:49:905:27	147	seq1	821	68	35M	=	1000	214	CCACAGGGGGCTGCGCGGTTTCCCATCCTGAAGCA	<<;<.89<9.<2<9<:91+447.9,04&000(,+(	MF:i:18	Aq:i:31	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS218_4:7:87:964:826	147	seq1	822	99	35M	=	999	212	CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC	<<<<<<<<<<<<<<<<<<<<<<<<<<1<<8;4;;<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:38:1576:1923	147	seq1	822	99	35M	=	987	200	CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;<<;<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:122:337:968	83	seq1	823	85	35M	=	981	193	ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT	<<<<<;<<<<<<<<<<<<<<<<<<<;<<;;<;;;;	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:187:294:947	83	seq1	823	99	35M	=	1002	214	ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT	<<<<<<<<<<<<<<<<:<<<<<&<<%:<)7;7::4	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:49:271:588	83	seq1	830	99	35M	=	658	-207	GCTGCGCGGTTTCCCATCATGAAGCACTGAACTTC	:0=:===:<===;;===;=================	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:40:594:752	147	seq1	831	99	35M	=	651	-215	CTGCGCGGTTTCCCATCATGAAGCACTGAACTTCC	;7;9<;;;<;<;:<<;;<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:8:163:757:432	83	seq1	837	99	35M	=	1013	211	GGTTTCCCATCATGAAGCACTGAACTTCCACGTCT	<<<<<<<;<<<<<<<<;<;<<<<<<<<<<<<83:<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:156:857:494	83	seq1	838	99	35M	=	648	-225	GTTTCCCATCATGAAGCACTGAACTTCCACGTCTC	<<<8<:5<<;<<8<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:84:91:614	147	seq1	839	99	35M	=	1019	215	TTTCCCATCATGAAGCACTGATCTTCCACGTCTCA	;4<<<<<-84<<<;<<<<8<7.<4<<;77&:%<::	MF:i:18	Aq:i:39	NM:i:1	UQ:i:13	H0:i:0	H1:i:1
+EAS51_64:7:152:918:824	147	seq1	839	99	35M	=	1033	229	TTTCCCATCATGAAGCACTGAACTTCCACGTCTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:67:317:249	147	seq1	840	26	35M	=	683	-192	TTCCCATCATGACGCACCGAACTTCCACGTCTCAT	.5;7;++;<8.;&:7<<.5<<<<7<<7<<<<<<;7	MF:i:-126	Aq:i:26	NM:i:2	UQ:i:18	H0:i:0	H1:i:0
+EAS51_62:7:96:836:737	147	seq1	841	99	35M	=	642	-234	TCCCATCATGAAGCACTGAACTTCCACGTCTCATC	1<;<7;;1;8;;8:<<1<;<<;<<<<<<<<<<;<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:130:912:658	83	seq1	841	99	35M	=	652	-224	TCCCATCATGAAGCACTGAACTTCCACGTCTCATC	;=;;;<<<<<=55=;==<=======<=========	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:75:934:439	147	seq1	842	99	35M	=	1001	194	CCCATCATGAAGCACTGAACTTCCACGTCTCATCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:212:329:348	147	seq1	842	99	35M	=	1020	212	CCCATCATGAAGCACTGAACTTCCACGTCTCATCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:49:183:435	147	seq1	843	99	35M	=	1005	197	CCATCATGAAGCACTGAACTTCCACGTCTCATCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;:;8;:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:280:133:495	83	seq1	843	99	35M	=	1015	207	CCATCATGAAGCACTGAACTTCCACGTCTCATCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:232:351:909	147	seq1	843	80	36M	=	685	-194	CCATCATGAAGCGCTGAACTTCCACGTCTCATCTAG	:8%3<8====130=8==+===;=3=8===48==;3*	MF:i:18	Aq:i:39	NM:i:1	UQ:i:15	H0:i:0	H1:i:1
+EAS221_1:8:77:781:676	147	seq1	846	99	35M	=	1010	199	TCATGAAGCACTGAACTTCCACGTATCATCTAGGG	<<<<<<<5<<5<<<<<<<<<<<<13<<2<<<<<,<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:18	H0:i:0	H1:i:1
+EAS1_95:2:198:691:595	83	seq1	847	99	35M	=	655	-227	CATGAAGCACTGAACTTCCACGTCTCATCTAGGGG	:=:;=;===========;=================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:31:948:254	147	seq1	849	99	35M	=	680	-204	TGAAGCACTGAACTTCCACGTCTCATCTAGGGGAA	7;;;98<<7<<<<<<<<<<<<<<<<<<8<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:278:440:902	83	seq1	851	99	35M	=	1032	216	AAGCACTGAACTTCCACGTCTCATCTAGGGGAACA	=========<==<==============:;;=;=;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:74:674:124	147	seq1	854	99	35M	=	1041	222	CACTGAACTTCCACGTCTCATCTAGGGGAACAGGG	<<<<<<<<<<<<:<;<<<<;<<<<;9;<<;;.;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:28:781:723	147	seq1	855	99	36M	=	676	-215	ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG	8488<::;4;;<:;;;::<;7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:28:474:566	147	seq1	855	99	36M	=	1018	199	ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG	<<<<<<<<<<<<<<<<<<<<<<<:<;<;;<<7;8;<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:124:241:608	147	seq1	856	99	35M	=	670	-221	CTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG	9;;<<;<<<;<<<;<:<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:187:925:547	147	seq1	857	99	35M	=	689	-203	TGAACTTCCACGTCTCATCTAGGGGAACAGGGAGG	((988+&8<<;<09<;<<9<<4<<-<99<<;<9<;	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:9:512:826	83	seq1	859	99	35M	=	1021	197	AACTTCCACGTCTCATCTAGGGGAACAGGGAGGTG	67<<<;;;<;;<<;;<;<:;9;;;9;;;;<59777	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:194:696:490	83	seq1	862	99	35M	=	1026	199	TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC	<<<<<<<<<<<<<<<<<<<;5<<<<<:<1<8<<<8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:96:788:614	83	seq1	862	99	35M	=	667	-230	TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC	;9;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:81:786:340	147	seq1	863	99	35M	=	1033	205	TCCACGTCTCATCTAGGGGAACAGAGAGGTGCACT	<<<<7<<<<<<<<<<<<<<7<<;<&<<;;7<7;;;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS192_3:7:298:644:697	147	seq1	863	99	35M	=	1035	207	TCCACGTCTCATCTAGGGGAACAGGGAGGTGCACT	<<<<<<<<<<<<<<<::;;;6<8:;;9;98;668;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:178:305:843	147	seq1	864	99	35M	=	1037	208	CCACGTCTCATCTAGGGGAACAGGGAGGTGCACTA	<<<<<<<<<<<<<<<<<<<:<<<<<;<<:<<:<;:	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:5:863:302	147	seq1	866	99	35M	=	698	-203	ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT	:4:29:<<<9;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:30:788:376	83	seq1	866	99	35M	=	1038	207	ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT	<<<<<<<<<<<<:<<<<<<<<:<;<<(<7;7;:(;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:143:310:958	147	seq1	868	99	35M	=	1048	215	GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC	<<<<<<<<<<<8<8<<<<<;;7<<<;6;<<+4;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:3:233:911	83	seq1	868	99	35M	=	688	-215	GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:75:637:650	83	seq1	868	99	35M	=	691	-212	GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC	<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:73:513:102	147	seq1	868	99	35M	=	698	-205	GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC	==::===8=>=====>=>=>>>=>>==>=>>>>>>	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:297:637:86	83	seq1	869	99	35M	=	704	-200	TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG	<:75<;<;;<<<<<<;;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS54_65:3:290:558:349	147	seq1	869	99	35M	=	719	-185	TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG	2;2;;'5&;<<5<<;5/<<<<<7<<;+;<<+1<8<	MF:i:18	Aq:i:59	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS1_95:3:308:956:873	83	seq1	870	99	35M	=	1068	233	CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC	<<<<<<<<<<<<<;<;<;1<<<<<.<9<;<<<<+;	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:147:64:416	147	seq1	870	99	35M	=	701	-204	CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC	/;49;:6<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:30:812:345	147	seq1	871	99	36M	=	1036	201	TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCTC	<<<<<<<7<;<<7<;77;3<&0-;<5<;6<1'13<:	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:134:243:630	147	seq1	871	99	35M	=	1052	216	TCATCTAGGGGAACAGGGAGGCGCACTAATGAGCT	<<<:<<<<</<<<-<<<<6/<-<:<5+<::-2</2	MF:i:18	Aq:i:39	NM:i:2	UQ:i:29	H0:i:0	H1:i:1
+EAS54_81:2:27:856:401	83	seq1	871	99	35M	=	679	-227	TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCT	.'=.93======;;====;======;===;=;===	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:45:462:455	83	seq1	874	99	35M	=	723	-186	TCTAGGGGAACAGGGAGGTGCACTAATGCGCTCCA	62*<;;;;<<;<<9;;<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:264:988:663	147	seq1	875	99	35M	=	688	-222	CGAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC	(%<:4<4<<7<<1-:<1766<66<<<<+<:<;8;<	MF:i:18	Aq:i:60	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS56_63:1:145:71:26	147	seq1	875	99	35M	=	1040	200	CTAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC	<<<<<<<<<<<<<<<<<;<;;<<;<;<9<9;;99;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:101:825:28	147	seq1	879	99	35M	=	1079	235	GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC	<<86<<;<78<<<)<;4<67<;<;<74-7;,;8,;	MF:i:18	Aq:i:39	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS218_4:5:63:875:1339	83	seq1	879	99	35M	=	711	-203	GGGAACAGGGAGGTGCACTAATGCGCTCCACGCCC	;;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:290:270:557	83	seq1	880	99	35M	=	1052	207	GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA	<<<<<<<<<<<<<;<<<<9<:;<<<<<<5<0<<;+	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:134:853:558	147	seq1	880	99	35M	=	1071	226	GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA	==========================9=9=;<;<5	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:282:567:481	83	seq1	880	88	35M	=	1064	219	GGAACAGGGAGGCGCACTAATGCGCTCCACGCCCA	<<<<<<<<<<<<3<7<7<<<<;<<0)<<<<<<<<3	MF:i:18	Aq:i:43	NM:i:1	UQ:i:18	H0:i:0	H1:i:1
+EAS114_30:1:154:818:165	147	seq1	881	99	35M	=	1041	195	GAACAGGGAGGTGCACTAATGCGCTCCACGCCCAA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<:7;:;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:301:54:240	147	seq1	882	99	35M	=	1061	214	AACAGGGAGGTGCACTAATGCGCTCCACGCCCAAG	<<<<:<9<<<<:<<<<9<<<<<<690<<6</<(83	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:12:402:843	147	seq1	885	99	35M	=	1072	222	AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:262:965:756	83	seq1	885	99	35M	=	1069	219	AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<9;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:30:816:90	147	seq1	885	99	35M	=	1057	207	AGGGAGGTGCACTAATGCGCTCCACGCCCCAGCCC	<<<<<<<<<<<<<<<<<<<:<<<<<<::1&(1::7	MF:i:18	Aq:i:69	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS188_7:4:171:104:398	147	seq1	885	99	35M	=	1066	216	AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC	=========)===97===3===4===4==,)=/)=	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:163:31:455	83	seq1	886	99	35M	=	730	-191	GGGAGGTGCACTAATGCGCTCCACGCCCAAGCCCT	8;<<;<<<78+<=</<<=;23<=<<<<<<<<<<<<	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:149:354:667	147	seq1	888	99	35M	=	734	-189	GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC	;<;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:18:571:1110	83	seq1	888	99	35M	=	1070	217	GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC	7<<<<<<<<<<<<;<<<<<<<<<<<<788<<<;6<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:312:837:406	147	seq1	889	99	35M	=	1048	194	AGGTGCACTAATGCGCTCCACGCCCAAGCCCTTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:160:272:398	83	seq1	891	99	35M	=	705	-221	GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA	3:,<,;;<<;<<1<<<<<<<;<;<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:228:587:504	83	seq1	891	65	35M	=	1050	194	GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA	<<<<7<<7;7<<3<<<<7<<<<<*3<<<<74<:<*	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:35:361:546	83	seq1	892	99	35M	=	731	-196	TGCACTAATGCGCTCCACGCCCAAGCCCTTCTCAC	:4;4;;<<;4<8<;;<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:84:438:1505	83	seq1	893	99	40M	=	1068	215	GCACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTTC	35<<:;9<;<;5<<<:<3<<7:<9/<)<<:::9<&5;;+1	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:277:482:316	147	seq1	894	99	35M	=	1098	239	CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG	<<<<<<<<<<<<<<;<;<<<:<;<<<<;<<<1<1;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:86:498:373	83	seq1	894	99	35M	=	716	-213	CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG	):)4:<5<<<<;89<<<969<<<:<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:236:498:526	147	seq1	895	99	35M	=	1048	188	ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT	===================================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:43:1120:878	83	seq1	895	99	35M	=	1075	215	ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT	<<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<=7;7	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:104:153:698	83	seq1	896	99	36M	=	713	-219	CTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTT	69<<)9<<:5:6<<<16:<6/<6<1<<<<<:<:<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:166:42:147	83	seq1	898	99	35M	=	1048	185	AATGCGCTCCACGCCCAAGCCCTTCTAACAGTTTC	<<;<<<<<<<<<<<<<<<<;6<<64;)<<7;7;;;	MF:i:18	Aq:i:43	NM:i:1	UQ:i:8	H0:i:0	H1:i:1
+B7_595:2:178:77:424	83	seq1	900	99	35M	=	1058	193	TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG	<<<<<<<<<<<<<<<6<<;<<<<<<<<6<;<<<<6	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:87:734:888	83	seq1	900	99	35M	=	717	-218	TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG	56<<86;:<<<4;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:149:650:44	83	seq1	902	99	36M	=	726	-212	CGCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC	;8<<</<<:<<595<<9<<<<<<<<<<<<<<3<9<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:177:552:234	83	seq1	903	99	35M	=	1094	226	GCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC	<<<<<<<<<<<<<;<<<<<<<<9<969<<<<3<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:58:703:72	147	seq1	905	99	35M	=	1088	218	TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC	2<7<<<<<<<<<<<8:<<<<8<(<8<:::8.::<3	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:242:4:593	83	seq1	905	99	35M	=	1086	216	TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC	<<<<<<<<<<<8<<<<-<<<<<88;<;<<8<;88<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:67:620:344	147	seq1	905	99	35M	=	755	-185	CCCCCGCCCAAGCCCTTCTCACAGTTTCTGCCCCC	+++*+++#++++++,++++++++,,+,&+,,,,+,	MF:i:18	Aq:i:33	NM:i:2	UQ:i:19	H0:i:1	H1:i:0
+EAS51_62:7:178:286:414	83	seq1	907	99	35M	=	731	-211	CACGCCCAAGCCCTTCTCACAGTTTCTGCCCCCAG	68;38::<<;<<8;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:174:987:334	147	seq1	908	99	35M	=	1082	209	ACACCCAAGCCCTTCTCACAGTTTCTGCCCCCAGC	<<;4<<<<;;</4<4<+<<<<<;<<<<<</<93+2	MF:i:18	Aq:i:41	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS219_FC30151:1:55:8:1412	147	seq1	910	99	35M	=	1072	197	GCCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:8:1351:1986	83	seq1	911	99	35M	=	729	-217	CCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCATG	<8;<<<<<<<<<<<;<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:37:610:260	83	seq1	913	99	35M	=	745	-203	CAAGCCCTTCTCACAGTTTCTGCCCCCAGCATGGT	/74<.<4.&<<<:<<<<::<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:228:189:826	83	seq1	914	99	35M	=	1112	233	AAGCCCTTCTCACAGTTTCTGCCCCCCGCATGGTT	;9=========;=1======9=====1;=<3=:6;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:16	H0:i:0	H1:i:1
+EAS56_59:3:149:953:349	147	seq1	915	99	35M	=	777	-173	AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG	2;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:24:1374:211	83	seq1	915	99	35M	=	1064	184	AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG	;;:<<;<;:;;;;;;;;;;<::;;;6;;2+74917	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:5:491:391	147	seq1	917	99	35M	=	782	-170	CCCTGCTCACAGTTTCTGCCCCCAGCATGGTTGTA	-/+5-.&&:5+:92=6===========9=======	MF:i:18	Aq:i:62	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS114_32:2:306:119:56	83	seq1	919	99	35M	=	1083	199	CTTCTCACAGTTTCTGCCCCCAGCATGGTTGTACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:216:381:608	147	seq1	920	99	35M	=	1075	190	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	<<<<<<<<<<<<<<<<<<<<<<<<;;+<6:<;26;	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:73:292:429	147	seq1	920	99	35M	=	752	-203	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	;6;6;<<<<<;<<<<;<<<<<<<<7<<<<<<5<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:2:170:265:818	83	seq1	920	73	35M	=	748	-207	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	3+;%;.;;<<9+;3;;;<<<;57<1<;<<<<<<<;	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:278:906:933	83	seq1	920	99	35M	=	1071	186	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<.	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:190:95:706	83	seq1	920	99	35M	=	1078	193	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	<<<<<<<<<<<<<<9<<<<<;;<;<;;<<;<;;<,	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:278:848:765	83	seq1	920	99	35M	=	1088	203	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:29:249:878	147	seq1	921	99	35M	=	1077	191	TCTCACAGTTTCTGCCCCCAGCATGGTTGTACTGG	<<<<<<<<<<<<<<<<<<<<<<:<:<<=<<:<<6&	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:259:467:737	147	seq1	923	99	36M	=	1102	215	TCACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCA	<<<<<<<<<<<<7<<<<<<<'<<.<<<<<<;;;<67	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:24:195:604	147	seq1	923	99	35M	=	1098	210	TCACAGTTTCTGCCCCCAGCATGGTTGTACTGTGC	<;<<<<<<<<<89<<<<<868<8;6<8;3(38&<8	MF:i:18	Aq:i:65	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_32:4:42:923:169	147	seq1	925	99	35M	=	1099	209	ACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAA	9<<<;9<<<<<;<;<<.<<;<;6<<<<1;8<<-0;	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:29:529:379	147	seq1	926	99	35M	=	1117	226	CAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAAT	<<<<<<<<8<<<<<<<<<<<<<<<<<;<672;<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:26:785:882	147	seq1	926	99	35M	=	1107	216	CAGTTTCTGCCCCAAGCATGGTTGTACTGGGCAAT	<<<0<<<<<<<<<6,<<)<<<<<<<&<<0<<,<'<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:21	H0:i:0	H1:i:1
+B7_591:7:129:956:115	83	seq1	927	99	36M	=	740	-223	AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC	<<:<9<4<<<<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:82:356:253	147	seq1	927	99	35M	=	752	-210	AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA	97;7<<;;<<<<<7;<<:<<<9<<;<<<9<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:134:379:893	83	seq1	927	99	35M	=	1095	203	AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA	<<<<<<<<<<<<<5<<<<;<<<<<;<:5;<<4+<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:256:404:584	83	seq1	928	99	35M	=	1096	203	GTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC	<<<<<<<<<<<<<<<<<<<<<7<3;<:;;3:3:</	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:76:333:905	147	seq1	929	99	35M	=	1076	182	TTTCTGCCCCCAGCATGGTTGTACTGGGCAATACA	<<<<<7;<;<<6<<6<<7<<7<)&<4+6)0+<;(0	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:11:646:628	83	seq1	930	99	36M	=	1106	212	TTCTGCCCCCAGCATGGTTGTACTGGGCAATACATG	<<<<<<<<<<6<<<<<<<<<<<<</<;<<<<<<6<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:136:389:320	83	seq1	930	99	35M	=	1100	205	TTCTGCCCCCAGCATGGTTGTACTGGGCAATACAT	7<<<<<;<<7<6<<;;<;<;;677<6;(27;<(97	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:6:93:334:858	83	seq1	932	99	35M	=	1106	209	CTGCCCCCAGCATGGTTGTACTTGGCAATACATGA	<<<<<<<<;<<<<;;<<9<<<<&;&<<9<9;/;&;	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_597:3:46:981:766	83	seq1	933	99	35M	=	778	-190	TGCCCCCAGCATGGTTGTACTGGGCAATACATGAG	/<<<;/;<<316<<<3<<<<7<<<7<<<;<<<<<7	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:209:159:130	83	seq1	934	99	34M	=	1109	210	GCCCCCAGCATGGTTGTACTGGGCAATACATGAG	<<<<<<8<<<<<<&<<+7<<4<<<22<;<<<<3<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:111:796:737	83	seq1	936	99	35M	=	1112	211	CCCCAGCATGGTTGTACTGGGCAATACATGTGATT	<<<<<<<<<<<<<<<:<<;7;<<<<993<4%:%<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS218_1:4:15:856:340	83	seq1	936	99	35M	=	1093	192	CCCCAGCATGGTTGCACTGGGCAATACATGAGATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<77<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_610:5:7:761:623	147	seq1	938	99	35M	=	757	-216	CCGGCATGGTTGTACTGGGCAATACATGAGATTAT	::';-8);<<<<;<1<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS1_97:5:84:927:843	83	seq1	938	99	35M	=	1138	235	CCAGCATGGTTGTACTGGGCAATACATGAGATTAT	<<<<<<<<<<<<<;9;;4;<<0<<7<<9<;<:<5<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:273:901:459	83	seq1	938	99	35M	=	1098	195	CCAGCATGGTTGTACTGGGCAATACATGAGATTAT	<<8<<<;<;8<;<;<;7+8<788<;;22<27;77;	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:256:407:470	83	seq1	939	99	35M	=	762	-212	CAGCATGGTTGTACTGGGCAATACATGAGATTATT	7.47;0;;5<4033*<<<<<9,<<<<<;<<<<<3<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:77:251:446	147	seq1	939	99	35M	=	1110	206	CAGCATGGTTGTACTGGGCAATACATGAGATTATT	<<9<<<<<<<<<<<<<97<<<<<<<<<96<<<+<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:102:467:897	147	seq1	940	97	35M	=	756	-219	AGCATGGTTGTACAGGGCAATACATGAGATTATTA	83333<+02<:<.&<+<.<::7<<::<<<<:<<<<	MF:i:18	Aq:i:37	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS221_1:6:92:1807:1185	83	seq1	940	99	35M	=	1119	214	AGCATGGTTGTACTGGGCAATACATGAGATTATTA	<<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<;<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:142:858:903	83	seq1	943	99	35M	=	1121	213	ATGGTTGTACTGGGCAATACATGAGATTATTAGGA	======;====5=======9======;===3=5=;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:143:560:194	147	seq1	946	99	35M	=	768	-213	GTTGTACTGGGCAATACATGAGATTATTAGGAAAT	9:<;7<:::<:<;<<<<<<<<<<:<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:148:437:481	83	seq1	949	99	36M	=	764	-221	GTACTGGGCAATACATGAGATTATTAGGAAATGCTT	<<<;<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:75:917:886	147	seq1	951	99	35M	=	1110	194	ACTGGGCAATACATGAGATTATTAGGAAATGCTTT	<<<<<<<<<<<<<<:<<<<<<<<<71<<<:6<:8<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:118:851:285	147	seq1	953	99	35M	=	1133	215	TGGGCAATACATGAGATTATTAGGAAATGCTTTAC	<<<<<<<<<<<<<<<<<<<<<<<;;<;<:<<<<;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:179:389:585	83	seq1	953	24	35M	=	770	-218	TGTGAAATGAATGAGATTATTAGGAAATGCTTTAC	;<)<;*;9*+<;<<,,<,<4<4<<<<<;<4<9494	MF:i:18	Aq:i:24	NM:i:4	UQ:i:53	H0:i:0	H1:i:0
+EAS114_30:7:269:944:220	147	seq1	953	99	35M	=	1147	229	TGGGCAATACATGAGATTATTAGGAAATGCTTTAC	<<<<<<<8<<<<<<<<<<<<<<<;<<<<<;<<;81	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:93:1002:845	147	seq1	954	99	35M	=	1129	210	GGGCAATACATGAGATTATTAGGAAATGCTTTACT	<<<<<<<<<<<<<<<<<<<<<:<<;<<<;<<<</<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:66:584:407	83	seq1	954	99	35M	=	785	-204	GGGCAATACATGAGATTATTAGGAAATGCTTTACT	<<84<<<766<<<.6<<<<<<4<<7<<<<<<<7<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:63:48:631	147	seq1	957	99	35M	=	1143	221	CAATACATGAGATTATTAGGAAATGCTTTACTGTC	<<<<<<;<<7</<<<<<<;;;<<<;<;<<7;;);<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:187:791:153	147	seq1	958	99	35M	=	803	-190	AATACATGAGATTATTAGGAAATGCTTTACTGTCA	:;55&<99<<1<;<<8<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:72:1809:1398	83	seq1	958	99	35M	=	1145	222	AATACATGAGATTATTAGGAAATGCTTTACTGTCA	<<<<<<<<<<<<<<<<<<::<9<<<<<<<<<6<<:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:66:257:524	147	seq1	959	99	35M	=	791	-203	ATACATGAGATTATTAGGAAATGCTTTACTGTCAT	<;<<<<<<<<3<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:247:522:670	147	seq1	960	99	35M	=	1121	196	TACATGAGATTATTAGGAAATGCTTTACTGTCATA	<<<<<<<<<<<<<<<;<<<<<<<<<<<<<5;<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:37:400:627	147	seq1	961	99	35M	=	1154	228	ACATGAGATTATTAGGAAATGCTTTACTGTCATAA	<<<<<<7+<<<<<<2615<<6<<<<5<<1<<;:74	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:329:177:267	147	seq1	962	99	35M	=	1139	212	CATGAGATTATTAGGAAATGCTTTACTGTCATAAC	<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<9;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:166:203:416	147	seq1	963	99	35M	=	1136	208	ATGAGATTATTAGGAAATGCTTTACTGTCATAACT	<<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<<97<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:14:360:580	147	seq1	963	99	35M	=	799	-199	ATGAGATTATTAGGAAATGCTTTACTGTCATAACT	<,1<;<;;<<<<<1<<<;<7<<6<:;;<<<<<<;;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:193:38:987	147	seq1	964	99	35M	=	1158	229	TGAGATTATTAGGAAATGCTTTACTGTCATAACTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;:;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:39:59:738	147	seq1	965	99	35M	=	1142	212	GAGATTATTAGGAAATGCTTTACTGTCATAATTAT	3<8.<<<<<<<-<<<<3<388;;880<0<0)-722	MF:i:18	Aq:i:43	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS51_66:4:209:92:210	147	seq1	965	99	35M	=	1156	226	GAGATTATTAGGAAATGCTTTACTGTCATAACTAT	<<<<<<<<<<<<<<<<;<<<<<<<5<7<<;;;<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:86:308:648	83	seq1	970	99	35M	=	1161	226	TATTAGGAAATGCTTTACTGTCATAACTATGAAGA	=8=====;=8======;=======35==;=;.;25	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:206:563:262	147	seq1	971	99	35M	=	1137	201	ATTAGGAAATGCTTTACTGTCATAACTATGAAGAG	<<<<<<<<<;<<<<<<<<<<<<;<<<<<<<-;<4;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:82:822:767	83	seq1	972	99	35M	=	1165	228	TTAGGAAATGCTTTACTGTCATAACTATGAAGAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<.<,<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:207:926:427	147	seq1	973	99	35M	=	1159	221	TAGGAAATGCTTTACTGTCATAACTATGAAGAGAC	<<<<<<7<<<<<;<<<<<6:<;<6<&<58<<6:::	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:144:28:475	83	seq1	974	99	35M	=	1167	228	AGGAAATGCTTTACTGTCATAACTATGAAGAGACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<::8<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:55:74:1040	147	seq1	975	99	35M	=	818	-192	GGAAATGCTTTACTGTCATAACTATGAAGAGACTA	;;;;;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:274:176:479	83	seq1	976	99	35M	=	1144	203	GAAATGCTTTACTGTCATAACTATGAAGAGACTAT	<<<<<<<<<<<<<;<<<<<<<<<<;<<9<59<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:122:337:968	147	seq1	981	10	35M	=	823	-193	GCTTTACTGTCTAAACTATGAAGAGACTATTGCCA	%454<75!7<+!990<9<6<<<<6<</<<<<<<<<	MF:i:18	Aq:i:10	NM:i:3	UQ:i:24	H0:i:0	H1:i:0
+EAS114_28:7:157:786:424	83	seq1	981	99	36M	=	1171	226	GCTTTACTGTCATAACTATGAAGAGACTATTGCCAG	<<<<<<<<<<<<<;<<<<<<;<<;<<;<<<<+4:70	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:63:527:1923	147	seq1	981	99	35M	=	803	-213	GCTTTACTGTCATAACCATGAAGAGACTATTGCCA	9<<<8<-8;;8<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_95:7:55:506:125	147	seq1	982	99	35M	=	817	-200	CTTTACTGTCATAACTATGAAGAGACTACTGCCAG	118%67;1;8,4:187<4>::1:818;;&::<>.;	MF:i:18	Aq:i:35	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS54_81:2:31:98:804	147	seq1	982	99	35M	=	805	-212	CTTTACTGTCATAACTATGAAGAGACTATTGCCAG	====;========7=====================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:235:805:373	147	seq1	983	99	35M	=	1146	198	TTTACTGTCATAACTATGAAGAGACTATTTCCAGA	<<<<<<<<<<<<<<<<<<<<;<;<<<<<<;;<99;	MF:i:18	Aq:i:74	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS114_28:5:11:868:62	83	seq1	983	99	36M	=	1154	207	TTTACTGTCATAACTATGAAGAGACTATTGCCAGAT	<<<<<<<<<<<<<<<<<<<<:<<<;<<<<(7:7039	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:280:512:316	147	seq1	984	99	35M	=	1159	210	TTACTGTCATAACTATGAAGAGACTATTGCCAGCT	==<========6==4==6;;==:===;=2/:+8%6	MF:i:18	Aq:i:68	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_93:5:292:122:666	83	seq1	985	99	35M	=	1159	209	TACTGTCATAACTATGAAGAGACTATTGTCAGATG	<<<<<<6<<<<<<<<8;<<<<<<<<<<3&9+;;(;	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_53:1:23:403:981	83	seq1	985	99	35M	=	1151	201	TACTGTCATAACTATGAAGAGACTATTGCCAGATG	<8<<<;<<<<<<;<<<<<<8;<<<9<9,3;,6(91	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:33:1566:588	83	seq1	985	76	35M	=	1166	216	TACTGTCATAACTATGAAGAGCCTATTGCCAGATG	<;.;;;;6;;;;6;;29;;;<+9;;;.3;;73797	MF:i:18	Aq:i:37	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS139_11:7:92:367:1495	83	seq1	987	99	35M	=	820	-202	CTGTCATAACTATGAAGAGACTATTGCCAGATGAA	<8<88<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:38:1576:1923	83	seq1	987	99	35M	=	822	-200	CTGTCATAACTATGAAGAGACTATTGCCAGATGAA	8;<98<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:190:481:295	147	seq1	990	99	35M	=	1161	206	TCATAACTATGAAGAGACTATTGCCAGATGAACCA	<<<<<<<<<<<<<<<<<<<<<<9<<<<<9<7<2::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:168:117:441	83	seq1	990	99	35M	=	1151	196	TCATAACTATGAAGAGACTATTGCCAGATGAACCA	<<3<<<<<<<<<<<<<<<<<<<+<<17;<;:<995	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:239:796:221	147	seq1	992	99	35M	=	1160	203	ATAACTATGAAGAGACTATTGCCAGCTGACCCCCC	<<<7<<7<<7<<7<;<<<<<,;;,+'<+/+99%:'	MF:i:18	Aq:i:37	NM:i:4	UQ:i:26	H0:i:0	H1:i:1
+EAS220_1:4:69:88:1154	147	seq1	992	99	35M	=	805	-222	ATAACTATGAAGAGACTATTGCCAGATGAACCACA	<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:34:956:1309	83	seq1	994	99	35M	=	1168	209	AACTATGAAGAGACTATTGCCAGATGAACCACACA	<<<<<<7<<<<<<<<<<<6<<<<<<<<<<<:<8<8	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:229:717:121	83	seq1	995	99	35M	=	1150	190	ACTATGAAGAGACTATTGCCAGATGAACCACACAC	=================<)=<4<0=.<<<71;41&	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS219_1:1:67:191:668	83	seq1	995	99	35M	=	1134	174	ACTATGAAGAGACTATTGCCAGATGAACCACACCT	<<<<<<<<<<<<<<<<<6<<;<;<;<<<<<<6;%2	MF:i:18	Aq:i:74	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_64:3:309:303:278	147	seq1	996	99	35M	=	1178	217	CTATGAAGAGACTATTGCCAGATGAACCACACATT	<<<<<<<<<<<<<<<<+<<+<<7<<<<<5<<<;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:60:1020:1259	83	seq1	996	99	35M	=	1157	196	CTATGAAGAGACTATTGCCAGATGAACCACACATT	<;<<<<;<<<<<<<<<;<<<<<<<8<<<<<:<:<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:89:1487:520	83	seq1	997	99	35M	=	805	-227	TATGAAGAGACTATTGCCAGATGAACCACACATTA	4;;/<<<<<:<;<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:15:805:420	147	seq1	998	35	35M	=	1164	201	ATGAAGAGACTATTCACATGTGAACCACACATTTA	;73;;;;67.;1<<+*.;*&<4947<&474&*9*(	MF:i:-126	Aq:i:35	NM:i:4	UQ:i:33	H0:i:0	H1:i:0
+EAS56_57:3:119:761:239	147	seq1	999	99	35M	=	813	-221	TGAAGAGACTATTGCCAGATGAACCACACATTAAT	;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:142:457:584	83	seq1	999	99	35M	=	1160	196	TGAAGAGACTATTTCCAGATGAACCACACATTAAT	<<<<<<<<<<<<</<<,6<66<<<;<;;<*4744.	MF:i:18	Aq:i:41	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS218_4:7:87:964:826	83	seq1	999	99	35M	=	822	-212	TGAAGAGACTATTGCCAGATGAACCACACATTAAT	)6<<<<<<:;<6<<::<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:49:905:27	83	seq1	1000	68	35M	=	821	-214	GAAGAGACTATTGCCAGTTGAACCACACATTAATA	99515<<&<<6595-56%;86&<;<<<6<<<<6;<	MF:i:18	Aq:i:31	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS1_108:3:75:934:439	83	seq1	1001	99	35M	=	842	-194	AAGAGACTATTGCCAGATGAACCACACATTAATAC	==7=:=========================<====	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:99:212:522	83	seq1	1002	99	35M	=	806	-231	AGAGACTATTGCCAGATGAACCACACATTAATACT	<1<16<7<3<<;;<8<<<<<<<<<<<<;<<<<9<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:187:294:947	147	seq1	1002	99	35M	=	823	-214	AGAGACTATTGCCAGATGAACCACACATTAATACT	<<:<<8181;<8<<<<<<<<8<<<<<<<<<<<<<:	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:2:152:860:286	147	seq1	1004	99	35M	=	1171	202	AGACTATTGCCAGATGAACCACACATTAATACTAT	<;<<<;<<0:<3<:<<2<<<<<7+<7+47<9(999	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:49:183:435	83	seq1	1005	99	35M	=	843	-197	GACTATTGCCAGATGAACCACACATTAATACTATG	1<7<<<<;:<<<<<;<<<;<<<;<;<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:63:854:610	147	seq1	1005	99	35M	=	1180	210	GACTATTGCCAGATGAACCACACATTAATACTATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:12:276:1797	83	seq1	1006	99	35M	=	1190	219	ACTATTGCCAGATGAACCACACATTAATACTATGT	<<<<<<<<<<<<:</<<9<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:190:42:671	147	seq1	1008	99	36M	=	1192	220	TATTGCCAGATGAACCACACATTAATACTATGTTTC	<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:67:692:110	83	seq1	1009	99	35M	=	1175	201	ATTGCCAGATGAACCACACATTAATACTATGTTTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:61:183:767	83	seq1	1010	99	35M	=	1195	220	TTGCCAGATGAACCACACCTTAATACTATGTTTCT	<<<<<<<<<<;<<<9<9<+<<<8<<<<<<;8<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS221_1:8:77:781:676	83	seq1	1010	99	35M	=	846	-199	TTGCCAGATGAACCACACATTAATACTATGTTTCT	:<;<2<<<<<<26<<<<6<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:21:132:1423	83	seq1	1012	99	35M	=	1178	201	GCCAGATGAACCACACATTAATACTATGTTTCTTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:8:163:757:432	147	seq1	1013	99	35M	=	837	-211	CCAGATGAACCACACATTAATACTATGTTTCTCAT	1+<8<<<<<<;<5<;<<<<<;5<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_30:3:302:288:657	83	seq1	1013	99	35M	=	1173	195	CCAGATGAACCACACATTAATACTATGTTTCTTAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:97:1584:777	83	seq1	1013	99	35M	=	1200	222	CCAGATGAACCACACATTAATACTATGTTTCTTAT	<<;<;;;;<;<;<<;;;;;;;;;;;;;;:;79979	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:280:133:495	147	seq1	1015	99	35M	=	843	-207	AGATGAACCACACATTAATACTATGTTTCTTATCT	<:<9:<<7:<6<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:100:708:1984	147	seq1	1015	99	35M	=	819	-231	AGATGAACCACACATTAATACTATGTTTCTTATCT	:8<(8<)9<;<<<<+<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:182:313:319	83	seq1	1016	99	35M	=	1180	199	GATGAACCACACATTAATACTATGTTTCTTATCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<;<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:41:474:283	83	seq1	1018	99	35M	=	1182	199	TGAACCACACATTAATACTATGTTTCTTATCTGCA	<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<+<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:28:474:566	83	seq1	1018	99	36M	=	855	-199	TGAACCACACATTAATACTATGTTTCTTATCTGCAC	;<<<+<<<<5<<<<<<;;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:84:91:614	83	seq1	1019	99	35M	=	839	-215	GAACCACACATTAATACTATGTTTCTTATCTGCAC	<<;;<<<7<<<<<<<;<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:159:222:274	83	seq1	1019	99	35M	=	1189	205	GAACCACACATTAATACTATGTTTCTTATCTGCAC	=;9====;=9==59=+==9========9===5;7=	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:62:603:1552	147	seq1	1019	99	35M	=	1180	196	GAACCACACATTAATACTATGTTTCTTATCTGCAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:212:329:348	83	seq1	1020	99	34M	=	842	-212	AACCACACATTAATACTATGTTTCTTATCTGCAC	8<6:<:<<<;<<<;<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:233:97:262	83	seq1	1021	99	34M	=	1175	189	ACCACACATTAATACTATGTTTCTTATCTGCCCA	<<<<<<<<<<<;<;<<:<<<<<<<<<<<<.<&77	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_45:7:9:512:826	147	seq1	1021	99	35M	=	859	-197	ACCACACATTAATACTATGTTTCTTATCTGCACAT	76777:;;;;;;;;;;;;;;;;;;;;;;;;;:;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:29:794:282	147	seq1	1025	99	36M	=	1196	207	CACATTAATACTATGTTTCTTATCTGCACATTACTA	<<<<<<<<<<<<<<<<<<<<<;<<<&<<;:<<8<<8	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:278:524:521	147	seq1	1025	99	35M	=	1224	234	CACATTAATACTATGTTTCTTATCTGCACATTACT	<<<;<<;<<<<<<<;<<<<<<<<<<7;5;<<<;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:39:966:551	83	seq1	1026	99	35M	=	1205	214	ACATTAATACTATGTTTCTTATCTGCACATTACTA	<<<<<<<<<<<<<<<<<<<<<<<<:<;<&<<&<<;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:194:696:490	147	seq1	1026	99	35M	=	862	-199	ACATTAATACTATGTTTCTTATCTGCACATTACTA	========;======;==========8==:=====	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:305:565:952	83	seq1	1030	99	36M	=	1213	219	TAATACTATGTTTCTTATCTGCACATTACTACCCTG	7<<<<<<<<<7<<<<<<<<<7<<<;;<;<;<<<<<+	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:287:258:321	83	seq1	1030	99	35M	=	1194	199	TAATACTATGTTTCTTATCTGCACATTACTACCCT	<<<<<<<<<<<;<<<<<<<<42:<+<<<;<<;;;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:278:440:902	147	seq1	1032	99	35M	=	851	-216	ATACTATGTTTCTTATCTGCACATTACTACCCTGC	<;7;4<;<;;;<<;<;;;<<<<<9<<<;<<<<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:180:905:36	83	seq1	1033	99	35M	=	1212	214	TACTATGTTTCTTATCTGCACATTACTACCCTGCA	==========8===;;=========;==77%41=;	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:152:918:824	83	seq1	1033	99	35M	=	839	-229	TACTATGTTTCTTATCTGCACATTACTACCCTGCA	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:81:786:340	83	seq1	1033	99	35M	=	863	-205	TACTATGTTTCTTATCTGCACATTACTACCCTGCA	;<;<<<;<<;<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:196:11:27	147	seq1	1035	65	36M	=	1198	199	CTATGTTTCTTATCTGCNCATTACTACCCTGCAATT	<<<<<<<<;<<<<<<<8!4<<<;+<88;8<+2,8<;	MF:i:18	Aq:i:24	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS192_3:7:298:644:697	83	seq1	1035	99	35M	=	863	-207	CTATGTTTCTTATCTGCACATTACTACCCTGCAAT	8:<8;<;:7;<<;4;:+<7<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:30:812:345	83	seq1	1036	99	36M	=	871	-201	TATGTTTCTTATCTGCACATTACTACCCTGCAATTA	;<;<<<<5<<<:<;<:<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:178:305:843	83	seq1	1037	99	35M	=	864	-208	ATGTTTCTTATCTGCACATTACTACCCTGCAATTA	<<<<<<<4<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:30:788:376	147	seq1	1038	99	35M	=	866	-207	TGTTTCTTATCTGCACATTACTACCCTGCAATTAA	:5<<4:88;9<<<<<;<<<<;<8<;<<<<1<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:1:145:71:26	83	seq1	1040	99	35M	=	875	-200	TTTCTTATCTGCACATTACTACCCTGCAATTAATA	882;8;<;;887<<<;;<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:157:42:763	147	seq1	1040	99	35M	=	1203	198	TTTCTTATCTGCACATTACTACCCTGCAATTATTA	<<;<;<<<<<;<:4<<<<<<<<<;;4<<<:;;+;+	MF:i:18	Aq:i:61	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+B7_589:8:74:674:124	83	seq1	1041	99	35M	=	854	-222	TTCTTATCTGCACATTACTACCCTGCAATTAATAT	;;;;;<<:<<:<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:154:818:165	83	seq1	1041	99	35M	=	881	-195	TTCTTATCTGCACATTACTACCCTGCAATTAATAT	;;;;<<<;<;;<;<<<<;<<;;;<<;<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:319:174:811	83	seq1	1044	99	35M	=	1242	233	TTATCTGCACATTTCTACCCTGCAATTAATATAAT	<<<<<<<<<;<<<<<<<<<;;<<<<<<<8<<;9<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_19:3:87:133:930	147	seq1	1044	99	40M	=	1198	194	TTATCTGCACATTACTACCCTGCAATTAATATAATTGTGT	<<<7<<<<;<<;7<<7<<;;<<<;<5;<;;;5;;<:/48:	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:44:1466:425	147	seq1	1044	99	35M	=	1213	204	TTATCTGCACATTACTACCCTGCAATTAATATAAT	<<<<<<<<<<<<<<<<<<<<<;<<<<<<;<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:236:498:526	83	seq1	1048	99	35M	=	895	-188	CAGCACATTACTACCCTGCAATTAATATAATTGTG	<%88<;<:8<<<<:<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_64:3:143:310:958	83	seq1	1048	99	35M	=	868	-215	CTGCACATTACTACCCTGCAATTAATATAATTGTG	84<;<6<<<<;<<<;;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:312:837:406	83	seq1	1048	99	35M	=	889	-194	CTGCACATTACTACCCTGCAATTAATATAATTGTG	;<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:166:42:147	147	seq1	1048	99	35M	=	898	-185	CTGCACATTACTACCCTGCAATTAATATAATTGTG	3.7;;;;:<<<77<<3<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:279:763:945	83	seq1	1048	99	36M	=	1210	198	CTGCACATTACTACCCTGCAATTAATATAATTGTGT	<<<<<<<<<<<<<<<<<<<4:<<47<:<;<<</<9<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:82:998:566	147	seq1	1050	99	35M	=	1227	212	GCACATTACTACCCTGCAATTAATATAATTGTGTC	<<<<<<<:<<0<<<<:<82<<::<4<<;<<4<4<;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:228:587:504	147	seq1	1050	65	35M	=	891	-194	GCACATTACGACCCGGCAAGGTGTATAATTGTGTC	;4;4;&&82&04+&&48;3&3&*<7<47<<;-<-8	MF:i:-126	Aq:i:65	NM:i:6	UQ:i:47	H0:i:0	H1:i:0
+B7_595:6:290:270:557	147	seq1	1052	99	35M	=	880	-207	ACATTACTACCCTGCAATTAATATAATTGTGTCCA	87:9;;;<851+:5.<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:134:243:630	83	seq1	1052	99	35M	=	871	-216	ACATTACTACCCTGCAATTAATATAATTGTGTCCA	63<;37:<*&:<<<,,*<<:7<<7<<<<<<<::<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:47:303:887	147	seq1	1052	96	35M	=	1240	223	ACATTACTACCCTGCCATTAATATACTTGTGTCCA	<<;;<+<9<<<<<9<(6<;//</<8(<<89;6084	MF:i:18	Aq:i:25	NM:i:2	UQ:i:14	H0:i:0	H1:i:0
+EAS221_3:8:74:770:1712	147	seq1	1052	99	35M	=	1208	191	ACATTACTACCCTGCAATTAATATAATTGTGTCCA	<<<<<<<<<<<<<<<<<<<5<<<<<<<<<<<<7<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:29:575:453	147	seq1	1056	99	36M	=	1228	208	TACTACCCTGCAATTAATATAATTGTGTCCATTTAC	<<<<<<<<<<<<<<<<<<<<<<<<7<1<:<9<&<98	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_97:5:318:177:383	147	seq1	1056	99	35M	=	1251	230	TACTACCCTGCAATTAATATAATTGTGTCCATGTA	;<<<<<<<<;<<<<<<<<<<<<<<<<<<7<;1'<;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:8:179:549:753	83	seq1	1056	99	35M	=	1218	197	TACTACCCTGCAATTAATATAATTGTGTCCATGTA	<<<<<<<<<<<<<<<<<<<<<<<<8<7<<<:<9<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:30:816:90	83	seq1	1057	99	35M	=	885	-207	ACTACCCTGCAATTAATATAATTGTGTCCATGTAC	:<3:%9299<<<<<<<<<5<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:2:178:77:424	147	seq1	1058	99	35M	=	900	-193	CTACCCTGCAATTAATATAATTGTGTCCATGTACA	:5:8<;<;:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:301:54:240	83	seq1	1061	99	35M	=	882	-214	CCCTGCAATTAATATAATTGTGTCCATGTACACAC	&..*3===1=========5.5==5===4====:5=	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:91:521:517	83	seq1	1061	99	35M	=	1239	213	CCCTGCAATTAATATAATTGTGTCCATGTACACAC	<<<<<<<<<<<<<<<<9<<<<<<<<<<8<<;;;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:24:1374:211	147	seq1	1064	99	35M	=	915	-184	TGCAATTAATATAATTGTGTCCATGTACACACGCT	77661;;;5;;:;;:;:;;;;;;8:;;;:;;;;;:	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:282:567:481	147	seq1	1064	88	35M	=	880	-219	TGCAATTAATATAATTGTGTCCACGTACACACGCT	<9<6<;<9<<<;<<<;<5<7<5</7<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS188_7:4:171:104:398	83	seq1	1066	99	35M	=	885	-216	CAATTAATATAATTGTGTCCATGTACACACGCTGT	79<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:9:80:353	147	seq1	1067	99	35M	=	1233	201	AATTAATATAATTGTGTCCATGTACACACGCTGTC	<<<<<<<<<<<<<<<<<<<<<6<<<;;<<5<<2;2	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:6:42:920:522	147	seq1	1067	99	35M	=	1244	212	AATTAATATAATTGTGTCCATGTACACACGCTGTT	<<<<<<<<<<<<<:<<<<<<<:<<<<<<<:;;::&	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_95:3:308:956:873	147	seq1	1068	99	35M	=	870	-233	ATAAAAATAAGTGTGTCCATGTACACACGCTGTCC	91.97&9499&-1*98*19999839999.9&9799	MF:i:18	Aq:i:31	NM:i:3	UQ:i:23	H0:i:0	H1:i:1
+EAS139_19:6:84:438:1505	147	seq1	1068	99	40M	=	893	-215	ATTAATATAATTGTGTCCATGTACACACTCTGTCCTATGT	:0::413::;:::0:179::3<;<:<9<&6<<<;<019<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS51_62:3:55:340:837	147	seq1	1069	99	35M	=	1238	204	TTAATATAATTGTGTCCATGTACACACGCTGTCCT	<<;<<;<<<<<8<;<<<;<7<<<;<<<<<93+79(	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:262:965:756	147	seq1	1069	99	35M	=	885	-219	TTAATATAATTGTGTCCATGTACACACGCTGTCCT	<<:<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:18:571:1110	147	seq1	1070	99	35M	=	888	-217	TAATATAATTGTGTCCATGTACACACGCTGTCCTA	9<<;<;==;;=;=<;<===================	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:40:918:950	147	seq1	1071	99	35M	=	1247	211	AATATAATTGTGTCCATGTACACACGCTTTCCTTT	=========,=9=====2=7===7=0==&=+3=-=	MF:i:18	Aq:i:65	NM:i:2	UQ:i:17	H0:i:1	H1:i:0
+EAS1_97:2:59:882:980	147	seq1	1071	99	35M	=	1263	227	AATATAATTGTGTCCATGTACACACGCTGTCCTAT	<<<<<<<<<8<<<<<9<+<<<9<<<1<<77889+6	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:134:853:558	83	seq1	1071	99	35M	=	880	-226	AATATAATTGTGTCCATGTACACACGCTGTCCTAT	<<<<8<<<7<<<<;;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:278:906:933	147	seq1	1071	99	35M	=	920	-186	AATATAATTGTGTCCATGTACACACGCTGTCCTAT	<88::<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:12:402:843	83	seq1	1072	99	35M	=	885	-222	ATATAATTGTGTCCATGTACACACGCTGTCCTATG	<7<+<<11<9<<<<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:160:434:853	147	seq1	1072	99	35M	=	1259	222	ATATAATTGTGTCCATGTACACACGCTGTCCTATG	<<<<<<<<<<<<<<<<<<<<<<,<<<<:<<<<,<:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:55:8:1412	83	seq1	1072	99	35M	=	910	-197	ATATAATTGTGTCCATGTACACACGCTGTCCTATG	<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:219:294:861	147	seq1	1073	99	35M	=	1244	206	TATAATTGTGTCCATGTACACACGCTGTCCTCTGT	<<<<<<<<<<<<<9<<<5<9<<<9<<544<<'<+:	MF:i:18	Aq:i:69	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS220_1:4:14:1665:1772	147	seq1	1073	84	35M	=	1263	225	TATAATGGTGTCCATGTACACACGCTGTCCTATGT	<<<<<7*<<<<<<<<<78<5<<7<<5<556<(73(	MF:i:18	Aq:i:39	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+B7_591:3:45:294:380	147	seq1	1074	80	36M	=	1233	195	ATAATTGTGTCCATGTACACACGATGTCATATGTAC	<<<<<<<<9<<<<<<<<<70<<7<6272&:3<+</%	MF:i:18	Aq:i:39	NM:i:2	UQ:i:32	H0:i:0	H1:i:1
+EAS1_108:7:222:538:267	83	seq1	1074	99	35M	=	1228	189	ATAATTGTGTCCATGTACACACGCTGTCCTATTTA	<<<<<<<<<<<<<<<<<<<<<;<<<<74;;39%6+	MF:i:18	Aq:i:67	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_93:1:216:381:608	83	seq1	1075	99	35M	=	920	-190	TAATTGTGTCCATGTACACTCGCTGTCCTATGTAC	55<99<<<99;<;<<(<39&7<<<<<<<<<<<<<9	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS54_67:1:138:186:274	83	seq1	1075	99	35M	=	1231	191	TAATTGTGTCCATGTACACACGCTGTCCTATGTAC	=39====9===;=;=;=9=;=====;===-=+=-7	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:43:1120:878	147	seq1	1075	99	35M	=	895	-215	TAATTGTGTCCATGTACACACGCTGTCCTATGTAC	<<<;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:166:776:590	147	seq1	1075	99	35M	=	1252	212	TAATTGTGTCCATGTACACACGCTGTCCTATGTAC	<<<<<</<<<<<<<<<<<<<'<=<:26.</79<::	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:76:333:905	83	seq1	1076	99	35M	=	929	-182	AATTGTGTCCATGTACACACGCTGTCCTATGTACT	<<;<<<<;7<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:29:249:878	83	seq1	1077	99	35M	=	921	-191	ATTGTGTCCATGTACACACGCTGTCCTATGTACTT	<,;<9<;<:<<<<<<<<<<<<<<<<<<<<<<><<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:190:95:706	147	seq1	1078	99	35M	=	920	-193	TTGTGTCCATGTACACACGCTGTCCTATGTACTTA	9;97437;<;;<<;<;<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:101:825:28	83	seq1	1079	99	35M	=	879	-235	TGTGTCCATGTACACACGCTGTCCTATGTACTTAT	0;0'0;<<<<<<8<;<<<<;;3<<;;<<<8<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:188:460:1000	83	seq1	1080	99	35M	=	1251	206	GTGTCCATGTACACACGCTGTCCTATGTACTTATC	<<<<<<<<<<<<<<<<7<<;:4;44<;;:8;;9;;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:3:268:523:511	83	seq1	1081	99	35M	=	1241	195	TGTCCATGTACACACGCTGTCCTATGTACTTATCA	<<<<<<<<<<<<<<<<<<<<;<<<<6<:9<<3<44	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:54:263:585	83	seq1	1081	99	36M	=	1254	209	TGTCCATGTACACACGCTGTCCTATGTACTTATCAT	<<<<<<<<<<<<<<<<<<<:;<<;<:;::<<;;:;4	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:174:987:334	83	seq1	1082	99	35M	=	908	-209	GTCCATGTACACACGCTGTCCTATGTACTTATCAT	,;<;;<<<&<<<1<<<<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:224:932:942	83	seq1	1082	99	34M	=	1250	203	GTCCATGTACACACGCTGTCCTATGTACTTATCA	<<<<<<<<<<<<<<<<<<<<<<;<<<<7<<(;3,	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:12:1296:358	83	seq1	1082	96	35M	=	1252	205	GTCCATGTACACACGCTGTCCTATGTACTTATCAT	;;;6;7;7;;;;;7;9;;-*1;9;699/99/7477	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:306:119:56	147	seq1	1083	99	35M	=	919	-199	TCCATGTACACACGCTGTCCTATGTACTTATCATG	;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:66:179:118	147	seq1	1084	99	35M	=	1262	213	CCATGTACACACGCTGTCCTATGTACTTATCATGA	<<<<<<<<<<<<<<<<<<<<<<<<<<:<<;<<6<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:110:584:649	83	seq1	1084	99	35M	=	1266	217	CCATGTACACACGCTGTCCTATGTACTTATCATGA	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<::<38	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:28:315:310	147	seq1	1085	99	35M	=	1242	192	CATGTACACACGCTGTCCTATGTACTTATCATGAC	<<<<<<<<<<<<<<<<<<<<<:<+.<<.<+7<*17	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:242:4:593	147	seq1	1086	99	35M	=	905	-216	ATATACACACGCTGTCCTATGTACTTATCATGACT	1.%55877+8+88808887+7;7;18:8;;;.&;8	MF:i:18	Aq:i:53	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_93:1:131:946:353	147	seq1	1087	99	35M	=	1249	197	TGTACACACGCTGTCCTATGTACTTATCATGACTC	<<<<<<<<<<<<<;<<<<;;<<<<<<<;<:52;<2	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:4:1732:88	83	seq1	1087	99	35M	=	1265	213	TGTACACACGCTGTCCTATGTACTTATCATGACTC	<<<<<<<<<<<<<<<<<2<8;8<;<8;<2;2:<:<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:58:703:72	83	seq1	1088	99	35M	=	905	-218	GTACACACGCTGTCCTATGTACTTATCATGACTCT	5&<<7;+95;7'6<<<<<.<<<<<;<<9<7<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:113:694:725	147	seq1	1088	99	35M	=	1266	213	GTACACACGCTGTCCTATGTACTTATCATGACTCT	<<<<<<<<<<<<9<<<<<:<<<<<<<<<<:;;<;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:278:848:765	147	seq1	1088	99	35M	=	920	-203	GTACACACGCTGTCCTATGTACTTATCATGACTCT	7;;<;5<55<<;;<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:234:787:12	147	seq1	1092	97	35M	=	1257	200	ACACGCTGGCCTATGTACTTATAATGACTCTATCC	<;<<<9<<&+9;3;<993;<9<+94;9&41;08%9	MF:i:18	Aq:i:24	NM:i:2	UQ:i:15	H0:i:0	H1:i:0
+EAS218_1:4:15:856:340	147	seq1	1093	99	35M	=	936	-192	CACGCTGTCCTATGTACTTATCATGACTCTATCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:258:266:101	147	seq1	1094	99	35M	=	1285	226	ACGCTGTCCTATGTACTTATCATGACTCTATCCCA	<<<<<<<<<<<<<<<<<<5<;,<-2<<<<;68<<6	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:177:552:234	147	seq1	1094	99	35M	=	903	-226	ACGCTGTCCTATGTACTTATCATGACTCTATCCCA	::;:=;=99=====;;====;==========<===	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:134:379:893	147	seq1	1095	99	35M	=	927	-203	CGCTGTCCTATGTACTTATCATGACTCTATCCCAA	7137::;<<<<<<<;<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:256:404:584	147	seq1	1096	99	35M	=	928	-203	ACTGTCCTATGTACTTATCATGACTCTATCCCAAA	&&326+23<3<<<+:<</<<8<<<:7:<<<<<<<<	MF:i:18	Aq:i:60	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_30:4:317:378:535	147	seq1	1096	99	35M	=	1258	197	GCTGTCCTATGTACTTATCATGACTCTATCCCAAA	<<<<<<<<<<<<:<<<<<<<<<;<<;<8<;:7:1(	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:277:482:316	83	seq1	1098	99	35M	=	894	-239	TGTCCTATGTACTTATCATGACTCTATCCCAAATT	9998;<<<<<;;<<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:273:901:459	147	seq1	1098	99	35M	=	938	-195	TGTCCTATGTACTTATCATGACTCTATCCCAAATT	4;+/+7,;<8+&<;;82;;<8<8<2<;<<<<<<<<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:316:25:230	147	seq1	1098	99	35M	=	1273	210	TGTCCTATGTACTTATCATGACTCTATCCCAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<);2;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:24:195:604	83	seq1	1098	99	35M	=	923	-210	TGTCCTATGTACTTATCATGACTCTATCCCAAATT	;6<02;<<<<59<<;<;<<<<9<3<<<<<<<<<;<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:42:923:169	83	seq1	1099	99	35M	=	925	-209	TTCCTATGTACTTATCATGAATCTATCCCAAATTC	&;972<;&<9<,;;;<<<;<&99<<;<;;3<<3<<	MF:i:18	Aq:i:39	NM:i:2	UQ:i:10	H0:i:0	H1:i:1
+EAS114_45:6:59:1548:1096	147	seq1	1099	99	35M	=	1297	233	GTCCTATGTACTTATCATGACTCTATCCCAAATTC	;.;;;;;;;;6;;;;;;;;;;;;;;;73;;77777	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:136:389:320	147	seq1	1100	99	35M	=	930	-205	TCCTATGTACTTATCATGACTCTATCCCAAATTCC	.5:,666<)<8<:<<:66<<<<<<<<<<5<<7<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:122:342:296	83	seq1	1100	99	35M	=	1256	191	TCCTATGTACTTATCATGACTCTATCCCAAATTCC	<<<<<<<<<<<<<<<<<<<<<<<<<;<<*<<<<9<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:259:467:737	83	seq1	1102	99	36M	=	923	-215	CTATGTACTTATCATGACTCTATCCCAAATTCCCAA	8<<<<<<<:<<<<<<<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:71:832:743	147	seq1	1102	99	35M	=	1290	223	CTATGTACTTATCATGACTCTATCCCAAATTCCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<*<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:105:521:563	147	seq1	1103	72	35M	=	1267	199	TATGTACTTATCATGACTCTATCCCAAATTCCCAA	;<)<9995<9<<59<7<<<<7<7<35,0,544<3(	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:201:195:757	147	seq1	1103	99	35M	=	1298	230	TATGTACTTATCATGACTCTATCCCAAATTCCCAA	<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;;8	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:6:585:132	147	seq1	1105	23	36M	=	1276	207	TGTACTTATCATGTTTCTTTCCTAATTTTTCAATTA	6666166&6)+61))646+6&)&%&-44))1'144'	MF:i:-126	Aq:i:23	NM:i:7	UQ:i:59	H0:i:0	H1:i:0
+EAS1_105:2:179:532:82	83	seq1	1105	99	35M	=	1285	215	TGTACTTATCATGACTCTATCCCAAATTCCCAATT	<<<<<<<<<<<<<<<<<<<<3<;<;<<<<:<8<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:11:646:628	147	seq1	1106	99	36M	=	930	-212	GTACTTATCATGACTCTATCCCAAATTCCCAATTAC	<<<3<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:6:93:334:858	147	seq1	1106	99	35M	=	932	-209	GTACTTATCATGACTCTATCCCAAATTCCCAATTA	;<;+;;<<;<<<<<;<<<<;;8<<<<8<<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:26:785:882	83	seq1	1107	99	35M	=	926	-216	TACTTATCATGACTCTATCCCAAATTCCCAATTAC	<<&5&<<<<5.;5<'<<;.76<<<<<7<7<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:4:54:989:654	83	seq1	1108	99	35M	=	1296	223	ACTTATCATGACTCTATCCCAAATTCCCAATTACG	<<<<<<<<<<<<<<<9<<<<<<9<<<<<1<<<88;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:202:326:680	147	seq1	1108	78	35M	=	1268	195	ACTTATCATGACTCTATCCCAAATTCTCAATTACG	<<<<<<<4<<<*<<<*<<<7..:7<3*:7.7<+.;	MF:i:18	Aq:i:37	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+B7_597:3:53:616:842	147	seq1	1109	99	35M	=	1288	214	CTTATCATGACTCTATCCCAAATTCCCACTTACGT	<<<<<<<<<<<<<<<<<<<;07<<<<<-&<<-<4;	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_71:4:209:159:130	147	seq1	1109	99	35M	=	934	-210	CTTATCATGACTCTATCCCAAATTCCCAATTACGT	;:6<:<8::;<<<;<-<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:75:917:886	83	seq1	1110	99	35M	=	951	-194	TTATCATGACTCTATCCCAAATTCCCAATTACGTC	<<<<8<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:286:753:854	147	seq1	1110	99	35M	=	1288	213	TTATCATGACTCTATCCCAAATTCCCAATTACGTC	<<<<<<<<<<<<<<<<<<3<<<<<<9999<;<<9;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:290:146:36	83	seq1	1110	99	35M	=	1280	205	TTATCATGACTCTATCCCAAATTCCCAATTACGTC	<<<<<<<<<<<<<<<<<<<<<<<8<<<<<;;<;;<	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:93:1475:542	147	seq1	1110	99	35M	=	1254	179	TTATCATGACTCTATCCCAAATTCCCAATTACGTC	;;;;;;;;;;;;;;;;;;;;;;9;;;9;;;77777	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:77:251:446	83	seq1	1110	99	35M	=	939	-206	TTATCATGACTCTATCCCAAATGCCCAATTACGTC	<<24,:8<<<:1<<<:35<:<:,<<<<<<:5:<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:11	H0:i:0	H1:i:1
+EAS1_105:3:176:431:647	147	seq1	1112	99	35M	=	1285	208	ATCATGACTCTATCCCAAATTCCCAATTACGTCCT	<<<<<<<<<<<<<<<<2<<<<<<<<6<<<<9<<6<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:111:796:737	147	seq1	1112	99	35M	=	936	-211	ATCATGACTCTATCCCAAATTCCCAATTACGTCCT	<3<<<<<<<<<<<7<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:228:189:826	147	seq1	1112	99	35M	=	914	-233	ATCATGACTCTATCCCAAATTCCCAATTACGTCCT	:74=:.==1==========================	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:35:631:594	147	seq1	1112	99	35M	=	1271	194	ATCATGACTCTATCCCAAATTCCCAATTACGTCCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:29:529:379	83	seq1	1117	99	35M	=	926	-226	GACTCTATCCCAAATTCCCAATTACGTCCTATCTT	;<<<:<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:74:596:137	83	seq1	1119	91	35M	=	1294	210	CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT	<<<<<<<<<</4<<<<<<*<:6<<<<<<<<;/3<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:92:1807:1185	147	seq1	1119	99	35M	=	940	-214	CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT	<<<<<<9<<<<<<<<<<<<<<<<<<<<<<><<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:57:735:151	83	seq1	1121	94	35M	=	1314	228	CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC	<<<<<<<<8<<8<:<<*<:<<<4<<<;,<<<<:<:	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:142:858:903	147	seq1	1121	99	35M	=	943	-213	CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC	<<<<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:247:522:670	83	seq1	1121	99	35M	=	960	-196	CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC	;;;9;:<<<<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:75:732:442	83	seq1	1121	99	40M	=	1293	212	CTATCCCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG	<<<<<;<<<<<9<<<;<<;<<<5<<;8<<<<<<<<;:9%%	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:183:645:699	83	seq1	1122	86	35M	=	1281	194	TATCCCAAATTCCCAATTACGTCCTATCTTCTTCT	<<9<9<<<<<<<<<;<<;<<*175;173<;;;<-/	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:175:437:950	147	seq1	1126	99	35M	=	1298	207	CCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:59	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:93:1002:845	83	seq1	1129	99	35M	=	954	-210	AATTCCCAATTACGTCCTATCTTCTTCTTAGGGAA	<<::;;;<<<<<<<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:50:542:881	147	seq1	1132	99	35M	=	1324	227	TCCCAATTACGTCCTATCTTCTTCTTAGGTAAGAA	<<<<<4<09<<9<<2<<<<<<<<<<<2/.&2<%<7	MF:i:18	Aq:i:63	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_99:3:118:851:285	83	seq1	1133	99	35M	=	953	-215	CCCAATTACGTCCTATCTTCTTCTTAGGGAAGAAC	3+7<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:67:191:668	147	seq1	1134	99	35M	=	995	-174	CCAATTACGTCCTATCTTCTTCTTAGGGAAGAACA	<<<<<7<<7<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:166:203:416	83	seq1	1136	99	35M	=	963	-208	AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC	<<<<<<<<::<<<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:15:1497:1530	83	seq1	1136	99	35M	=	1314	213	AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC	0<;;;9;;86<;;;<<&<<.<<;)3;7;654-471	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:206:563:262	83	seq1	1137	99	35M	=	971	-201	ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT	<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:40:352:151	83	seq1	1137	99	35M	=	1327	225	ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT	<<<<<<<<<<<<<<<;<<9<<<<:<<<<;<99<3<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:67:302:762	83	seq1	1138	99	36M	=	1313	211	TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA	<<<<<<<<<<<<<<<<<<<<;;65;<-<;<:8<<<3	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:84:927:843	147	seq1	1138	99	35M	=	938	-235	TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTT	588;<:<<<<<<<6<<<<;<<<:/<<3<:;<*<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:5:147:479:41	147	seq1	1139	99	35M	=	1322	218	TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA	<<<<<<<<<<<<<<<<<<<<::6<<;<<<;;9;;6	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:329:177:267	83	seq1	1139	99	35M	=	962	-212	TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:72:916:763	147	seq1	1142	99	35M	=	1340	233	GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT	</:8<8)<<<<:<<<<<;.89<:67<.;<<7+336	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:124:128:489	83	seq1	1142	99	35M	=	1348	241	GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT	<<<<<<<<<<<<<<<<<6:6<<-4<::;;<<:48<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:39:59:738	83	seq1	1142	99	35M	=	965	-212	GTCCTATGTTCTTCTTAGGGAAGAACAGCTTAGGT	;.;4;<;3<<9<<9<&<<9<<<<<;<9<;<<;9<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:18	H0:i:0	H1:i:1
+EAS1_99:6:63:48:631	83	seq1	1143	99	35M	=	957	-221	TCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTA	;*:;;<2<<2779;:<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:274:176:479	147	seq1	1144	99	35M	=	976	-203	CCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTAT	7)<<7<626<<7<<<<<<<<<<<<<<<<<<<3<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:72:1809:1398	147	seq1	1145	99	35M	=	958	-222	CTATCTTCTTCTTAGGGAAGAACAGCTTAGGTATC	;:;;:<7:7<:<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:235:805:373	83	seq1	1146	99	35M	=	983	-198	TATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCA	<<;<<<<<<9<9<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:269:944:220	83	seq1	1147	99	35M	=	953	-229	ATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAA	<;<;8<<;7<<<<<;<<-<<<<<<;<<<;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:174:597:66	147	seq1	1148	99	35M	=	1307	194	TCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAAT	<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;6;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:229:717:121	147	seq1	1150	99	35M	=	995	-190	TTCTTCTGAGGGAAGAACAGCTTAGGTATCAATTT	6;-;7<<(<<<<<8<18<7<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:7	H0:i:0	H1:i:1
+EAS56_53:1:23:403:981	147	seq1	1151	99	35M	=	985	-201	TCTTCATAGGGAAGAACAGCTTAGGTATCAATTTG	(;3+<&3<</7<<<<<<;<<<<<<<<<<<<</<2<	MF:i:18	Aq:i:65	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS112_32:7:168:117:441	147	seq1	1151	99	35M	=	990	-196	TCTTCTTAGGGAAGAACAGCTTAGGTATCAATTTG	;;;;3;<<<<<<<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:52:1455:1212	83	seq1	1153	99	40M	=	1304	191	TTCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTCT	<9<<<99<;<<9<;<-<<<6<<75;;<*%<5<3+.8:*5;	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:37:400:627	83	seq1	1154	99	35M	=	961	-228	TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTG	474*;<<9<;<<<;<<:<<<<<<;<<<<<<;<<;<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:11:868:62	147	seq1	1154	99	36M	=	983	-207	TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGT	;;77;;7<<<<<<<<7<<<;<7<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:209:92:210	83	seq1	1156	99	35M	=	965	-226	TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT	;9;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:128:394:455	147	seq1	1156	99	35M	=	1313	192	TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT	======6==========;===9==;5===;==;==	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:316:949:122	83	seq1	1156	99	35M	=	1321	200	TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0<:<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:60:1020:1259	147	seq1	1157	99	35M	=	996	-196	TAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:193:38:987	83	seq1	1158	99	35M	=	964	-229	AGGGAAGAACAGCTTAGGTATCAATTTTGTGTTCT	<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_93:5:292:122:666	147	seq1	1159	99	35M	=	985	-209	GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG	<;<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:280:512:316	83	seq1	1159	99	35M	=	984	-210	GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG	;9===;======;7==;;======;=====;====	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:207:926:427	83	seq1	1159	99	35M	=	973	-221	GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG	;;7<<;4<<<2<<;<<<<<<<<<<7<;<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:239:796:221	83	seq1	1160	99	35M	=	992	-203	GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT	;;<<;<<;<<<+:<<<4<4<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:142:457:584	147	seq1	1160	99	35M	=	999	-196	GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT	8::<:<<9<<.<:<<<<<<<<<<<7<<<<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:190:481:295	83	seq1	1161	99	35M	=	990	-206	GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG	;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:86:308:648	147	seq1	1161	99	35M	=	970	-226	GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG	<7<<<;<<<<+;<<<2<5<<<77;<<2<;;<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:182:23:585	83	seq1	1163	99	35M	=	1336	208	AGAACAGCTTAGGTATCAATTTGGTGTTCTGTGTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:216:650:516	83	seq1	1164	99	36M	=	1326	198	GAACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:15:805:420	83	seq1	1164	35	35M	=	998	-201	GAACAGTTTAGGTATCAATTTGGTGTTCTTTGTAA	<64<59&996<(64<)7).68<0<0<<7741<1:<	MF:i:18	Aq:i:35	NM:i:2	UQ:i:24	H0:i:0	H1:i:1
+EAS56_65:6:82:822:767	147	seq1	1165	99	35M	=	972	-228	AACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA	<<9<<<<<<<<<<;;<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:33:1566:588	147	seq1	1166	76	35M	=	985	-216	ACAGCTTAGGCATCAATTTGGTGTTCTGTGTAAAG	-6246;;97;77;;97;;;;;;9;7;79;)&;37;	MF:i:18	Aq:i:37	NM:i:1	UQ:i:22	H0:i:0	H1:i:1
+EAS1_93:1:20:635:509	147	seq1	1167	99	35M	=	1333	201	CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT	<<<<<<<<<;<<<<;<<<;<;;;<<<;<<<<<<(8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:144:28:475	147	seq1	1167	99	35M	=	974	-228	CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT	;;;9;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:36:1402:1709	147	seq1	1168	99	35M	=	1326	193	AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC	<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<:9<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:34:956:1309	147	seq1	1168	99	35M	=	994	-209	AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC	9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:157:784:936	147	seq1	1169	99	35M	=	1356	222	GCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTCT	<<<<<<<<<<<<<<<<<:<<<<<<;<<<<814<4<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:2:152:860:286	83	seq1	1171	99	35M	=	1004	-202	TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCA	2;5;8<<;5<<<;<2<8<<<<<<;8<;<<<<;<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:157:786:424	147	seq1	1171	99	36M	=	981	-226	TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG	;<;2;;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:33:1407:94	147	seq1	1172	99	35M	=	1360	223	TAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG	;;;;;;;6:;;:::7;:;;;;:::;;;;:;47771	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:302:288:657	147	seq1	1173	99	35M	=	1013	-195	AGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAGG	<:5<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:233:97:262	147	seq1	1175	99	35M	=	1021	-189	GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA	--;;7<;<;;:;<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:67:692:110	147	seq1	1175	99	35M	=	1009	-201	GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA	;;<<8<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:68:692:347	147	seq1	1176	99	36M	=	1351	211	TATCAATTTGGTGTTCTGTGTAAAGTCTCATGGAGC	<<<<<<<<<+6<;<<<<3<:<<<<6<8<<<&*/;*0	MF:i:18	Aq:i:64	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS51_64:3:309:303:278	83	seq1	1178	99	35M	=	996	-217	TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC	<:<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:21:132:1423	147	seq1	1178	99	35M	=	1012	-201	TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC	:<<<<<6<<;<<;<5<;<<<<<<;<6<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:63:854:610	83	seq1	1180	99	35M	=	1005	-210	AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT	:.5;2<:88<<72:<<;<<7<8;<;/<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:182:313:319	147	seq1	1180	99	35M	=	1016	-199	AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT	</<;185;8<;;87<;8<<<<8<;83<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:62:603:1552	83	seq1	1180	99	35M	=	1019	-196	AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT	8::;:<<6<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:145:144:796	83	seq1	1181	99	35M	=	1372	226	ATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTC	<<<<<<<<<<<<<<;<<<<<<;<<<<<<4;4;<;/	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:41:474:283	147	seq1	1182	99	35M	=	1018	-199	TTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTCC	6/;;;88;;<:;48<<<<<;<;<<<<<<<<<<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:329:458:365	83	seq1	1186	99	35M	=	1364	213	GTGTTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGT	==========================9========	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:159:222:274	147	seq1	1189	99	35M	=	1019	-205	GTCTGGGGAAAGTCTCAGGGAGCCGTCCGTGTCCT	''7*<&<'<<<<.<2<<<<<<<<<<+<<<8<8<<;	MF:i:18	Aq:i:37	NM:i:3	UQ:i:17	H0:i:0	H1:i:1
+EAS114_32:6:88:162:587	83	seq1	1189	99	35M	=	1372	218	TTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCT	<;<<<<<<<<<;<5<;<;<<7<++<<2&*:322+7	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:148:340:479	83	seq1	1190	99	35M	=	1364	209	TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC	<<<<<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:12:276:1797	147	seq1	1190	99	35M	=	1006	-219	TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC	)9<02)<<<<<<<<<<<<<1<<<<&<<<<9<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:190:42:671	83	seq1	1192	99	36M	=	1008	-220	TGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA	<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:321:271:138	83	seq1	1193	99	35M	=	1394	236	GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA	<<<<<<<<<<<<<<<<<<<<<;9<<;<<;;<88;&	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:154:669:853	147	seq1	1193	99	35M	=	1371	213	GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA	============<===.====<:=<9=<<<9;:;2	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:287:258:321	147	seq1	1194	99	35M	=	1030	-199	TGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCAT	:.<9<)<;<9<.<<:<:+5:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:61:183:767	147	seq1	1195	99	35M	=	1010	-220	GTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATC	6&.;;<3<363<<<<<<<<8<<<6<<<<3<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:29:794:282	83	seq1	1196	99	36M	=	1025	-207	TAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG	7<<<<45::-<<<<<;<<-;<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:313:827:992	83	seq1	1197	99	35M	=	1379	217	AAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG	<<<<6<<<<:<<<<<66<<<:33:<<<80<;6<8+	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:196:11:27	83	seq1	1198	65	36M	=	1035	-199	AAGACCCAGTTAGCCGTCCGTGTCCTCCCATCTGGC	96&6<'<7:!!<,:;+7<<6:<<<<<<<<<7<7;:<	MF:i:18	Aq:i:24	NM:i:4	UQ:i:27	H0:i:0	H1:i:0
+EAS139_19:3:87:133:930	83	seq1	1198	99	40M	=	1044	-194	CAGTCTCAGGGCGCCGTCCGTTTCCTCCCATCTGGCCTCG	)8&)907)-;9&,<<9)<;<<0<;<<99<<<<<<;<<9<<	MF:i:18	Aq:i:39	NM:i:3	UQ:i:28	H0:i:0	H1:i:1
+EAS114_45:7:97:1584:777	147	seq1	1200	99	35M	=	1013	-222	GTCTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCC	66746,9::9;;;;:;;;;;;;;;;;;;;;:;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:127:153:861	83	seq1	1202	99	35M	=	1374	207	CTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTC	<<<<<<<<<<<<<<<<<<<<<<<=<*<<<24;;::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:157:42:763	83	seq1	1203	99	35M	=	1040	-198	TCTGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCG	4++;((2(5;24<./<:<<<<<<<<;<<88<<<<9	MF:i:18	Aq:i:61	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS54_65:4:91:267:655	83	seq1	1204	99	35M	=	1365	196	CAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGT	<<<<<<<<<<<<<<<<<<<<<;:;;7<9477<74;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:39:966:551	147	seq1	1205	99	35M	=	1026	-214	AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC	8;;;;;<<6'<<<+8<<<1<<<<4<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:61:38:1182	147	seq1	1205	99	35M	=	1388	218	AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:47:352:1492	83	seq1	1205	99	40M	=	1385	220	AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGCCCACTA	:<<<::<24<04-&<;<<2<<<&<60)&<5<<6*8:)9+*	MF:i:18	Aq:i:53	NM:i:3	UQ:i:28	H0:i:1	H1:i:0
+EAS221_3:8:74:770:1712	83	seq1	1208	99	35M	=	1052	-191	GAGCCGTCCGTGTCCTCCCATCTGGCCTCGTCCAC	3.&::6<<<9<6:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:279:763:945	147	seq1	1210	99	36M	=	1048	-198	GCCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT	+9:-+<:1-44<<':<;<+<-<<<;:<<;;<<<<<0	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:306:388:342	147	seq1	1211	99	35M	=	1398	222	CCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT	================5====:=====;==1=4==	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:180:905:36	147	seq1	1212	99	35M	=	1033	-214	CCTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG	6%%<;<662<<*;<<<8<<:<<<<<<<<<<<<<<;	MF:i:18	Aq:i:65	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS218_1:2:19:752:816	83	seq1	1212	99	35M	=	1394	217	CGTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG	<<<<<<<<<<<<<<<<<<<8<7;<;<<767277;6	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:305:565:952	147	seq1	1213	99	36M	=	1030	-219	GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT	5(<1<147<81<*8--8<<<7<91<<<;+<+<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:44:1466:425	83	seq1	1213	99	35M	=	1044	-204	GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGG	6-<<9<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:68:64:783	147	seq1	1214	99	35M	=	1402	223	TCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT	<<<<<<<<<<<<<<<<<;;<<<<<<;<<<9:<<:9	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:7:64:37:257	147	seq1	1215	99	35M	=	1389	209	CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT	================<=====;===8;4======	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:20:413:1334	83	seq1	1215	99	35M	=	1370	190	CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT	7<<;<<<.;<;67;7;;;:;;3;<59+...77677	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:8:179:549:753	147	seq1	1218	99	35M	=	1056	-197	TGTCCTCCCATCTGGCCTCGTCCACACTGGTTCTC	:77<</<<<::<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:16:823:343	83	seq1	1223	99	35M	=	1403	215	TCCCATCTGGCCTCGTCCACACTGGTTCTCTTGAA	================================4==	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:266:556:252	83	seq1	1224	99	35M	=	1392	203	CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA	<<<<<<<<<<<<<<<<<;<<<<<<4;;<;;;<7;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:278:524:521	83	seq1	1224	99	35M	=	1025	-234	CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA	7777,<;<<7<<<<;;<<;;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:72:1426:1883	83	seq1	1226	99	35M	=	1405	214	CATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:82:998:566	83	seq1	1227	99	35M	=	1050	-212	ATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCT	<9<9<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:29:575:453	83	seq1	1228	99	36M	=	1056	-208	TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTTG	;<<<;;<:<<<;<;<<<<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:222:538:267	147	seq1	1228	99	35M	=	1074	-189	TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTT	52/8-<<7<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:138:186:274	147	seq1	1231	99	35M	=	1075	-191	GGCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGG	<;<<<<<6;<<<<<3<<36;3;<9<<<<<<3;<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:137:895:681	83	seq1	1232	99	35M	=	1418	221	GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<-8<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:71:636:533	83	seq1	1232	99	35M	=	1398	201	GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC	<<<<<<<<<<<<<<<<<<<<<<<7<<<5<<<-847	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:45:294:380	83	seq1	1233	80	36M	=	1074	-195	CCTCGTCCACACTGGTTCGCTTGAAAGCTTGGGCTG	;<+<7<<<<;7<,<7<<<+/7;<<;<<;7<<<;<<<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS51_66:8:9:80:353	83	seq1	1233	99	35M	=	1067	-201	CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT	;;5;:8<:<:;:;<<<<;<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:73:302:1574	83	seq1	1233	99	35M	=	1429	231	CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT	<<<<<<<<<<;<<<<<<<<<<<<+:;<<;:8;<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:131:779:345	147	seq1	1237	99	35M	=	1399	197	GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA	============================9====;=	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:159:71:155	83	seq1	1237	99	35M	=	1428	226	GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA	=========;=<======;=:=3;==;=6<==;=;	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:55:340:837	83	seq1	1238	99	35M	=	1069	-204	TCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAAT	61378<::<<<5:<;;:<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:91:521:517	147	seq1	1239	99	35M	=	1061	-213	CCACACTGGTTCTCTTGAAAGCTTGGGCTGTAATG	8;8<4=:===7===9=============<======	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:47:303:887	83	seq1	1240	96	35M	=	1052	-223	CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA	<;<6<;<;<8<<<8<<<<;<<<.<<<<<<<8<8;<	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:74:570:695	147	seq1	1240	99	35M	=	1436	231	CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA	=========================7====;8<8;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:3:268:523:511	147	seq1	1241	99	35M	=	1081	-195	ACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGAT	8<7<99<<<<<<<<<:<<<<<<4<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:319:174:811	147	seq1	1242	99	35M	=	1044	-233	CACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATG	;7;3<<3.<<<<<<<<<<<4<<<<<<<<<<<<<0<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:28:315:310	83	seq1	1242	99	35M	=	1085	-192	AAACTGTTCTCTTGAAAGCTTGGGCTGTAATGATG	+%,768<<:<:<2<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:4	UQ:i:70	H0:i:1	H1:i:0
+EAS1_108:1:328:614:638	83	seq1	1243	99	35M	=	1428	220	ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGC	<<<<<<<<<<<<<<<<<<<<4/;<<9<<<<7<<*:	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:63:930:152	147	seq1	1243	99	35M	=	1410	202	ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATTC	<<<<;<<<<<<<7<<;::<<)726;)<99<)&;&+	MF:i:18	Aq:i:59	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_59:1:219:294:861	83	seq1	1244	99	35M	=	1073	-206	CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC	;,;<;<<<;&<<<<<<<5<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:6:42:920:522	83	seq1	1244	99	35M	=	1067	-212	CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC	;;;;;99<;<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:87:89:696	83	seq1	1245	99	36M	=	1419	210	TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<;<:;<<<;<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:166:979:531	147	seq1	1245	99	35M	=	1410	200	TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCC	<<</<<<<<<<<<9<<9<<;<7<<<<9<<<9<,)6	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:40:918:950	83	seq1	1247	99	35M	=	1071	-211	GTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCCT	=0=&&33======;=====.===============	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:131:946:353	83	seq1	1249	99	35M	=	1087	-197	TCTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTG	<<:<<66<<<6<<4<<<:8<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:224:932:942	147	seq1	1250	99	35M	=	1082	-203	CTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGG	<;<<;;<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:318:177:383	83	seq1	1251	99	35M	=	1056	-230	TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC	5:9;7;777<<7<<<<<<<<<<<<<<<<<<<<<<4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:188:460:1000	147	seq1	1251	99	35M	=	1080	-206	TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC	+;+077<7;<57<;;8<<<<<<<<<<8<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:12:1296:358	147	seq1	1252	96	35M	=	1082	-205	CTTGAAAGCTTGGTCTGTAATGATGCCCCTTGGCC	-770074;;6;&42;:2;;;:;;;;:;;/:;;;;:	MF:i:18	Aq:i:37	NM:i:1	UQ:i:17	H0:i:0	H1:i:1
+EAS188_4:5:166:776:590	83	seq1	1252	99	35M	=	1075	-212	CTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGCC	<;:;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:54:263:585	147	seq1	1254	99	36M	=	1081	-209	TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCATC	1:::6<<<<;;;<4<<<<<<<<6<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:93:1475:542	83	seq1	1254	99	35M	=	1110	-179	TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCAT	98987:9:<:;:;;;;;<<;<;<;;;;<<<;;;<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:122:342:296	147	seq1	1256	99	35M	=	1100	-191	AAAGCTTGGGCTGTAATGATGCCCCTTGGCCATCA	<:;:<<<;<2<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:234:787:12	83	seq1	1257	97	35M	=	1092	-200	AAGCTTGGGCTGTAATGATGCCCCTTGGCCATCAC	;;.<;;994<;9<<;;;<<<<<<<7<<<<<<<<<;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:317:378:535	83	seq1	1258	99	35M	=	1096	-197	AGCTTGGGCTGTAATGATGCCCCTTGGCCATCACC	;7;':<77<<;<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:160:434:853	83	seq1	1259	99	35M	=	1072	-222	GCTTGGGCTGTAATGATGCCCCTTGGCCATCACCC	;;*4;<;<<<;<<<<<<<8<<<;<<<<<<<<8<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:18:1498:1475	147	seq1	1260	99	35M	=	1427	202	CTTGGGCTGTAATGATGCCCCTTGGCCATCACCCG	<<<<<7<<<<<<+<<-3<<3<:<2<1<<:<<<<<+	MF:i:18	Aq:i:71	NM:i:1	UQ:i:27	H0:i:1	H1:i:0
+B7_593:2:104:744:280	83	seq1	1262	64	36M	=	1421	195	TGGGCTGTAATGATGCCCCTTGTCCATCACCCGGTC	<<<<<<<<<<<<<<;<;<<<<:4<<4<<0<;80+;:	MF:i:18	Aq:i:21	NM:i:2	UQ:i:34	H0:i:0	H1:i:1
+EAS1_95:4:66:179:118	83	seq1	1262	99	35M	=	1084	-213	TGGGCTGTAATGATGCCCCTTGGCCATCACCCAGT	<<99<<<<<<<<<<<<<<<<<<<9<<<:<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:277:194:143	83	seq1	1262	99	35M	=	1444	217	TGGGCTGTAATGATGCCCCTTGGCCATCACCCGGT	<<<<<<<<<<<;<<<<<<<<<<9;<<<8</<<6<:	MF:i:18	Aq:i:72	NM:i:1	UQ:i:21	H0:i:1	H1:i:0
+EAS1_97:2:59:882:980	83	seq1	1263	99	35M	=	1071	-227	GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC	7339%<6<<<<<;<<9<<8<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS220_1:4:14:1665:1772	83	seq1	1263	84	35M	=	1073	-225	GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC	<&7<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_57:2:259:42:969	147	seq1	1265	99	35M	=	1426	196	GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC	<<<<<;<<;<<3<<<;9<36<<29;<<;;;</;<2	MF:i:18	Aq:i:69	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS221_1:4:4:1732:88	147	seq1	1265	99	35M	=	1087	-213	GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC	:<4<:<<:<::<<<<<::<<<<<:<:<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_105:2:110:584:649	147	seq1	1266	99	35M	=	1084	-217	CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT	++:4686<<68<;<;<;<<<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_59:5:113:694:725	83	seq1	1266	99	35M	=	1088	-213	CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT	;::<<:<:<<<<<<<<<<:<:<<<<<<;<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS221_1:8:58:369:244	147	seq1	1266	99	35M	=	1436	205	CTGTAATGATGCCCCTTGGCCATCACCCAGTCCCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:105:521:563	83	seq1	1267	10	35M	=	1103	-199	TGTAATGCTGCCCCTTGGCCATCCCCCGGTCCCTG	/8)-8/6(98<967<3<<979<<1<<<7<<<<7<<	MF:i:18	Aq:i:10	NM:i:3	UQ:i:45	H0:i:0	H1:i:0
+EAS188_4:5:202:326:680	83	seq1	1268	78	35M	=	1108	-195	GTAATGATGCCCCTTGGCCATCACCCGGTCCCTGC	+33<81<:*<;<;;30;<<<;<<<8<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS192_3:6:216:292:528	83	seq1	1269	99	35M	=	1438	204	TAATGATGCCCCTTGGCCATCACCCAGTCCCTGCC	<;<;<<<<<<<;<<<<<<<<;;;;:;;:<%<;1;:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:67:1864:477	147	seq1	1270	99	35M	=	1465	230	AATGATGCCCCTTGGCCATCACCCAGTCCCTGCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:35:631:594	83	seq1	1271	99	35M	=	1112	-194	ATGATGCCCCTTGGCCATCACCCGGTCCCTGCCCC	<<<<4<<<<<.<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS112_34:8:103:812:255	83	seq1	1272	99	35M	=	1461	224	TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCC	<<<<<<<<<<<<<<<9<<;<<<39;;<;32:7;7+	MF:i:18	Aq:i:69	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS188_7:4:259:869:641	83	seq1	1272	99	35M	=	1435	198	TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCA	<<<<<<<<<<<<<<<<<<<<<,;<:<<<<<<<<<1	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:316:25:230	83	seq1	1273	99	35M	=	1098	-210	GATGCCCCTTGGCCATCACCCGGTCCCTGCCCCAT	8;8;<<;<;;<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS221_1:6:38:1071:155	83	seq1	1274	99	35M	=	1465	226	ATGCCCCTTGGCCATCACCCAGTCCCTGCCCCATC	<<<<<<<<<<<<<:<<<<<<<<8<<<:<<:;;8:;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:6:585:132	83	seq1	1276	23	36M	=	1105	-207	GCCCCTTGACCACCACCCAGTCCCTGCCCCATCTCT	:<473$'<+5;7*+<7<&<37<7<<<<7;;7<<:<7	MF:i:18	Aq:i:23	NM:i:2	UQ:i:19	H0:i:0	H1:i:0
+B7_595:6:47:720:789	83	seq1	1278	90	35M	=	1455	212	CCCTTGGCCATCACCCGGTCCCGGCCCCTTCTCTT	<<72<<<<<<<<;;<7;,0<2;*7<2;<*;;<<64	MF:i:18	Aq:i:25	NM:i:3	UQ:i:44	H0:i:0	H1:i:0
+EAS192_3:6:185:868:496	147	seq1	1278	99	35M	=	1442	199	CCCTTGGCCATCACCCAGTCCCTGCCCCATCTCTT	<<<<<<<<<<<<;<<<;<<<<<<<<<<<9<<;<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:290:146:36	147	seq1	1280	99	35M	=	1110	-205	CTTTCCCATCCCCCGGTCCCTGCCCCATCTCTTGT	7;%%%<8-4<(<<<7<<<:<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:25	NM:i:4	UQ:i:37	H0:i:0	H1:i:0
+B7_593:5:267:71:603	83	seq1	1281	99	36M	=	1446	201	TTGGCCATCACCCAGTCCCTGCCCCATCTCTTGTAA	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<9;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:183:645:699	147	seq1	1281	86	35M	=	1122	-194	GTGGCCCTCCCCCATTCCCTGCCCCATCTCTTGTA	&)))2-&420<<<'--<6:6-<7<<<+:7<65<<<	MF:i:18	Aq:i:21	NM:i:4	UQ:i:37	H0:i:0	H1:i:0
+EAS1_105:2:179:532:82	147	seq1	1285	99	35M	=	1105	-215	CCATCACCCGGTCCCTGCCCCATCTCTTGTAATCT	<:96<6<<<<89<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_105:3:176:431:647	83	seq1	1285	99	35M	=	1112	-208	CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT	<(9(<<<7;<<7<<<<<<<7<<<<<<7<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:258:266:101	83	seq1	1285	99	35M	=	1094	-226	CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT	%==/7&8=======:===6================	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:179:735:569	147	seq1	1286	99	35M	=	1461	210	CATCACCCGGTCCCTGCCCCATCTCTTGTAATCTC	<<<<<<<<<<<<<<<<<<<<3<<<<<<<<4/<;<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS188_7:3:200:712:439	147	seq1	1286	99	35M	=	1435	184	CGTCACCCGGTCCCTGCCCCATCTCTTGTAATCTC	<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:2	UQ:i:49	H0:i:0	H1:i:0
+EAS1_103:5:319:165:698	83	seq1	1287	99	35M	=	1485	233	ATCACCCAGTCCCTGCCCCATATCTTGTAATCTCT	<<<<<<<<<<<<<<<<<<<3<9<<<<<<<;<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:24	H0:i:0	H1:i:1
+B7_597:3:53:616:842	83	seq1	1288	99	35M	=	1109	-214	TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC	;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:286:753:854	83	seq1	1288	99	35M	=	1110	-213	TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC	;<2<<<,57:<<9<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:14:1256:204	83	seq1	1288	99	35M	=	1467	214	TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC	<<<<<;;;;;;<;;;;;;;<;<;;;;<:-;79697	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:289:132:526	83	seq1	1289	99	36M	=	1472	219	CACCCGGTCCCTGCCCCATCTCTTGTAATCTCTCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<8<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS218_1:4:71:832:743	83	seq1	1290	99	35M	=	1102	-223	ACCCAGTCCCTGCCCCATCTCTTGTAATCTCTCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:102:511:946	83	seq1	1291	26	35M	=	1461	205	CCCAGTCCCTGCCCCATCTCGGGTAATCTCTCTCC	<<9<<;<<<<;<<<<;<<7;%<5<<0<<<)<.<.+	MF:i:18	Aq:i:26	NM:i:2	UQ:i:31	H0:i:0	H1:i:0
+EAS114_39:5:42:1223:1087	83	seq1	1293	99	35M	=	1479	221	CAGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTT	<<<<<<<<<<<<<5<<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:75:732:442	147	seq1	1293	99	40M	=	1121	-212	CGGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	7,*&28<61:88<.7<:<<:6<1<85:<:1<5<&::<<&<	MF:i:18	Aq:i:60	NM:i:1	UQ:i:11	H0:i:1	H1:i:0
+EAS54_73:3:23:502:103	147	seq1	1294	99	35M	=	1486	227	AGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTT	<2<<<<<<<<<<.<<<<<<<:1&:<<<7<<<<<<:	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:74:596:137	147	seq1	1294	91	35M	=	1119	-210	GGTCCCTGCCCCATCGCTTGTAATCTCTCGCCTTT	+40778449779049'+*87489498949%89948	MF:i:18	Aq:i:22	NM:i:3	UQ:i:32	H0:i:0	H1:i:0
+EAS51_66:8:36:688:722	83	seq1	1295	99	35M	=	1469	209	GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:8:60:182:718	147	seq1	1295	99	35M	=	1485	225	GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT	<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;<;<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:4:54:989:654	147	seq1	1296	99	35M	=	1108	-223	TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT	,<1<2<<<;9)9<<;<<;<<<4<<<;<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:9:203:653	147	seq1	1296	99	35M	=	1488	227	TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT	<<<<<<<<<<<<<<<<<<<<<<::<9<<<<<;;;<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:322:631:245	147	seq1	1297	99	36M	=	1474	213	CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	<<<<<<<<<<<<<<<<<0<<<<<<<<<<<<<<<<5;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:59:1548:1096	83	seq1	1297	99	35M	=	1099	-233	CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG	88888;;88;;;;8;;9;;;<<<<<<<<<<<<<<;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:52:1779:1664	83	seq1	1297	99	35M	=	1462	200	CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG	<<<<<<<<<<<<<<<<<<71<<<<<<<<<<<<<<%	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:218:173:667	83	seq1	1298	99	35M	=	1448	185	CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	<<<<<<<<<<<<<<<6<<<<<<<<<<<<<<<<<.<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:175:437:950	83	seq1	1298	99	35M	=	1126	-207	CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	;;5:;;9<<:<;<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:201:195:757	83	seq1	1298	99	35M	=	1103	-230	CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	:<':<:<<46<:<;:<;<;<<9<<<<<<<<;<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:8:377:655	83	seq1	1299	99	35M	=	1473	209	CTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:50:950:562	83	seq1	1301	99	35M	=	1473	207	GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGC	<<<<<<<<<<<<<<<&<<8<<<<<<<5<:<+<:+;	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:153:543:671	83	seq1	1301	99	34M	=	1465	199	GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<<7	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:33:1193:664	147	seq1	1301	99	40M	=	1474	213	GCCCCATCTCTTGTAATCTCTCTCCTTTTTTCTGCATCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<%:<'<9:::9	MF:i:18	Aq:i:71	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_93:1:253:59:242	83	seq1	1302	99	35M	=	1478	211	CCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<</<<9;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:52:1455:1212	147	seq1	1304	99	40M	=	1153	-191	CCATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGT	6::4::;4%;9:<79)<:<;<<:4::7<<9<&+71<9;<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:316:176:543	83	seq1	1305	99	35M	=	1469	199	CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC	====<=9===<<<=====9====<<=3==,96==9	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:50:1339:1154	147	seq1	1305	99	35M	=	1481	211	CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC	==========<<==============;==7<;<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:169:292:652	83	seq1	1306	99	35M	=	1510	239	ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC	<<<<<<<<<<<<<<<<<<<<<<<<<6<<-<<<<8<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:11:706:1030	83	seq1	1306	92	35M	=	1469	198	ATCTCTTGTAATCTCTCTCATCTTTGCTGCATCCC	<<<2<<2<<<<<<<<<<<<0<&<<<+<:2<4<<):	MF:i:18	Aq:i:26	NM:i:2	UQ:i:20	H0:i:0	H1:i:0
+EAS221_3:6:70:843:706	83	seq1	1306	99	35M	=	1449	178	ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC	<<<<<<<<<<<<<<<<<<<<<<<<<5<<5<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:174:597:66	83	seq1	1307	99	35M	=	1148	-194	TCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCT	9<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:6:7:1547:1933	147	seq1	1308	99	35M	=	1497	224	CTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTG	<<<<<<<<<<<<<<<<<<<<<<<:<<8<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:30:117:411	147	seq1	1309	99	36M	=	1482	209	TCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTC	<<<<<<<<<<<<<<<<<<<<<<7<<:<<<<<<<<<:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:53:156:845	83	seq1	1311	99	35M	=	1487	211	TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT	<<<<<<8<<<.<<<<.6<<--<-<<<<<<<6<<<<	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:90:1403:1635	83	seq1	1311	99	35M	=	1480	204	TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT	<<;<;<<<<;<;<;;<<<<<9;<.;;<:;99.979	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:67:302:762	147	seq1	1313	99	36M	=	1138	-211	GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC	:8;88<;<<<;<<8<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:270:448:491	83	seq1	1313	99	35M	=	1501	223	GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC	<<<<<<<<<<<<<<<<<<&<<.<<<<<<<:;;;<;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:82:932:400	83	seq1	1313	97	34M	=	1486	208	GTAATCTCTCTCCTCTTCGCTGCATCCCTGTCTT	<<<<<<8<1<<<<8+<<&<<<8<<<<<<<+(,/8	MF:i:18	Aq:i:25	NM:i:2	UQ:i:15	H0:i:0	H1:i:0
+EAS54_81:2:128:394:455	83	seq1	1313	99	35M	=	1156	-192	GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC	;=;9.=5=;=9====;;==================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:57:735:151	147	seq1	1314	94	35M	=	1121	-228	TAAACTCTCACCTTATTGCTGCATCCCTGTCTTCC	07;+79:;<)<<9<+8<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:26	NM:i:3	UQ:i:28	H0:i:0	H1:i:0
+EAS114_28:6:51:506:878	147	seq1	1314	99	36M	=	1501	223	TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCT	<<<<<<<<<<<<<<<<<4<<<<<<<<<<0<<<<<:;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:15:1497:1530	147	seq1	1314	99	35M	=	1136	-213	TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC	77778:;;;:;;;;:9;:;;;;;;;;;9;:;;;;;	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:9:1595:1826	83	seq1	1316	99	35M	=	1494	213	ATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:73:273:488	147	seq1	1318	99	35M	=	1512	229	CTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTG	<<<<<2<88<88<<<8<<1<<<<<<68<<<;<;<*	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:1:199:760:42	147	seq1	1318	24	35M	=	1489	206	CTCTCTAATTTTTGCTGCTTCCATGTCTTACTCTG	+2&2&2&22222220222&220-222-22-22-22	MF:i:-126	Aq:i:24	NM:i:5	UQ:i:51	H0:i:0	H1:i:0
+EAS1_95:7:61:702:720	147	seq1	1320	99	35M	=	1500	215	CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC	==============;=======&=========3:=	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:41:576:1016	147	seq1	1320	99	35M	=	1503	218	CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC	<<<<<<<<<<<<<<;<<<;<<<<<<<<<<<4<::<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:115:683:296	83	seq1	1320	99	35M	=	1514	229	CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC	<<<<<<<<<<<8<<<<<<<<<<6<<<<3<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:63:1265:820	83	seq1	1320	99	35M	=	1480	195	CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC	<<<<<<<<<<27<<<<<<<<<<<<<<<<<<<<03<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:7:92:288:1354	147	seq1	1321	99	40M	=	1480	199	TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT	<<<<<<:<<<<<<<<<<<8<<:<<<<;;<8<<<8<:8+::	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:316:949:122	147	seq1	1321	99	35M	=	1156	-200	TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT	59899<<<<;;<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:37:1626:862	147	seq1	1321	99	35M	=	1489	203	TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:5:147:479:41	83	seq1	1322	99	35M	=	1139	-218	CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTT	;:;:;<::<:<<<<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:73:936:1509	147	seq1	1322	99	40M	=	1502	220	CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTTATTT	<<<<<<<<<7<<7<<<<<<<;<<<<<<<<<:<:<;%8:::	MF:i:18	Aq:i:75	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_62:6:50:542:881	83	seq1	1324	99	35M	=	1132	-227	CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA	+2<<<;<3;29<6<5;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:71:85:629	147	seq1	1324	99	35M	=	1484	195	CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA	<<<<<<<<<<9<<<<<<<<<<<<<<<<<5<9<<+6	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:191:948:257	147	seq1	1325	99	35M	=	1493	203	CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT	:<<<<<<<<9<:<<<<<<:<<<<;<<<<8<<<<7<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:249:986:224	83	seq1	1325	99	35M	=	1499	209	CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT	=========5======7878===98==7=9==.-=	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:5:6:1067:91	147	seq1	1325	99	35M	=	1483	193	CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<:8<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:216:650:516	147	seq1	1326	99	36M	=	1164	-198	TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	;9;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:18:376:416	147	seq1	1326	99	35M	=	1510	219	TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGTTT	<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;:(<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS114_28:5:209:778:588	147	seq1	1326	99	36M	=	1514	224	TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	<<<<<<<<;<<<<<<<<<;<<<;<8<8<<<<;7;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:36:1402:1709	83	seq1	1326	99	35M	=	1168	-193	TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT	;;;:<<<;<<<<<<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:40:352:151	147	seq1	1327	99	35M	=	1137	-225	TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	;=;;5=:-=9=====;;==================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:139:331:63	83	seq1	1327	99	35M	=	1486	194	TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	====================<<=============	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:11:1274:1230	147	seq1	1327	99	35M	=	1507	215	TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:36:678:316	83	seq1	1328	99	35M	=	1500	207	TTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTTA	<<<<<<<<<<<<<<;<<<<<<<<<;<<<<,2<<<)	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:102:825:507	147	seq1	1330	99	35M	=	1501	206	TGCTGCATCCCTGTCTTCCTCTGTCTTGATTTACT	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;;<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:171:343:758	83	seq1	1331	99	36M	=	1494	199	GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG	<<<<<<<<<<<<<<<<<<<<<;<<<<59<<<9;<<3	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:85:1224:625	83	seq1	1331	99	35M	=	1532	236	GCTGCATCCCTGTCTTCCTCTGTCTTGATTTCCTT	<<<<<<<<<;<<;<<7<<:<<7.<<<:&7<<.<;<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:13	H0:i:1	H1:i:0
+EAS188_7:5:308:354:124	83	seq1	1331	99	35M	=	1507	211	GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTT	<<<<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:7:22:22:934	147	seq1	1332	99	35M	=	1500	203	CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG	<<<<<<<<<<<6<<<;<<<;84;<<48;<;6;<;)	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:71:707:568	147	seq1	1332	99	35M	=	1518	221	CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:123:610:472	83	seq1	1333	99	35M	=	1504	206	TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT	<<<<<<<<<<:<<<<<<<<<<<<<+:<<<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:20:635:509	83	seq1	1333	99	35M	=	1167	-201	TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT	50<59<<9<9<<<<<<<<<<<<<<<<<<<6<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:92:213:217	83	seq1	1333	99	35M	=	1515	217	TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:47:471:858	147	seq1	1335	99	35M	=	1487	187	CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG	<<;<<<<<<<<9<<<4;;<<<<;<<<<<.<<4;<4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:90:406:631	147	seq1	1335	99	35M	=	1525	225	CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG	<<<<<<<<<<<<<<<<<:<<<<:;<<<<;<<8;<8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:81:1723:1820	83	seq1	1335	99	35M	=	1524	224	CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:182:23:585	147	seq1	1336	99	35M	=	1163	-208	ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT	9:<<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:150:508:757	147	seq1	1336	99	35M	=	1483	182	ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT	<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<,<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:261:504:780	147	seq1	1337	99	35M	=	1501	199	TCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGTT	<<<<<<<<<<<<<<<<<<<</2<<<9<<<5<<,<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:324:515:230	147	seq1	1339	99	35M	=	1512	207	CCTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGG	<<;<<<<<<<<<<<<<<<:<<<<8<<<4<<4<<34	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:72:916:763	83	seq1	1340	99	35M	=	1142	-233	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT	<;;:<<<<<<<;<<;;;<<<<<<<<<;;<;<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:194:168:684	83	seq1	1340	99	36M	=	1512	208	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<7<<.<<6-<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:113:43:634	147	seq1	1340	99	35M	=	1500	195	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTTTT	<<<<<<<<<<<<.<<<<<<<<<<<<</<<2;;%%;	MF:i:18	Aq:i:45	NM:i:2	UQ:i:8	H0:i:1	H1:i:0
+EAS54_71:5:16:434:204	147	seq1	1340	99	35M	=	1522	216	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT	=================;)===8===:==7;<+%;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:246:205:734	73	seq1	1340	65	35M	=	1340	0	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT	<<<4<<6666<<6<:<<<3<<<:'<<:<<<<;6<+	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:246:205:734	133	seq1	1340	0	*	=	1340	0	CTCCAGGGAAGTTATCTCTCATCTAGANNNNNTTG	<<<<<<:/<<<,6'</7;<-+9<<;<7!!!!!8<,	MF:i:-64
+EAS54_65:3:102:884:63	147	seq1	1341	99	35M	=	1481	175	TGTCTTCCTCTGTCTTGATTTCCTTGTTGTTGGTT	<<<<<<<<<<<<<<<<<3<<<%<<<9<<9<<7+;<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS51_64:3:67:782:132	83	seq1	1343	99	35M	=	1498	190	TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<:<<;4<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:70:348:972	147	seq1	1343	99	35M	=	1528	220	TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT	<.<<3+.7<<7<<:78:<<7<:<7:<3<<7.:::<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:9:206:901	83	seq1	1344	99	35M	=	1517	208	CTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTC	<<<<<<<<<<<<<<<<<<<<<<5<<5<<%%:<<<7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:21:443:404	83	seq1	1345	99	35M	=	1529	219	TTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTCT	<<<<<<<<<<<<<<<<<<<<<7<<;<<;+<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:148:286:316	147	seq1	1347	99	35M	=	1531	219	CCTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGT	<<<<<<<<+<<7<<<<<<<6<<<6<142<<<6<2<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:77:48:860	83	seq1	1348	99	35M	=	1521	208	CTCTGTCTTGATTTACTTGTTGTTTGTTTTCTGTT	=========;===========9==*;5=;=;=,7=	MF:i:18	Aq:i:45	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+EAS51_64:6:124:128:489	147	seq1	1348	99	35M	=	1142	-241	CTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTT	::55<<<8<<<6<<;<<<<<<<<7<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:213:54:878	137	seq1	1348	99	35M	*	0	0	CTCTGTCTTGATTTACTTGTTGTTGGTTTTTTGTT	<<<<<<<<<;<<<<<<<<:<<:<<++<<<<%<%<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS218_1:4:73:42:1038	147	seq1	1349	99	35M	=	1513	199	TCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTTT	<<<<<<<<<<<<<<<<<<<<<<<:<<<<<.<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:320:505:814	83	seq1	1350	99	35M	=	1515	200	CTGTCTTGATTTACTTGTTGTTGGTTTTCTTTTTC	<<<<<<<<<<<<<<<<;<<8<<76<<<<;<&<<<7	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_593:2:68:692:347	83	seq1	1351	99	36M	=	1176	-211	TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCTT	9<;;;;<<<:<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:252:428:683	137	seq1	1351	99	35M	*	0	0	TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCT	<<<<<<;<<<<<<<<7<<7<<&+<<<<:<&<<<4<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:73:182:444	83	seq1	1354	99	34M	=	1533	214	CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTT	<<<<;;<<<<<<<<<<<<;<;<<<<<:<<<<<7<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:63:267:545	147	seq1	1354	99	35M	=	1524	205	CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTTG	<<<<<<<<<<<<:<<<<<::<<<<<<.<<<;;;;5	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:177:562:806	83	seq1	1356	99	35M	=	1515	194	TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTTTT	<;<29<99<<;<<<9<20<9<<5;;<<<<<<<+.<	MF:i:18	Aq:i:35	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS51_62:7:157:784:936	83	seq1	1356	99	35M	=	1169	-222	TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTGTT	<:<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:1:209:345:87	147	seq1	1360	99	35M	=	1513	188	TTACTTGTTGTTGGTTTTCTGTTTCTTTTTTTGAT	<<<<<<<<<<<<<<<<<<<<;<<<-<<<6<<<+8<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:21	H0:i:1	H1:i:0
+EAS114_45:1:33:1407:94	83	seq1	1360	99	35M	=	1172	-223	TTACTTGTTGTTGGTTTTCTGTTTCTTTGTTTGAT	77477;4;;;;;44;;;;;;7;;;;;;;9;;;;;<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:2:434:715	147	seq1	1363	99	35M	=	1527	199	CTTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTT	<<<<<<<<<<<<<<<<<;<<<<<<<0<<<68<<<+	MF:i:18	Aq:i:71	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS54_65:4:137:319:642	137	seq1	1363	99	35M	*	0	0	CTTGTTGTTGGTTTTCTGTTTCTTTTTTTGATTTT	<<<<<<<<<27<<<<<<<<<<<<<<&;<<&3;;<%	MF:i:18	Aq:i:41	NM:i:2	UQ:i:9	H0:i:0	H1:i:1
+B7_610:3:148:340:479	147	seq1	1364	99	35M	=	1190	-209	TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG	<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:329:458:365	147	seq1	1364	99	35M	=	1186	-213	TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG	====:==9========>==7>==9>=7=>=>>=>>	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:91:267:655	147	seq1	1365	99	35M	=	1204	-196	TGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGT	;,:;5:<6:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:91:856:504	83	seq1	1366	99	35M	=	1520	189	GTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTT	<<<<<<<<<<<<<<7<<<<<<<7<<<&;<<<&&<&	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_108:2:170:326:433	83	seq1	1367	99	35M	=	1535	203	TTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGG	=====<=9===:=<:==2=======2:===9==/5	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:132:717:233	83	seq1	1368	99	35M	=	1529	196	TGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGA	<<<<<<<<<<<<;<<<<<<<<<<<7<<<<&-<4<1	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:14:420:712	83	seq1	1368	99	40M	=	1525	197	TGTTGGTTTTCTGTTTCTTTGTTTGATTTTTTTGAAGACA	<<<<<<<<<<<<;<<<<<<<;<<<-;<<<&,<&*8111:6	MF:i:18	Aq:i:66	NM:i:3	UQ:i:21	H0:i:1	H1:i:0
+EAS114_39:4:43:1047:1626	147	seq1	1369	99	35M	=	1523	189	GTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAA	<<<<<<<<<<<<<<<<<<<:<<<:<<<<:+;-4:(	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:20:413:1334	147	seq1	1370	99	35M	=	1215	-190	TTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAG	88878777;:;:1:;9;;;6;;;6;9;;;;;296;	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:154:669:853	83	seq1	1371	99	35M	=	1193	-213	TGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGA	<::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:117:857:942	83	seq1	1372	99	35M	=	1527	190	GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC	<<<<<<<<<<<<<<<<<<<<<<<<<:6<;;7;9<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:145:144:796	147	seq1	1372	99	35M	=	1181	-226	GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC	;<<<;<<<<<<<<<;<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:88:162:587	147	seq1	1372	99	35M	=	1189	-218	GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC	386;;388-<8;<;68<<;;<;<6<<<8<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:73:108:1621	83	seq1	1373	99	35M	=	1532	194	GTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACA	<<<<<<<<71<<<<<<<<<+<<<<70:0<9<<61<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:127:153:861	147	seq1	1374	99	35M	=	1202	-207	TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT	:;:6;9<<1;<<95<<<9<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:152:765:744	147	seq1	1374	99	35M	=	1534	195	TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT	<<<<<<<<<<<<<<<<<<:<<<<<<<<&<7293<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:313:827:992	147	seq1	1379	99	35M	=	1197	-217	TGTTTCTTTGTTTGATTTGGTGGAAGACATAATCC	'187:1'<75<.*<<:5<..<<*<<917<<7<<17	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:7:268:263	89	seq1	1381	22	35M	=	1381	-35	TTGCGTTATTTGAGTTGGTGGAAGACATAATCCCA	',)*&2<$7+<<<'<-<7<<<<<<<7<<</4/;<<	MF:i:64	Aq:i:0	NM:i:4	UQ:i:22	H0:i:0	H1:i:0
+EAS51_64:3:7:268:263	149	seq1	1381	0	*	=	1381	35	TCGTACAGAAGTTTAATGGAGCCTTGGGACCTTAC	!!66'&+/&'8+2''1+'611'&6&+/&+.&+1'&	MF:i:-64
+EAS139_19:1:47:352:1492	147	seq1	1385	99	40M	=	1205	-220	TTTGTTTTGTATGGTGGAAGACATAATCCCACGCTTCCTA	+7+/7+/%%1'6+3++1;:</<<5<)27<<9<)9<<9<7<	MF:i:18	Aq:i:53	NM:i:3	UQ:i:14	H0:i:1	H1:i:0
+EAS139_11:5:61:38:1182	83	seq1	1388	99	35M	=	1205	-218	GTTTGATTTGGTGGAAGACATAATCCCACGCTTCC	9:;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:7:64:37:257	83	seq1	1389	99	35M	=	1215	-209	TTTGATTTGGTGGAAGACATAATCCCACGCTTCCT	;47<<47+9<4<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:266:556:252	147	seq1	1392	99	35M	=	1224	-203	GATTTGGTGGAAGACATAATCCCACGCTTCCTATG	.8558<72<(<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:321:271:138	147	seq1	1394	99	35M	=	1193	-236	TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA	261:5969==9=:=<==<=================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:19:752:816	147	seq1	1394	99	35M	=	1212	-217	TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA	+<<+<--/<<<<4<2<<<<45<<<:<<<<<<+<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:306:388:342	83	seq1	1398	99	35M	=	1211	-222	GGGGAAGACATAATCCCACGCTTCCTATGGAAAGG	9/<9;<<<;<;<<7<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:14	H0:i:1	H1:i:0
+EAS114_39:1:71:636:533	147	seq1	1398	99	35M	=	1232	-201	GTGGAAGACATAATCCCACGCTTCCTATGGAAAGG	,51(<<8<:<<<<<<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:131:779:345	83	seq1	1399	99	35M	=	1237	-197	TGGAAGACATAATCCCACGCTTCCTATGGAAAGGT	<<7<<<<<<<<:<<<<<<<<<<<<<;<<<<<<;<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:68:64:783	83	seq1	1402	99	35M	=	1214	-223	AAGACATAATCCCACGCTTCCTATGGAAAGGTTGT	<<9<8<6<<<<<;<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:16:823:343	147	seq1	1403	99	35M	=	1223	-215	AGACATAACCCCACGCTTCCTATGGAAAGGTTGTT	<<<:<<<;+;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS219_FC30151:5:72:1426:1883	147	seq1	1405	99	35M	=	1226	-214	ACATAATCCCACGCTTCCTATGGAAAGGTTGTTGG	;9<;<;0<;<;<<<<;<<<;:<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:166:979:531	83	seq1	1410	99	35M	=	1245	-200	ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT	81<<<3<*<<:<<<<<<<8<<<<<<<<<<<<:<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:63:930:152	83	seq1	1410	99	35M	=	1243	-202	ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT	;:4:8;:::;=:8;=;========;=:========	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:137:895:681	147	seq1	1418	99	35M	=	1232	-221	CTTCCTATGGAAAGGTTGTTGGGAGATTTTTAATG	4;5+6;<<<<<<<<<9;<4<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:87:89:696	147	seq1	1419	99	36M	=	1245	-210	TTCCTATGGAAAGGTTGTTGGGAGATTTTTAATGAT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:104:744:280	147	seq1	1421	64	36M	=	1262	-195	CATATGGAAAGGTTGTTGGGATTTTTTTAATGATTC	'&+74*0<'/.47:8<<<<;<7''6/1<<<.<<68<	MF:i:18	Aq:i:21	NM:i:3	UQ:i:33	H0:i:0	H1:i:0
+EAS56_57:2:259:42:969	83	seq1	1426	99	35M	=	1265	-196	GGAAAGGTTGTTGGGAGATTTTTAATGATTCCTCA	<<<6<<<<<<-<<<<<<;<<;<6<<<<<<<;<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:18:1498:1475	83	seq1	1427	99	35M	=	1260	-202	GAAAGGTTGTTGGGAGATTTTTAATGATTCCTCAA	:<4<*7<<<<<<<:<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:328:614:638	147	seq1	1428	99	35M	=	1243	-220	AAAGGTTGTTGGGAGATTTTTAATGATTCCTCAAT	<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:159:71:155	147	seq1	1428	99	35M	=	1237	-226	AAAGGTTGTTGGGAGATTTTTAATGATTCCTCGAT	5;;9<<:<;:<<<<7<<7;<3<<<:<<<;<<<<<;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_39:1:73:302:1574	147	seq1	1429	99	35M	=	1233	-231	AAGGTTGTTGGGAGATTTTTAATGATTCCTCAATG	7<88;;<;;<;;<<<<<<<<<<<<<<<<<<<<<1<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:200:712:439	83	seq1	1435	99	35M	=	1286	-184	GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA	<;<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<<7	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:259:869:641	147	seq1	1435	99	35M	=	1272	-198	GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA	99=:=9=99<=========<=<<============	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:74:570:695	83	seq1	1436	99	35M	=	1240	-231	TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT	.;:8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:58:369:244	83	seq1	1436	99	35M	=	1266	-205	TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT	<<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:216:292:528	147	seq1	1438	99	35M	=	1269	-204	GGGAGATTTTTAATGATTCCTCAATGTTAAAATGT	;:;;8<<<<<<<<<<<<<:<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:185:868:496	83	seq1	1442	99	35M	=	1278	-199	GATTTTTAATGATTCCTCAATGTTAAAATGTCTAT	:;;<;;<<<<<<<<;4<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:277:194:143	147	seq1	1444	99	35M	=	1262	-217	TTTTTAATGATTCCTCAATGTTAAAATGTCTATTT	;<<;<<<;8;<0<7<<<<<<<<<<<<7<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:267:71:603	147	seq1	1446	99	36M	=	1281	-201	TTTAATGATTCCTCAATGTTAAAATGTCTATTTTTG	9;;<;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:218:173:667	147	seq1	1448	99	35M	=	1298	-185	TAATGATTCCTCAATGTTAAAATGTCTATTTTTGT	<<<<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:70:843:706	147	seq1	1449	99	35M	=	1306	-178	AATGATTCCTCAATGTTAAAATGTCTATTTTTGTC	<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:47:720:789	147	seq1	1455	90	35M	=	1278	-212	TCCTCAATGTTAAAATGTCTATTTTTGTCTTGACA	/)040<.878<<<<;8<;<9<9;<<<<<<<<<<93	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:102:511:946	147	seq1	1461	26	35M	=	1291	-205	ATGTAAAAGTGACTGTTATTGTCTTGACACCCAAC	<%-4:6<:/&46;/*;<*84<0<'<&*<2<<<<<<	MF:i:-126	Aq:i:26	NM:i:5	UQ:i:78	H0:i:0	H1:i:0
+EAS112_34:8:103:812:255	147	seq1	1461	99	35M	=	1272	-224	ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC	7:777:7<<::7<7<7<<:7<7<:<<<<<<<<<7<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:179:735:569	83	seq1	1461	99	35M	=	1286	-210	ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC	<5<3:<<<<5;8<<<55;<:</:<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:52:1779:1664	147	seq1	1462	99	35M	=	1297	-200	TGTTAAAATGTCTATTTTTGTCTTGACACCCAACT	6;;:;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:153:543:671	147	seq1	1465	99	35M	=	1301	-199	TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT	;;;;;=;==================;=========	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:38:1071:155	147	seq1	1465	99	35M	=	1274	-226	TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT	<<62<<<<<<3<<<<</<<<<<<<%<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:67:1864:477	83	seq1	1465	99	35M	=	1270	-230	TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:14:1256:204	147	seq1	1467	99	35M	=	1288	-214	AAATGTCTATTTTTGTCTTGACACCCAACTAATAT	66777:;;37;;:;;0;:;;;;):;;:7;;;;;;;	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:316:176:543	147	seq1	1469	99	35M	=	1305	-199	ATGTCTATTTTTGTCTTGACACCCAACTAATATTT	<<)/3<<<&<*<<0<<8<<82</5<<<<<88<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:36:688:722	147	seq1	1469	99	35M	=	1295	-209	ATGTCTATTTTTGTCTTGACACCCAACTAATATTT	<;;<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:11:706:1030	147	seq1	1469	92	35M	=	1306	-198	ATGTCTATTTTTGTCTTGACACCCAACTAATATTT	+<5069+9<<<<+<;<<<<;<<77<7<<;<<;<<<	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:289:132:526	147	seq1	1472	99	36M	=	1289	-219	TCTATTTTTGTCTTGACACCCAACTAATATTTGTCT	;<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:50:950:562	147	seq1	1473	99	35M	=	1301	-207	CTATTTTTGTCTTGACACCCTACTAATATTTGTCT	<<3<<<8<;<<<<<<+<<8<&<<<<7<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS188_4:5:8:377:655	147	seq1	1473	99	35M	=	1299	-209	CTATTTTTGTCTTGACACCCAACTAATATTTGTCT	;<8;;:<;<<:<;<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:322:631:245	83	seq1	1474	99	36M	=	1297	-213	TATTTTTGTCTTGACACCCAACTAATATTTGTCTGA	<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:33:1193:664	83	seq1	1474	99	40M	=	1301	-213	TATTTTTGTCTTGACACCCAACTAATATTTGTCTGAGCAA	;;;;;;<;;-9<<<:</+9<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:253:59:242	147	seq1	1478	99	35M	=	1302	-211	TTTGTCTTGACACCCAACTAATATTTGTCTGAGCA	<<<:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:42:1223:1087	147	seq1	1479	99	35M	=	1293	-221	TTGTCTTGACACCCAACTAATATTTGTCTGAGCAA	;:<<<:<7<<<;;<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:90:1403:1635	147	seq1	1480	99	35M	=	1311	-204	TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA	86878;;;8;788;;;;;;;;;;;;;8;5;;;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:7:92:288:1354	83	seq1	1480	99	40M	=	1321	-199	TGTCTTGACACCCAACTAATATTTGTCTGAGCAAAACAGT	::::;;;<<<<9;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:63:1265:820	147	seq1	1480	99	35M	=	1320	-195	TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA	<<<<<<3<<1<<<<<<<7<<<<<<<<<<<<<<<+<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:102:884:63	83	seq1	1481	99	35M	=	1341	-175	GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA	<;7;;<<8<;8;<<<8<<<<<<8<<<8;<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:50:1339:1154	83	seq1	1481	99	35M	=	1305	-211	GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA	7;7;8;<5<:86<<;<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:30:117:411	83	seq1	1482	99	36M	=	1309	-209	TCTTGACACCCAACTAATATTTGTCTGAGCAAAACA	;88<<<<<:<7<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:150:508:757	83	seq1	1483	99	35M	=	1336	-182	CTTGACACCCAACTAATATTTGTCTGAGCAAAACA	6;;;<8<6;8<<8<<<<<;<<<<;<<<<;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:5:6:1067:91	83	seq1	1483	99	35M	=	1325	-193	CTTGACACCCAACTAATATTTGTCTGAGCAAAACA	3<;<<:;9;<<7;;<;<<<;<<<;<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:71:85:629	83	seq1	1484	99	35M	=	1324	-195	TTGACACCCAACTAATATTTGTCTGAGCAAAACAG	,,1<1<7&%<9+:<<9<<9<<<<<<<<5<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:319:165:698	147	seq1	1485	99	35M	=	1287	-233	TGACACCCAACTAATATTTGTCTGAGCAAAACAGT	;5;2;<:;<<:<<<<<<<<<;:;<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:8:60:182:718	83	seq1	1485	99	35M	=	1295	-225	TGACACCCAACTAATATTTGTCTGAGCAAAACAGT	<<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:82:932:400	147	seq1	1486	97	35M	=	1313	-208	GACACCCAACTAATATTTGTCTGAGCAAAACAGTC	<<;<<72<<7<<<<<<<<<<;<<<+7<<<<<<<<<	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:23:502:103	83	seq1	1486	99	35M	=	1294	-227	GACACCCAACTAATATTTGTCTGAGCAAAACAGTC	4:386:6<:::<:<:4:+<::4<<<6<<<<<<<66	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:139:331:63	147	seq1	1486	99	35M	=	1327	-194	GACACCCAACTAATATTTGTCTGAGCAAAACAGTC	7===================:=:============	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:53:156:845	147	seq1	1487	99	35M	=	1311	-211	ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT	171(*00,0;;&;7=77=;5;;(;1:=5=======	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:47:471:858	83	seq1	1487	99	35M	=	1335	-187	ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT	/;9<<63<<<<3<;<<<<<<<<<<<<<<<<<<<9<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:9:203:653	83	seq1	1488	99	35M	=	1296	-227	CACCCAACTAATATTTGTCTGAGCAAAACAGTCTA	37))&<8<<<<<7<4<;<777<<:<<<<<<<<;<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:1:199:760:42	83	seq1	1489	24	35M	=	1318	-206	ACCCAATTAATATTTTTCTTAGCAAAACAGTCTAG	58*5.<+<<<<,4<<**<90**9<<<<<<4<<<<<	MF:i:18	Aq:i:24	NM:i:3	UQ:i:34	H0:i:0	H1:i:0
+EAS218_1:4:37:1626:862	83	seq1	1489	99	35M	=	1321	-203	ACCCAACTAATATTTGTCTGAGCAAAACAGTCTAG	:663<<3<<<<<<<<<<:<<<<7<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:191:948:257	83	seq1	1493	99	35M	=	1325	-203	AACTAATATTTGTCTGAGCAAAACAGTCTAGATGA	:;;;;<<<<<<5<5<<<<<<<<7<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:171:343:758	147	seq1	1494	99	36M	=	1331	-199	ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAGA	:+;;<<<<<;<;:<<<;;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:9:1595:1826	147	seq1	1494	99	35M	=	1316	-213	ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAG	;76;;6:9<9<963;<<7<<<<<<<;<;<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:6:7:1547:1933	83	seq1	1497	99	35M	=	1308	-224	AATATTTGACTGAGCAAAACAGTCTAGATGAGAGA	<<<<<<<<-<<<<<:<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS51_64:3:67:782:132	147	seq1	1498	99	35M	=	1343	-190	ATATTTGTCTGAGCAAAACAGTCTAGATGAGAGAG	;;<;;;<<;;<<<;<<<;<<<;<<<<<<<<<<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:249:986:224	147	seq1	1499	99	35M	=	1325	-209	TATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGA	<<<3<;<;;<<;8<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:61:702:720	83	seq1	1500	99	35M	=	1320	-215	ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA	<<<4<4+0;<<:<<<<<<<<-<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:113:43:634	83	seq1	1500	99	35M	=	1340	-195	ATTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAA	;9;1;<5:<<<%<<<<;<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS56_53:7:22:22:934	83	seq1	1500	99	35M	=	1332	-203	ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA	<+72::72<<60<<<<<<<96<<<<0<<<<1<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:36:678:316	147	seq1	1500	99	35M	=	1328	-207	ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA	<<72.2,;;<)6<<<<:<<;;<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:102:825:507	83	seq1	1501	99	35M	=	1330	-206	TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC	<05<<<<<<<7<<<<<<<<<<<<<7<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:261:504:780	83	seq1	1501	99	35M	=	1337	-199	TTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAAC	80;8(;0==8+====;==49===============	MF:i:18	Aq:i:43	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS51_78:7:270:448:491	147	seq1	1501	99	35M	=	1313	-223	TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC	7;;;;+2;<<+<<<<<<<<7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:51:506:878	83	seq1	1501	99	36M	=	1314	-223	TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACT	<970;49;<;+<<<:<<<;;<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:73:936:1509	83	seq1	1502	99	40M	=	1322	-220	TTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT	99;66:<<;-<<<<:<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:41:576:1016	83	seq1	1503	99	35M	=	1320	-218	TGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTT	:<;<<<<<6<<<<;<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:123:610:472	147	seq1	1504	99	35M	=	1333	-206	GTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTC	:<::+<<9<<9<<<<=<<<<<=<<<<<<<<?<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:308:354:124	147	seq1	1507	99	35M	=	1331	-211	TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT	%+<)2<<<<<<<<8<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:11:1274:1230	83	seq1	1507	99	35M	=	1327	-215	TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT	.<<<<<<<<<<<<<<<<5<<<<<<<<<<5<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:169:292:652	147	seq1	1510	99	35M	=	1306	-239	GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA	79919-<-<<<<<<<<<<<<<<<<<<<6<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:18:376:416	83	seq1	1510	99	35M	=	1326	-219	GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA	70<<<<<<<7<7<<<2<<<<<<<<<<8<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:194:168:684	147	seq1	1512	99	36M	=	1340	-208	AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT	;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:73:273:488	83	seq1	1512	99	35M	=	1318	-229	AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGG	</<<:<<9;;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:324:515:230	83	seq1	1512	99	34M	=	1339	-207	AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAG	7<<1<<<7<+<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:1:209:345:87	83	seq1	1513	99	35M	=	1360	-188	AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT	<<;<<<<5<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:73:42:1038	83	seq1	1513	99	35M	=	1349	-199	AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:209:778:588	83	seq1	1514	99	36M	=	1326	-224	AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT	;8;98;;;<3<<<<<<<<<;<<;<<<<<;<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:115:683:296	147	seq1	1514	99	35M	=	1320	-229	AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTC	<<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:92:213:217	147	seq1	1515	99	35M	=	1333	-217	ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT	<<<<<:<<<<<<<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:177:562:806	147	seq1	1515	99	35M	=	1356	-194	ACAGTGTAGATGAGAGAGACCTTCCCTGGAGGTCT	)2<9;'/:<5<<<:<<:<:&5:&<8,<<+:<&<<<	MF:i:18	Aq:i:35	NM:i:2	UQ:i:11	H0:i:0	H1:i:1
+EAS1_103:3:320:505:814	147	seq1	1515	99	35M	=	1350	-200	ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT	<2<;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:9:206:901	147	seq1	1517	99	35M	=	1344	-208	AGTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGA	<<<<<<<<<<<<<.<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:71:707:568	83	seq1	1518	99	35M	=	1332	-221	GTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGAT	;9;<;<<<<<;<<<<<;<<<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:91:856:504	147	seq1	1520	99	35M	=	1366	-189	CTAGATGAGAGAGAACTTCCCTGGAGGTCTGATGG	:::<<:<<<<<<<<<<<<<<<<<<<<<:<:<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:77:48:860	147	seq1	1521	99	35M	=	1348	-208	TAGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC	;8;8;<9<9<<<<<<<<<4<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:16:434:204	83	seq1	1522	99	34M	=	1340	-216	AGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC	<:7:<<<<<<<<<<<9<<<+<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:43:1047:1626	83	seq1	1523	99	35M	=	1369	-189	GATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGT	<<4<<<<<<<<<<<:<<<;<<<<<:<7<<;<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:81:1723:1820	147	seq1	1524	99	35M	=	1335	-224	ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT	;6;;;<<<<<<<<<<<2<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:63:267:545	83	seq1	1524	99	35M	=	1354	-205	ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:90:406:631	83	seq1	1525	99	35M	=	1335	-225	TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTT	<<<:<:<<<-<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:14:420:712	147	seq1	1525	99	40M	=	1368	-197	TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCC	1::::<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:2:434:715	83	seq1	1527	99	35M	=	1363	-199	AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT	<<<<<<<<<:;<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:117:857:942	147	seq1	1527	99	35M	=	1372	-190	AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT	<<;<<<<<<<9<<<8<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:70:348:972	83	seq1	1528	99	35M	=	1343	-220	GAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTC	<99<-7<<7<<<87<<<)<<<<<<8<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:132:717:233	147	seq1	1529	99	35M	=	1368	-196	AGAGAACTTCCCTGGAGGTCTGATGGAGTTTCTCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS188_7:4:21:443:404	147	seq1	1529	99	35M	=	1345	-219	AGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCC	=9=9=9==:==========================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:148:286:316	83	seq1	1531	99	35M	=	1347	-219	AGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCT	;::::;9/:<9<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:85:1224:625	147	seq1	1532	99	35M	=	1331	-236	GAACTCCCCTGGAGGTCTGATGGCGTTTCTCCCTC	17;;7&-;<;<;:<6<<:;<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS221_1:8:73:108:1621	147	seq1	1532	99	35M	=	1373	-194	GAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTC	<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:73:182:444	147	seq1	1533	99	35M	=	1354	-214	AACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCG	:1<4;;::<<;<<<<;<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:152:765:744	83	seq1	1534	99	35M	=	1374	-195	ACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGT	6<;6<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:170:326:433	147	seq1	1535	99	35M	=	1367	-203	CTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGTC	:44<<<<<<<<<<:6<<<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:8:4:841:340	73	seq2	1	99	36M	*	0	0	TTCAAATGAACTTCTGTAATTGAAAAATTCATTTAA	<<<<<<<<;<<<<<<<<;<<<<<;<;:<<<<<<<;;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:4:142:943:582	73	seq2	1	99	35M	*	0	0	TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA	<<<<<<;<<<<<<:<<;<<<<;<<<;<<<:;<<<5	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:43:859:229	153	seq2	1	66	35M	*	0	0	TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA	+37<=<.;<<7.;77<5<<0<<<;<<<27<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:286:923:549	73	seq2	2	99	35M	*	0	0	TCAAATGAACTTCTGTAATTGAAAAATTCATTTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:117:578:853	73	seq2	5	99	35M	*	0	0	AATGAACTTCTGTAATTGAAAAATTCATTTAAGAA	<;<9<<<<<;<<;<<<<<<<<<<<,<98;<;;&92	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:289:472:86	137	seq2	6	99	35M	*	0	0	ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:302:997:951	73	seq2	6	69	35M	*	0	0	ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA	<<<<<<<<<<;<<:<<52<<:;;<6<<;<:<2:9/	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:13:1729:1844	73	seq2	6	99	35M	*	0	0	ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA	<<<;;<;7<<<<4<<<<762;6<<<<<<<;6;618	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:43:239:977	137	seq2	7	99	36M	*	0	0	TGAACTTCTGTAATTGAAAAATTCATTTAAGAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;7;<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:233:191:520	73	seq2	7	99	35M	*	0	0	TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<8<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:75:555:1591	137	seq2	7	99	35M	*	0	0	TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:43:656:1866	137	seq2	7	99	35M	*	0	0	TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;:;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:100:563:301	137	seq2	8	99	35M	*	0	0	GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;8;;;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:126:526:276	137	seq2	8	84	35M	*	0	0	GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:161:366:544	137	seq2	11	99	35M	*	0	0	CTTCTGTAATTGAAAAATTCATTTAAGAAATTACA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:326:652:890	73	seq2	12	99	35M	*	0	0	TTCTGTAATTGAAAAATTCATTTAAGAAATTACAA	<<<<<<<<<<2<<<<<<<<<<<<<<+<8:<<9998	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:238:441:727	73	seq2	16	99	35M	*	0	0	GTAATTGAAAAATTCATTTAAGAAATTACAAAATA	<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;;<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:64:507:478	137	seq2	17	99	35M	*	0	0	TAATTGAAAAATTCATTTAAGAAATTACAAAATAT	<<<<<;<<<<<<<<<<<<<<<;;;<<<;<<8;<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:8:118:440:850	137	seq2	18	99	35M	*	0	0	AATTGAAAAATTCATTTAAGAAATTACAAAATATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<949<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:7:270:995:918	137	seq2	24	84	35M	*	0	0	AAAATTCATTTAAGAAATTACAAAATATAGTTGAA	<<<<<<<<<<<<<:<<<<<<8<8<8<<<<:<;4;4	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:305:819:245	73	seq2	25	98	35M	*	0	0	AAATTCATTTAAGAAATTACAAAATATAGTTGAAA	8<<<<8<;<<<<<;<8<<8<8<<<<8<<<899<<+	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_26:7:13:172:720	73	seq2	26	99	35M	*	0	0	AATTCATTTAAGAAATTACAAAATATAGTTGAAAG	============:3<==:====<=9=3===;==83	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_63:7:34:334:825	73	seq2	30	99	35M	*	0	0	CATTTAAGAAATTACAAAATATAGTTGAAAGCTCT	<<<<<<<<<<<<<<<<<<<<<<<<3;<<<<6<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:32:1379:738	137	seq2	33	99	35M	*	0	0	TTAAGAAATTACAAAATATAGTTGAAAGCTCTAAC	;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_19:5:70:318:1631	137	seq2	34	99	40M	*	0	0	TAAGAAATTACAAAATATAGTTGAAAGCTCTAACAATAGA	<<<<<<;<<<<<<<<<<<<;9:<<<<<<<<<<<<<:::78	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:285:241:560	147	seq2	37	99	35M	=	200	198	GAAATTACAAAATATAGTTGAAAGCTCTAACAATA	<<<<<<<<<<;<<<<;<<<<<<<<<<<<;<;;;<.	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:168:389:889	83	seq2	37	99	36M	=	205	204	GAAATTACAAAATATAGTTGAAAGCTCTAACAATAG	<<<<<<<<<<<<<<<<<<<<;<<<<<<<;9;;<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:127:725:381	147	seq2	39	99	35M	=	209	204	AATTACAAAATATAGTTGAAAGCTCTAACAATAGA	<<<<<<<<<<<<<<<<<<<<<;<<<<;;;;;<<8:	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_93:5:66:372:343	147	seq2	40	99	35M	=	228	223	ATTACAAAATATAGTTGAAAGATCTAACAATAGAC	<<<<<<<<<<8<<<<<6<<<8&8<<<<<58<:<::	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS56_65:6:67:800:450	83	seq2	41	99	35M	=	221	215	TTACAAAATATAGTTGAAAGCTCTAACAATAGACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:90:1906:1528	147	seq2	41	99	35M	=	222	216	TTACAAAATATAGTTGAAAGCTCTAACAATAGACT	<<<<<<<<<<<<<<<:<<<:<<<<;<<<<<;:7:;	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:117:284:589	147	seq2	43	99	35M	=	210	202	ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA	==================================0	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:26:211:481	83	seq2	43	99	35M	=	222	214	ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA	<<<<<<<<<<<<<<<<<<<<<<<7<<<<<:<7<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:85:923:726	83	seq2	43	99	35M	=	199	191	ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA	<<<<<<<7<<<<<<<<<<<55<<<9<*<<<991<4	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:107:395:312	147	seq2	44	99	35M	=	224	215	CAAAATATAGTTGAAAGCTCTAACAATAGACTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<;<;;<:<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_597:7:5:753:806	147	seq2	45	99	35M	=	197	187	AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<7:-<;;3;;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_103:3:277:921:474	147	seq2	45	99	35M	=	241	231	AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC	<<<<<<<<<<<<<<<:<<<<<<<<<<<5<<;;;;;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_63:4:38:28:122	147	seq2	46	99	35M	=	227	216	AAATATAGTTGAAAGCTCTAACAATAGACTAAACC	<<<<<<;<<<<<<<;<<<<6<<<<<<:<<<<;;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS221_3:8:50:1203:1094	147	seq2	46	99	35M	=	223	212	AAATATAGTTGAAAGCTCTAACAATAGACTAAACC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_591:2:223:583:968	83	seq2	47	88	36M	=	215	204	AATATAGTTGAAAGCTCTAACAATAGACTAAACCAA	<<<<<<<29<<<<4<<<<<<<<<<<7<<7<..<<47	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_39:1:28:350:895	147	seq2	48	95	35M	=	215	202	ATATAGTTGAAAGCTCTAACAATAGACTAAACCAA	<<<<<<<<;<;<<<<<<<<<;;<<;<<<<<;;<;8	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_45:7:69:1130:832	83	seq2	50	94	35M	=	231	216	ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC	;;2<;<;;<;9;<;;;;;;;7;8;;7;;;;77437	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS188_7:3:296:224:724	147	seq2	50	99	35M	=	234	219	ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC	<<<<;<<<<<<7;<<<<<6<<<06<<<<<<2(<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_595:4:319:250:718	147	seq2	52	99	35M	=	240	223	AGTTGAAAGCTCTAACAATAGACTAAACCAAGCAG	<<<<<<<<<<<;<<5<5;<851;85;)9;;8594;	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS54_73:3:203:419:243	147	seq2	54	99	35M	=	237	218	TTGAAAGCTCTAACAATAGACTAAACCAAGCAGAA	<<<<<<<<<<<<<<<9<;<8<<<;<<<;<<<4<77	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:21:1601:1666	147	seq2	56	99	40M	=	228	212	GAAAGCTCTAACAATAGACTAAACCAAGCAGAAGAAAGAG	7<<<<<<<<:<<7<<<:<<<<<<4<<44<<914<;:5:::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:158:943:467	147	seq2	57	99	35M	=	225	203	AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA	<<<<<;<<<<<<<<<<<<<<;;<<<<<<<<<;8<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:54:91:1232	83	seq2	57	99	35M	=	246	224	AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:29:833:612	147	seq2	58	99	35M	=	224	201	AAGCTCTAACAATAGACTAAACCAAGCAGAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<;;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:1:189:503:110	147	seq2	63	79	35M	=	229	201	CTAACAATAGACTAAACCAAGCAGAAGAAAGAGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:25	H0:i:2	H1:i:0
+EAS114_28:2:114:938:216	83	seq2	63	99	36M	=	218	191	CTAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_95:5:257:654:116	83	seq2	64	99	35M	=	231	202	TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT	<<<<<<<<<<<<<<<<<<<<<<;:<<<<<<<<<88	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_97:3:277:144:848	147	seq2	64	99	35M	=	228	199	TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT	<<<<<<<<<;<<<<<<<<<<<<<<<<<3<<9;;6;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_108:4:75:166:463	83	seq2	64	99	35M	=	250	221	TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<++3	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:4
+B7_610:5:102:915:87	83	seq2	65	99	35M	=	222	192	AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC	<<<<<<<<<<<<<<<<<<<<;<<<<<3<<;<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:3	H1:i:0
+EAS54_71:3:78:855:352	147	seq2	65	99	35M	=	240	209	AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC	<<<<<<<<;<<<<<<<<<;<<<<<<<<;<;<<:<:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:3	H1:i:0
+EAS56_57:2:206:873:186	147	seq2	66	99	35M	=	227	196	ACAATAGACTAAACCAAGCAGAAGAAAGAGGTTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;53	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_93:6:238:514:194	147	seq2	68	99	35M	=	265	232	AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<;<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:3:285:489:327	83	seq2	68	99	35M	=	233	200	AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS54_67:1:15:381:715	83	seq2	72	99	35M	=	237	200	GACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTT	;=====;===9==;===9;;;=4;9=====;====	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:199:818:124	83	seq2	73	99	35M	=	266	228	ACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTTG	<<<<<<<<<<<<<<<<<;<<;<<;7<<<<<<9<9;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:182:1002:639	147	seq2	77	99	35M	=	246	204	AACCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGA	<<<<<<<<<<<<<<<<<<<<<9-<<<<4<;<;;<;	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:3:945:2005	147	seq2	77	99	35M	=	262	220	AACCAAGCAGAAGAAAGAGGCTCAGAACTTGAAGA	<<<<<<<<<<<<<<<<<<<<%<<<<<<;<<<<<<<	MF:i:18	Aq:i:44	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+B7_591:5:254:542:848	83	seq2	79	99	36M	=	233	190	CCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAA	<<<;<<<<<<<<<<<<<<<;4<;8<<<;;9<9;8;9	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:71:517:742	83	seq2	81	99	35M	=	266	220	AAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAAG	<<<<<<<<<<<<;<<<<<<<<<<<<<48:4<<<<3	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:254:617:73	147	seq2	83	99	35M	=	266	218	GCAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTC	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<6;:;4%	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:13:1507:1146	83	seq2	84	99	35M	=	278	229	CAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTCT	;<9;;;;<<;;;;<<;<;;;;<;;<<;<;<99777	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:32:686:735	83	seq2	84	78	35M	=	255	206	CAGAAGAAAGAGGTTCANANNNTGANGACAAGTCT	<<<<<<<<<<<<<<<<<!<!!!<<<!<<<<<<<<<	MF:i:-126	Aq:i:78	NM:i:5	UQ:i:0	H0:i:0	H1:i:0
+EAS56_57:3:112:729:591	83	seq2	86	99	35M	=	283	232	GAAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:17:1222:783	147	seq2	87	99	35M	=	251	199	AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCGT	<<<<<<<)<<<16<<;<<<6<4<:<4<+://<7)<	MF:i:18	Aq:i:59	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS188_7:6:46:122:479	83	seq2	87	99	35M	=	248	196	AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:313:531:169	147	seq2	89	99	36M	=	250	197	GAAAGAGGTTCAGAACTTGAAGACAAGTCTCTTATG	<<<<<<<<<<<<<;<<<<<<<<<<<:<<:<;<<;<2	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:148:170:895	83	seq2	91	99	35M	=	247	191	AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA	<<<<<<<<<<9<<<<<6<<<<<<<<<<<<<<<<6<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:34:380:815	147	seq2	91	99	35M	=	283	227	AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:210:809:735	147	seq2	93	99	35M	=	291	233	GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:40:925:442	147	seq2	93	99	35M	=	271	213	GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT	;<;<<<<<<<<<<<3;<7;:<;;<<<;<<:<32<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:169:256:888	147	seq2	94	99	35M	=	270	210	AGGTTCAGAACTTGAAGACAAGTCTCTTATGAATT	<<<<<<<<<<<<<<<<<<<<<<;;<;<<;<<:;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:117:156:84	83	seq2	95	99	35M	=	285	225	GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:35:522:294	147	seq2	95	99	35M	=	272	212	GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA	===============================:=:=	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:41:653:1568	147	seq2	95	99	35M	=	266	206	GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA	;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:178:276:693	147	seq2	96	99	36M	=	259	199	GTTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:223:440:667	83	seq2	97	99	35M	=	282	220	TTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC	<<<<<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:194:470:416	83	seq2	98	99	35M	=	265	202	TCAGAACTTGAAGACAAGTCTCTTATGAATTAACC	<<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:61:1000:1534	147	seq2	104	99	35M	=	286	217	CTTGAAGACAAGTCTCTTATGAATTAACCCAGTCA	<<<<4:<:<1)<<<<<<<+<:44<</7<<<)4:<)	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:145:383:182	147	seq2	105	99	35M	=	291	221	TTGAAGACAAGTCTCTTATGAATTAACCCAGTCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:63:816:921	147	seq2	106	99	35M	=	291	220	TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<4<846	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:77:1780:693	83	seq2	106	99	40M	=	276	210	TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGACAAAA	<<<<<<<<<<<<;<<:<<;<<<<<<<<<<<<;<<<;;:69	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:215:861:605	147	seq2	107	94	36M	=	262	191	NAAGACAAGTCTCTTATGAATTAACCCAGTCAGACA	!+++++++++++++++++++++++++++++++++++	MF:i:18	Aq:i:19	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS221_3:2:22:1623:709	83	seq2	107	99	35M	=	287	215	GAAGACAAGTCTCTTATGAATTAACCCAGTCAGAC	<<<<<<<<<7<<<<<<<:<<<<<<<<:85:<:2<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:54:436:1452	147	seq2	108	99	35M	=	275	202	AAGACAAGTCTCTTATGAATTAACCCAGTCAGACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:42:333:516	147	seq2	109	99	35M	=	296	222	AGACAAGTCTCTTATGAATTAACCCAGTCAGACAA	<<<<<5<*<2<<<<<<<<<<<<<<<<<<<<<<<</	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:119:730:190	83	seq2	114	99	35M	=	301	222	AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA	<<<9<;;<<<;<<<<<<<8<<<1<<918<;;;<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:63:727:203	83	seq2	114	99	35M	=	278	199	AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:27:577:849	147	seq2	114	99	35M	=	316	237	AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA	<<<<<<<<<<<<<<<<<<<<;:<<<;<<<<<<;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:5:5:259:250	83	seq2	115	99	35M	=	269	189	GTCTCTTATGAATTAACCCAGTCAGACAAAAATAA	<<<<<<<<<<<<<<<<<<<<;<<<;5<<5<;7<::	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:17:989:186	83	seq2	120	91	35M	=	299	214	TTATGAATTAACCCAGTCAGACAAAAATAAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<:<<;<7;::::	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS114_45:2:33:1445:1357	83	seq2	121	85	35M	=	299	213	TATGAATTAACCCAGTCAGACAAAAATAAAGAAAA	;;<;<<<<<<;;;<9:;:;;;;;:;:;;;;99777	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:7
+EAS221_3:4:30:1452:1563	147	seq2	122	94	35M	=	313	226	ATGAATTAACCAAGTCAGACAAAAATAAAGAAAAA	<<<<<<<<<<<<<<:<<<<1<<<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_45:1:77:1000:1780	147	seq2	123	66	35M	=	279	191	TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA	;;;:;;;;;;;/;;;7:4;;7;;;;;;;;;77777	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:6	H1:i:47
+EAS114_45:4:48:310:473	83	seq2	123	66	35M	=	298	210	TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA	<<<;<<;;;<<;;<;;;;;;;;;;;;;;;;89799	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:6	H1:i:47
+B7_591:2:279:124:41	83	seq2	124	69	36M	=	307	219	GAATTAACCCAGTCAGACAAAAANNAAGAAAAAAGA	<<<<<<<7/<8<<<<<<<<<<4*!!<<7<7<<5<<3	MF:i:18	Aq:i:0	NM:i:2	UQ:i:0	H0:i:0	H1:i:0
+EAS112_32:8:89:254:332	147	seq2	124	76	35M	=	291	202	GAATTAACCCAGTCAGACAAAAATAAAGAAAAAAG	==================;=========;=7;;<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:4	H1:i:36
+B7_597:7:103:731:697	83	seq2	125	72	35M	=	304	214	AATTAACCCAGTCAGACAAAAATAAAGAAAAAAGA	<<<<<<<<<<<<<<<<<<:<:<<6<<<<<<<:<;:	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:9	H1:i:55
+EAS139_11:2:71:83:58	147	seq2	148	77	9M2I24M	=	349	236	AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:77	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS192_3:4:63:5:870	147	seq2	148	75	9M2I24M	=	330	217	AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT	<<;<<<<<<<<<<<<<<<<<;<<<<<<<<<;;<<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS139_19:2:29:1822:1881	147	seq2	150	74	7M2I31M	=	328	218	AGAAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAGAAG	<<<<<<<<<<<<4<<<<<<<<<<<<<<:<<<:<<;:::::	MF:i:-126	Aq:i:74	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS221_3:2:100:1147:124	147	seq2	150	99	35M	=	345	230	AAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS192_3:8:6:104:118	147	seq2	154	99	35M	=	323	204	AAGAATTTTAAAAATGAACAGAGCTTTCAAGAAGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<=<<<<<<	MF:i:18	Aq:i:27	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_593:6:185:96:948	83	seq2	160	99	36M	=	324	200	TTTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT	<<<<<<<<<;6<<<<<<<<<;<<<;;<<<<<<<;<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:213:309:373	147	seq2	161	99	35M	=	317	191	TTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT	<;<<<<<<;<7<<<<<-<<<<<<<<<<<<<<4<7<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:30:466:652	83	seq2	163	98	35M	=	332	204	AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA	<<<<<<<<<<<<<<<<<<<<<<<<;<<<4;7<<<7	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:156:21:69	147	seq2	163	99	35M	=	362	234	AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA	<<<<<<<<<<<<<<<<<<<<<<<:<4<<<:<;<;;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:197:52:58	147	seq2	165	99	35M	=	323	193	AAATGAACAGAGCTTTCAAGAAGTATGAGATTATG	<<<<<<<<<<<<<<<<<<9<<<<2<<<<<<;<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:214:946:229	147	seq2	165	99	35M	=	339	209	AAATGAACAGAGCTTTCAAGAAGTATGATATTATG	<<<<<<<<<<<<<<<<<::<;;;<;<;7<:<<7<2	MF:i:18	Aq:i:65	NM:i:1	UQ:i:27	H0:i:1	H1:i:0
+EAS192_3:4:293:168:240	83	seq2	167	99	35M	=	340	208	ATGAACAGAGCTTTCAAGAAGTATGAGATTATGTA	<<<<;<<<;;;<;<<;;;<<;;<<::::<<;;+;7	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:208:118:673	83	seq2	169	76	35M	=	332	198	GAACAGAGCTTTCAAGAAGTATGAGATTATGTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:3:71:478:175	147	seq2	171	99	35M	=	317	181	ACAGAGCTTTCAAGAAGTATGAGATTATGTAAAGT	<<<<<<<<<<<;<<<<<;<<<<<<<<<<;<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:177:24:389	147	seq2	175	99	35M	=	365	225	AGCTTTCAAGAAGTATGAGATTATGTAAAGTAACT	<<<<<<<<<<<<<<<<<<<<<<<<7<;;<;9969;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:14:1211:1332	147	seq2	178	99	35M	=	351	208	TTTCAAGAAGTATGAGATTATGTAAAGTAACTGAA	;;.;;;;;;;3;;;;;6;;;;;;8;;;;;;63777	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:324:238:736	147	seq2	180	99	35M	=	367	222	TCAAGAAGTATGAGATTATGTAAAGTAACTGAACC	===================================	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:9:648:712	83	seq2	182	99	35M	=	358	211	AAGAAGTATGAGATTATGTAAAGTAACTGAACCTA	<9<;<<<<<<<;<<<<<8<<<<9<<;<<8)<:1<:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:41:1308:619	147	seq2	184	99	35M	=	360	211	GAAGTATGAGATTATGTAAAGTAACTGAACCTATG	<6+<*<<<<<<<:<<<<<<<:<<&<<<<1<6<11:	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:328:537:640	83	seq2	185	99	35M	=	352	202	AAGTATGAGATTATGTAAAGTAACTGAACCTATGA	<;<<<<<<;<<<<<<<<<:;<<8<<<;:<<<;<;9	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:86:697:941	147	seq2	187	99	35M	=	341	189	GTATGAGATTATGTAAAGTAACTGAACCTATGAGT	=====================<=<==<<====;=5	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:224:592:744	83	seq2	188	99	35M	=	383	230	TATGAGATTATGTAAAGTAACTGAACCTATGAGTC	<<<<<<<<<<<<<<<<;<<<<<7<<<<<<<&<*<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:135:354:66	83	seq2	188	99	35M	=	356	203	TATGAGATTATGTAAAGTAACTGAACCTATGAGTC	<<<<<<<<<<<<<<<<;<<<<<<<<<<;<<2<;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:71:311:202	147	seq2	188	99	35M	=	379	226	TATGAGATTATGTAAAGTAACTGAACCTATGAGTC	<<<<<<<<<<<<<<<<:4<<<<<<<<<<<<8;4;:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:50:30:15	83	seq2	192	39	35M	=	358	201	AGATTATGTAAAGTAACTTAACCTATGAGTCCAAG	+:79.68872.:9&:92/.299169/5+/6/3/&2	MF:i:18	Aq:i:10	NM:i:3	UQ:i:45	H0:i:0	H1:i:1
+EAS192_3:5:287:334:110	73	seq2	196	73	35M	=	196	0	TATGTAAAGTAACTGAACCTATGAGTCACAGGTAT	<<<<<<<<<<<<<<<<<<4;<<<<<<<::6<55:.	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:287:334:110	133	seq2	196	0	*	=	196	0	GATGAATACTAAGATTGATGTAGCAGCTTTTGCAA	.5+7)09<))&-&:33953<-./&&&)((;+3399	MF:i:-64
+B7_597:7:5:753:806	83	seq2	197	99	35M	=	45	-187	ATGTAAAGTAACTGAACCTATGAGTCACAGGTATT	;:<:<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:149:572:877	147	seq2	197	99	36M	=	334	173	ATGTAAAGTAACTGAACCTATGAGTCACAGGTATTC	=>7><>;>+>>/;>>=>=>=:>><>=<<==;)<=8;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:85:923:726	147	seq2	199	99	35M	=	43	-191	GTAAAGTAACTGAACCTATGAGTCACAGGTATTCC	<:<<<%3<<1<<86<<-<<<<<<<<<<<<6<<1<<	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:285:241:560	83	seq2	200	99	35M	=	37	-198	TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT	:<<<<;<<,<<<<5<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:41:461:436	147	seq2	200	74	35M	=	389	224	TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT	<<<<<<<<<<<<<<<<<<<:<<<<<<<<;<;;;:;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:6:25:949:33	83	seq2	201	99	35M	=	383	217	AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG	=;===/8========*==&;6=&=&:=6&:=::67	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:60:590:1760	83	seq2	201	99	35M	=	376	210	AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG	<:<<<<<2<<<<:<::<<<::<<<<<6<<<<<<<6	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:86:693:234	147	seq2	202	82	35M	=	388	221	AAGTAACTGAACCTATGAGTCACAGGTATTCCTGA	;;;;;;;;;;;;;;;;9;;;;;;;;99;;&70777	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:4:223:776	147	seq2	203	93	35M	=	387	219	AGTAACTGAACCTATGAGTCACAGGTATTCCTGAG	<<<<<<<<<<<<<<<<<<<<<<<<<9<<<:;<;2<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:3:88:84:1558	83	seq2	203	95	35M	=	394	226	AGTAACTGAACCTATGAGTCACAGGTATTCCTGTG	<<;<<<<<<<<<<<<;;<<<<<<<::<<<<<<7&<	MF:i:18	Aq:i:22	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_597:2:168:829:88	147	seq2	205	99	35M	=	369	199	TAACTGAACCTATGAGTCACAGGTATTCCTGAGGA	<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<9;4;2	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:168:389:889	147	seq2	205	99	36M	=	37	-204	TAACTGAACCTATGAGTCACAGGTATTCCTGAGGAA	;<<;;56;==================8========8	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:81:685:141	83	seq2	207	85	34M	=	382	210	ACTGAACCTATGAGTCACAGGTATTCCTGAGGAA	<<<<<<<<<<<<<<<<<<<<<;;<<;<<<',7,7	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:26:1312:1400	83	seq2	207	99	40M	=	385	218	ACTGAACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA	<<<<;<<<:<<:<;<:<<<;:;<<<<<<:<8<1;;:::88	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:127:725:381	83	seq2	209	99	34M	=	39	-204	TGAACCTATGAGTCACAGGTATTCCTGAGGAAAA	+<<.<<;<;<<<3;<;<<<<<<6<8;<<<<<<<1	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:19:736:559	83	seq2	209	99	35M	=	370	196	TGAACCTATGAGTCACAGGTATTCCTGAGGAAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:117:284:589	83	seq2	210	99	35M	=	43	-202	GAACCTATGAGTCACAGGTATTCCTGAGGAAAAAG	==8==;==================;==========	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:120:596:847	147	seq2	211	83	35M	=	410	234	AACCTATGAGTCACAGGTATTCCTGAGGAAAAAGA	<<<<<<<<<<<<<;<<<9<<<<<<<;:<62;58;2	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_610:5:51:904:391	147	seq2	212	97	35M	=	401	224	ACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA	<<<<<<<<<<<<<<<<<;<<<<<;:;<2<6;;;;;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:96:1314:1448	147	seq2	213	93	35M	=	388	210	CCTATGAGTCACAGGTATTCCTGAGGAAAAATAAA	<<<<<<<<<<<<<<<<<<<<<<<<5<4<<<<-<<<	MF:i:18	Aq:i:18	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS139_19:3:73:1158:535	147	seq2	213	99	40M	=	377	204	CCTATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTG	<<<<<<<<<<<<<<<<<<<<<<8<;;<<<<<9<<9::8:8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:223:583:968	147	seq2	215	88	36M	=	47	-204	TATGAGGCACAGGTATTCCTGAGGAAAAAGAAAAAG	1<';<<&%-:<<<<<:66%<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_97:3:160:173:889	147	seq2	215	99	35M	=	379	199	TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA	<<<<<<<<<<<<<<<<<<<<;0<7<<;<<<;7<09	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:28:350:895	83	seq2	215	95	35M	=	48	-202	TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA	:<;<<<:;<-<<<<<4;77<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:45:707:147	147	seq2	216	99	35M	=	424	243	ATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAG	<<<<<<<<<<<<&<<<<:<<9<<<9<<<<75;;;<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:18:1757:95	83	seq2	216	45	35M	=	374	193	ATGAGTCGCAGGTATTCCTGAGGAAAAAGAAAAAG	<<<<<<<<<<<<<<<<<<<1<:<<<<<<:<<<;:<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS51_66:6:310:747:415	147	seq2	217	99	35M	=	387	205	TGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGT	<<<<<<<<<<<<<<<<<<:<<<<<;<<<<<;<;<;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:114:938:216	147	seq2	218	99	36M	=	63	-191	GAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGA	<<<<7<6<<<<<<<6<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:179:629:513	147	seq2	220	99	35M	=	409	224	GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG	<<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<;<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:88:55:1187	83	seq2	220	66	35M	=	391	206	GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG	;;<;;;<<99<<;;<;;;;;:;49;:;;;;87898	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:119:38:945	83	seq2	221	99	35M	=	428	242	TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA	<<<<<<<<<<<<<<<8<<<<<8<<<8<;<<7<:<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:67:800:450	147	seq2	221	99	35M	=	41	-215	TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA	9-<9<;<<<<9;5<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:102:915:87	147	seq2	222	99	35M	=	65	-192	CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA	;<8<;;<<<<7;<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:113:367:659	147	seq2	222	72	35M	=	390	203	CACAGGTATTCCTGAGGAAAAAGAAAAAGCGAGAA	=9====8==========:=:=====9=:=&====5	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS218_1:2:26:211:481	147	seq2	222	99	35M	=	43	-214	CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA	:<:<<<<<<9:5<<<<<<<<<<<<<<:<:<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:90:1906:1528	83	seq2	222	99	35M	=	41	-216	CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA	:<<<<<<<<<3:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:13:100:876	147	seq2	223	73	36M	=	397	210	ACAGGGATTCCTGAGGAAAAAGAAAAAGTGAGAAGT	<8<<<*<2<7<<<6<<<<<<6<<8<<<<5<<<<4<9	MF:i:18	Aq:i:30	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+EAS56_63:5:117:570:971	147	seq2	223	99	35M	=	413	225	ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG	<<<<<<<<<<<<<;;;<<<<6<7;9;<:;<;<;;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:50:1203:1094	83	seq2	223	99	35M	=	46	-212	ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG	<7<<<<<5:+63<<<<<<<<<<<<<<<<2<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:107:395:312	83	seq2	224	99	35M	=	44	-215	CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT	;<;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:29:833:612	83	seq2	224	99	35M	=	58	-201	CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT	<<;<<<;<::<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:158:943:467	83	seq2	225	99	35M	=	57	-203	AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT	<:<<;;<:5<<<<<<<<<<<<<<<<<<;<<<;<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:201:768:529	147	seq2	225	99	35M	=	396	206	AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT	==========================1=======;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:11:994:584	83	seq2	226	97	35M	=	417	226	GGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTT	<<<<<<<<<<<7<<<<<<<<<<<<<6<<<<<<3<6	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:206:873:186	83	seq2	227	99	35M	=	66	-196	GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG	;<<;--7<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:4:38:28:122	83	seq2	227	99	35M	=	46	-216	GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG	;9;9;-1<<<<<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:66:372:343	83	seq2	228	99	35M	=	40	-223	TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG	;<1;89<<<<<;<9<<<<9<<<;8<9<;<<<<<;8	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:277:144:848	83	seq2	228	99	35M	=	64	-199	TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG	<<<)63<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:21:1601:1666	83	seq2	228	99	40M	=	56	-212	TATTACTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA	-;;3&1<<<<<<<<<<<<1<<<</<<<<<</<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_57:1:189:503:110	83	seq2	229	79	35M	=	63	-201	ATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGA	=;;6:==============================	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:5:257:654:116	147	seq2	231	99	35M	=	64	-202	TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA	0+37<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:69:1130:832	147	seq2	231	94	35M	=	50	-216	TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA	6)377;3;;;;;;;;;1;;;;;;;;;;;;;;;;;;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:254:542:848	147	seq2	233	99	36M	=	79	-190	CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC	,:4<8<<<<<<<<<<<<<;:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:285:489:327	147	seq2	233	99	35M	=	68	-200	CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA	9;;<<8<<<<<<<<<<<<;<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:163:611:211	147	seq2	234	99	35M	=	405	206	TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC	============8===============;=6;;<;	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:296:224:724	83	seq2	234	99	35M	=	50	-219	TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC	8<<<5<<<<<<<<<<<<<<<<<<<<7<<<<<;<9<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:58:271:612	83	seq2	236	99	35M	=	415	214	AGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTA	<;<<<<<<<<<7<<<<<<<<<<<<<<+47<<;<::	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:15:381:715	147	seq2	237	99	35M	=	72	-200	GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT	<<<<<<<<<<<<<<9<<<<<<97;<<<<<<<<9<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:203:419:243	83	seq2	237	99	35M	=	54	-218	GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:41:1281:1785	83	seq2	237	99	35M	=	399	197	GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT	<<<<<<<<<<<<<<<<<<<<<;<<<;<<<<<<<8<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:218:858:445	83	seq2	239	99	35M	=	421	217	AAAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT	;===5=;=======;==3======9;,79==;===	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:319:250:718	83	seq2	240	99	35M	=	52	-223	AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG	<;:<<<<;<<<:<<<<<<49:<<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:92:493:891	83	seq2	240	99	35M	=	408	203	AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG	<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<8	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:78:855:352	83	seq2	240	99	34M	=	65	-209	AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT	2<<<<<<<9<<4<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:277:921:474	83	seq2	241	99	35M	=	45	-231	AAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:41:199:388	83	seq2	243	99	35M	=	403	195	AGAAAAAGTGAGAAGTTTGGAAAAACTATTTGAGG	;;<<<<<;;<<<<<<;;<;;<<;;<<<<<<99999	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:307:481:625	83	seq2	245	99	36M	=	410	201	AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:134:126:465	83	seq2	245	99	35M	=	434	224	AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA	<<<<<<<<<<<<<;<<<<<<<<<<<<<5<<:<<41	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:44:153:969	147	seq2	245	95	35M	=	447	237	AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA	*:::7<77<:<<<<:<<(597:<:<9//7<529/0	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:182:1002:639	83	seq2	246	99	35M	=	77	-204	AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG	<<;;9;9<<<<<<;<7;<;<<<<;;<<<;<<7;<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:54:91:1232	147	seq2	246	99	35M	=	57	-224	AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG	;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:204:737:61	147	seq2	247	99	35M	=	437	225	AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT	<<<<<<<<<<<<<<<<<<<<<<<<<:<<9<+4:<0	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:148:170:895	147	seq2	247	99	35M	=	91	-191	AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT	<<9<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:46:122:479	147	seq2	248	99	35M	=	87	-196	AAGTGAGAAGTTTGGAAGAACTATTTGAGGAAGTA	<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS219_1:7:16:1343:1621	83	seq2	248	99	35M	=	426	213	AAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGTA	<<<<<<<<8<<<<;<<<;<;<<<<<<<:;4;71:;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:313:531:169	83	seq2	250	99	36M	=	89	-197	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT	98;<;;<<;8<<<<<<<<<<<8<<<<<<<<8<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:75:166:463	147	seq2	250	99	35M	=	64	-221	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT	<<<<<==============================	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:130:260:553	83	seq2	250	99	34M	=	439	224	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGCAC	<<<<<1<<<<<<<<<<6<<81</<4*2;7:+90(	MF:i:18	Aq:i:42	NM:i:2	UQ:i:31	H0:i:1	H1:i:0
+EAS56_59:2:60:677:921	83	seq2	250	96	35M	=	393	178	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:60:1037:1146	83	seq2	250	99	35M	=	447	232	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT	<<<<<<<<<<<<<<<<<<<<<<<<<;<:;;;;;;<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:17:1222:783	83	seq2	251	99	35M	=	87	-199	TGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT	6<<<8<69<8199<7<<<6<<<<<<<<<1:<:<<:	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:96:491:1891	147	seq2	253	99	35M	=	409	191	AGAAGTTTGGAAAAACTATTTGAGGAAGTAATTGG	<:<<<<<::<<<<<<<<<<<<<<<<:<<::7<<:7	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:75:615:555	83	seq2	255	99	35M	=	416	196	AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG	<<<<<<<<<<<<<<<<<<<<<;<;<<<29<;.484	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:32:686:735	147	seq2	255	78	35M	=	84	-206	AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG	<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:65:85:1547	147	seq2	257	99	35M	=	434	212	GTTTGGAAAAACTATTTGAGGAAGTAATTGGGGAA	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<:<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:94:1655:1921	83	seq2	258	85	35M	=	447	224	TTTGGAAAAACTATTTGAGGAAGTAATTGGGGAAA	<<<8<<<<<<<<<8<<8;8<;<;<;;<<9+868<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_610:7:177:469:800	83	seq2	259	99	35M	=	433	209	TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA	<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<<;<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:178:276:693	83	seq2	259	99	36M	=	96	-199	TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAAC	:;<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:14:697:541	83	seq2	259	99	35M	=	432	208	TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA	<<<<<<<<<<<<<<<<<<<:<<<<<<<;;;;8;;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:37:156:134	147	seq2	261	99	35M	=	443	217	GGAAAAACTATTTGAGGAAGTAATTGGGGAAAACC	;;;;;;;;;;9;;;;;;;;;;;;;;;9;;;77679	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:215:861:605	83	seq2	262	94	36M	=	107	-191	GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC	;<<<<<;:<7:<<<;<<<<<<<;:<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:3:945:2005	83	seq2	262	99	35M	=	77	-220	GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCT	7<<<<;;<<;<<<<<7<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:52:751:360	147	seq2	263	99	35M	=	443	215	AAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC	<<<<<<<<<<<<<<<<<<<<<<<:76<<<<;9:;:	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:238:514:194	83	seq2	265	99	35M	=	68	-232	AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT	<<6<<<<:9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:194:470:416	147	seq2	265	99	35M	=	98	-202	AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT	<<<7<<;<<<<<<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:71:517:742	147	seq2	266	99	35M	=	81	-220	AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT	<<<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:254:617:73	83	seq2	266	99	35M	=	83	-218	AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT	<<:<<<9;<<<;;<:<-<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:199:818:124	147	seq2	266	99	35M	=	73	-228	AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:41:653:1568	83	seq2	266	99	35M	=	95	-206	AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT	977979;:;<;;;;;;<<5;<;<;<<<;;;;;;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:211:84:84	83	seq2	268	99	35M	=	440	207	CTATTTGAGGAAGTAATTGGGGAAAACCTCTTTAG	<<<<<<<<<<<<<<<<:<<:<<:<<<44<4<<9<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:152:355:962	147	seq2	269	99	35M	=	456	222	TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	<;<<<<<;8<<<<<<<<<;5;;88<<3<<<<<&0;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:285:395:450	83	seq2	269	99	35M	=	458	224	TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	<<<<<<<;<<<;<<<<<;:<:7<;<;7<7<<;;7<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:15:568:42	89	seq2	269	69	35M	=	269	-35	TTTTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	!!;:<8<;<<<8<<<<<<<<8<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:2	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:15:568:42	149	seq2	269	0	*	=	269	35	TTTTTTTTTTTGTTTTTTTTTTTTTTTTTTTTATA	!!!!!!!!!++++!!!!!!!!!!!!!!!!!!!,!,	MF:i:-64
+EAS192_3:8:6:237:885	83	seq2	269	99	35M	=	433	199	TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<;;;<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:5:5:259:250	147	seq2	269	99	35M	=	115	-189	TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	8<83;<<<<<<<<<<5<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:206:994:556	73	seq2	270	75	35M	=	270	0	ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<<;<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:206:994:556	133	seq2	270	0	*	=	270	0	NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	MF:i:-64
+EAS54_71:4:169:256:888	83	seq2	270	99	34M	=	94	-210	ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	&<<:<;<<;;<8<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:317:72:221	147	seq2	270	99	35M	=	422	187	ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC	===========;=======;;:==6=;=====;==	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:40:925:442	83	seq2	271	99	35M	=	93	-213	TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT	=;=================================	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:158:909:321	147	seq2	271	99	35M	=	453	217	TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:35:522:294	83	seq2	272	99	35M	=	95	-212	TTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:176:971:874	147	seq2	273	76	35M	=	432	195	TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG	<<<<<<<<<<<<<:<;<<<<<<<<<<<<<5<<<<7	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:226:869:36	83	seq2	273	99	35M	=	461	223	TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG	:<<<<,:<;:.:<<:<<717,;2171717717116	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:106:595:322	147	seq2	274	99	35M	=	440	201	GAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<::	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:54:436:1452	83	seq2	275	99	35M	=	108	-202	AGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:77:1780:693	147	seq2	276	99	40M	=	106	-210	GGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGAT	:**::799<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:147:423:584	83	seq2	277	99	35M	=	451	209	GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;96	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:188:782:483	147	seq2	277	99	35M	=	431	189	GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<7<;77	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:78:1314:1275	83	seq2	277	99	35M	=	469	227	GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG	<<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<<<8	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:63:727:203	147	seq2	278	99	35M	=	114	-199	AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA	<<;7<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:13:1507:1146	147	seq2	278	99	35M	=	84	-229	AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA	88788;,;:-:2;;;;;;;;:;:;;;;;;;;;;;;	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:77:1000:1780	83	seq2	279	66	35M	=	123	-191	AGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAG	777774;;4-7;;;;;;:;;;:;;;<;;;;<<<<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:93:490:901	147	seq2	280	99	35M	=	445	200	GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA	<<<<<<<<<<<<<;<<<<<<<;<<<<<:<<1+4-8	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:227:657:95	83	seq2	280	99	35M	=	458	213	GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<85	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:57:324:546	147	seq2	281	99	36M	=	458	213	TAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT	<<<<<<<<<<<<<<<<<<<<<:<<<8:8<<;::;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:223:440:667	147	seq2	282	99	35M	=	97	-220	AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT	<<;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:26:274:1078	147	seq2	282	99	40M	=	458	216	AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC	<<<2<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;:::::	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:196:511:896	147	seq2	283	99	35M	=	446	198	ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT	<<<<<<<<<<<<<<<<<<<<<<<<;<<<4<88;<<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:112:729:591	147	seq2	283	99	35M	=	86	-232	ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT	;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:34:380:815	83	seq2	283	99	35M	=	91	-227	ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT	;;;;<<<<<<;<<<<;<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:117:156:84	147	seq2	285	99	35M	=	95	-225	TGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAG	<;;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:61:1000:1534	83	seq2	286	99	35M	=	104	-217	GGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGA	<<;<<<<;;<<;6;<<<;<4;<<7<<<<<;<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:22:1623:709	147	seq2	287	99	35M	=	107	-215	GGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC	<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:7:682:201	147	seq2	288	99	35M	=	452	199	GGAAAACCTCTTTAGTCTTGCTAGAGATTTAGACA	<<<<<<<7<<7<<<<77&;-9<97<76<;<<993<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:91:89:666	153	seq2	289	60	35M	*	0	0	GAAAACCTCTTTAGTCTTGCTAGAGATTTAGACAT	74752;;4;;;;;;;;7);;;4;;;;)4;;;;;13	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:46:13:880	83	seq2	290	99	35M	=	445	190	AAAACCTCTTTAGTCTTGCTAGAGATTTAGACATC	<<<<<<<<<<<<<<<<<<<<;<7<3<<<9<+;;<9	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:187:715:521	147	seq2	291	99	35M	=	451	195	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<<<<<<<<<<<<<<<<<<<:<<<<<<<;<<;<;;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:210:809:735	83	seq2	291	99	35M	=	93	-233	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:145:383:182	83	seq2	291	99	35M	=	105	-221	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:8:89:254:332	83	seq2	291	76	35M	=	124	-202	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<<<<<:<;<<<<<<<<9<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:63:816:921	83	seq2	291	99	35M	=	106	-220	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:280:662:939	83	seq2	294	99	35M	=	442	183	CCTCTTTAGTCTTGCTAGAGATTTAGACATCTAAA	<<<<<<<<<<<<<;<<<;;7<<<<<<<<<<<<:8<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:250:628:423	147	seq2	295	99	36M	=	489	230	CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG	<<<<<<<<<<<<<<<<<<:;<<<<:<<<<;;;;;;4	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:255:549:422	147	seq2	295	99	35M	=	456	196	CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT	<<<<<<<<<<<<<<<<;<<<<<<<:<<<<<<;;;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:2:491:1886	89	seq2	295	75	35M	*	0	0	CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT	<<:<8:<<<:<<<<<<<<<<<9<<<<<<<<<<<<:	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:267:821:860	147	seq2	296	99	35M	=	451	189	TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG	;<<<<<8<<<<<8<<;<8<<<<<5<;<<<<<2;<5	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:42:333:516	83	seq2	296	99	35M	=	109	-222	TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG	<<<<<<<<7<63<7<<<<<<<<<<<7<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:119:161:322	83	seq2	297	99	35M	=	479	217	CTTTAGTCTTGCTAGAGATTTAGACATCTAAATGA	<<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<</6	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:48:310:473	147	seq2	298	66	35M	=	123	-210	TTTAGTCTTGCTAGAGATTTAGACATCTAAATGAA	77999;;6;;;;;;;;;;;;;;;9;;;;;;;;;;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:159:273:253	153	seq2	299	76	35M	*	0	0	TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA	<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:181:392:500	83	seq2	299	99	35M	=	470	206	TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA	<<<<<:<<<2<<<<;5<<<<29+<<)</65<7.24	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:17:989:186	147	seq2	299	91	35M	=	120	-214	TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA	87;38$<3=/<==============9=========	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:33:1445:1357	147	seq2	299	85	35M	=	121	-213	TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA	88888;;;;;;;:;;;;;;;:;9;;;;;;;;;;;;	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:119:730:190	147	seq2	301	99	35M	=	114	-222	AGTCTTGCTAGAGATTTAGACATCTAAATGAAAGA	;;;3;<<:<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:62:969:12	83	seq2	303	99	35M	=	464	196	TCTTGCTAGAGATTTAGACATCTAAATGAAAGAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:103:731:697	147	seq2	304	72	35M	=	125	-214	CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC	:::;3:<<<<<<<:<<<<<<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:111:142:21	147	seq2	304	99	35M	=	479	210	CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC	<<<<<<<<:<:<<<<<<<<<<<<<<<<<<<<;<;9	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:7:319:280:57	83	seq2	306	99	35M	=	467	196	TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC	;==========;=====6;=========;=<;6;;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:76:205:587	147	seq2	306	99	35M	=	483	212	TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:279:124:41	147	seq2	307	69	36M	=	124	-219	GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA	:17<8<<<:&<<<<<<:;'<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:10:349:1147	153	seq2	307	74	40M	*	0	0	GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA	:/:::<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:16	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:22:490:2011	83	seq2	307	99	35M	=	485	213	GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:46:173:214	147	seq2	308	99	35M	=	487	214	CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<;<3<<<<<<;	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:283:577:398	83	seq2	308	99	35M	=	488	215	CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA	<<<<<<<<<<<<<<<<<<<9<<<<<<<<<;<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:27:280:592	83	seq2	310	99	36M	=	484	210	AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGA	<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<5<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:3:11:1238:1728	147	seq2	310	99	35M	=	475	200	AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAG	<<7<<<<<;<<<<<<<<<<<<;<<<;<<<<<<;;<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:118:121:760	89	seq2	311	77	36M	*	0	0	GAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA	:<<<;;<<<<6<;<<<;<<<<;<<<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:318:679:883	153	seq2	313	75	35M	*	0	0	GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT	<<;4<<;<:<<7<<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:30:1452:1563	83	seq2	313	94	35M	=	122	-226	GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT	<<39<<<59<<:<<+<<<6<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:189:130:136	83	seq2	314	79	35M	=	494	215	ATTTAGACATCTAAATGAAAGAGGCTCAAAGAATG	==<<=================<<====<<=;=6==	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:27:577:849	83	seq2	316	99	35M	=	114	-237	TTAGACATCTAAATGAAAGAGGCTCAAAGAATGCC	5:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:3:71:478:175	83	seq2	317	99	35M	=	171	-181	TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA	<<<<;<96<<<<;<<<<<<<<<77<<<<<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:38:999:463	83	seq2	317	39	35M	=	503	221	TAGACATCTAAATGAAAGNNGCNNNAAGAATGCCA	7<<<<<<<<:07<<:<<7!!<<!!!::<88<<<<4	MF:i:-126	Aq:i:39	NM:i:5	UQ:i:0	H0:i:0	H1:i:0
+EAS54_71:8:215:830:609	89	seq2	317	71	33M	*	0	0	AAGACATCTAAATGAAAGAGGCTCAAAGAATGC	+<)<:<<:<<<<<<<<<9<<<<<;<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:1	UQ:i:11	H0:i:1	H1:i:0
+EAS188_7:7:213:309:373	83	seq2	317	99	35M	=	161	-191	TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA	<<<86<82<<<<<<<<<<<<<<<9<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:45:1339:1807	153	seq2	319	64	35M	*	0	0	GACATCTAAATGAAAGAGGCTCAAAGAATGCCAGG	77797;;:;::&:;;0:;8;;4;;:;;6;;;;;;;	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:197:52:58	83	seq2	323	99	35M	=	165	-193	TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA	<7;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:8:6:104:118	83	seq2	323	99	35M	=	154	-204	TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:185:96:948	147	seq2	324	99	36M	=	160	-200	CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATA	6<;;<;<<;<<<<<747<<<<<<<<77<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:61:346:384	147	seq2	324	68	35M	=	496	207	CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT	<<;<<<<<<<<9<;<<9;<6<2;<6<<<;9*558;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:177:800:714	147	seq2	324	76	35M	=	497	208	CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT	<<<<<<<<<<<<<<<<<<<<<;<<<;<;<<<<<;<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:329:339:408	83	seq2	325	99	36M	=	515	226	TAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:214:565:337	83	seq2	326	99	35M	=	481	190	AAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC	<;<<<<<<<<<<<<<<;<<<<9<<<<<;;;;<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:296:401:60	89	seq2	327	68	35M	*	0	0	AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA	<<*<<<<7<<)<<3<<<9<<<<<<<<<<<<<<;<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:88:1413:14	89	seq2	327	76	35M	*	0	0	AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA	<<<<<<<<<<<;;;<<<<<<;<;;<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:34:649:318	147	seq2	328	65	35M	=	481	188	ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACAT	9<<3<<<9<<<<<<<<<7<<9<<0<<.0<*:77,;	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:29:1822:1881	83	seq2	328	74	40M	=	150	-218	ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA	;87;;<<<;<5<5<<<<<<<;<<<<<<<<<<<<:<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:187:199:369	153	seq2	329	74	35M	*	0	0	TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT	;<><<<<<<<<7<<<<<<<<=<<<<<<<<<<<<<<	MF:i:32	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:23:268:529	153	seq2	329	71	35M	*	0	0	TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT	7;<<<<<<57;-<<<<<<:<77<<<<<<<;<;<<<	MF:i:32	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:315:219:7	153	seq2	330	69	35M	*	0	0	GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG	7==::<2=8<<<=====>888<=2=>==>,>,>>8	MF:i:32	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:63:5:870	83	seq2	330	75	35M	=	148	-217	GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG	:<;<;<<<4:;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:243:557:560	147	seq2	331	75	36M	=	499	204	AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA	<<<<<<<9<<<<<<<<<<<<<<<<<<;<<89<<9<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:270:430:269	147	seq2	331	99	36M	=	519	224	AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;7;:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:6:284:442:747	89	seq2	331	75	35M	*	0	0	AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC	<;<<<<<:<;<<<<<<<<;<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:71:31:1973	89	seq2	331	76	35M	*	0	0	AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC	<<<<<7<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:30:466:652	147	seq2	332	98	35M	=	163	-204	AAGAGGCTAAAAGAATGCCAGGAAGATACATTGCA	<<<<<;3;&<<<<<<<</6<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS56_61:3:208:118:673	147	seq2	332	76	35M	=	169	-198	AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA	<<<<<;;<;<<<<<<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:95:1530:28	147	seq2	332	74	35M	=	490	193	AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA	;;;;;;;;;;:;;;;;;;8;;;;;;;;;;;77747	MF:i:18	Aq:i:9	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:104:965:517	73	seq2	333	77	35M	=	333	0	AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA	<<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<;<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:104:965:517	133	seq2	333	0	*	=	333	0	NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	MF:i:-64
+EAS54_65:7:155:629:357	147	seq2	333	99	35M	=	521	223	AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA	<<<<<<<<8<8<<6<<<<<<<<;<9<5<;<;;941	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:149:572:877	83	seq2	334	99	36M	=	197	-173	GAGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA	6<94693<;<<<<;;<<<<<<<<<<;9<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:53:544:889	83	seq2	335	76	35M	=	495	195	AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA	<<<<<<<<;<<<<<<<<<<<<<<<<<;<<<<<;<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:226:370:91	83	seq2	335	99	35M	=	482	182	AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA	8<<<;<8<8<;<<<8<<;7<7;8784<<,;864<&	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:119:651:88	147	seq2	337	99	35M	=	527	225	GCTCAAAGAATGCCAGGAAGATACATTGCAAGACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:20:592:496	147	seq2	338	75	35M	=	498	195	CTCAAAGAATGCCAGGAAGATACATTGCAAGACAG	<<<<<<<<<<<<<<<<<<<<<<<<<==<<<<<<:<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:214:946:229	83	seq2	339	99	35M	=	165	-209	ACAAAGAATGCCAGGAAGATACATTGCAAGACAGA	)+<<<*<<77;8<;7<<8<4<;<88<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS188_7:5:163:982:695	83	seq2	339	77	35M	=	499	195	TCAAAGAATGCCAGGAAGATACATTGCAAGACAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:14:1872:1521	147	seq2	339	62	35M	=	500	196	TCAAAGAATGCCAGGAAGATACATTGCAAGTCAGA	7<<<<77<<<3<3<7.'<<<<<7<67<+.0%4*<4	MF:i:18	Aq:i:2	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS192_3:4:293:168:240	147	seq2	340	99	35M	=	167	-208	CAAAGAATGCCAGGAAGATACATTGCAAGACAGAC	+;;;;<8<<86<<<<<<<;;8;7;<;<8<8;<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:86:697:941	83	seq2	341	99	35M	=	187	-189	AAAAAAATCCCGGAAGATACATTGCAAGACAGACT	1<<%<<<1:<58<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:4	UQ:i:67	H0:i:0	H1:i:0
+EAS54_71:4:14:88:306	83	seq2	341	99	34M	=	521	215	AAAGAATGCCAGGAAGATACATTGCAAGACAGAC	<<<<<<8<<<<<<;<<<3<<<8<<;<;;<15<:6	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:183:697:555	147	seq2	341	84	35M	=	505	199	AAAGAATGCCAGGAAGATACATTGCCAGACAGACT	=====================:===&==:;==5;;	MF:i:18	Aq:i:37	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS56_57:3:41:739:907	147	seq2	344	99	35M	=	520	211	GAATGCCAGGAAGATACATTGCAAGACAGACTTCA	<<<<<<<<<<<<<<<<<<<<<<<<;<9<<<;;;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:100:1147:124	83	seq2	345	99	35M	=	150	-230	AATGCCAGGAAGATACATTGCAAGACAGACTTCAT	<<<<96<<<<<<<<<<<<<<<<<<<<<<:<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:127:828:697	83	seq2	346	99	35M	=	552	241	ATGCCAGGAAGATACATTGCAAGACAGACTTCATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:62:125:888	147	seq2	347	99	35M	=	504	192	TGCCAGGAAGATACATTGCAAGACAGACTTCATCA	<<<<<<<<<<<<<<<<<<<::<<<:7<::<:;<<:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:1:1598:843	147	seq2	347	99	40M	=	500	193	TGCCAGGAAGATACATTGCAAGACAGACTTCATCAAGATA	<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<8<4:8::	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:71:83:58	83	seq2	349	77	35M	=	148	-236	CCAGGAAGATACATTGCAAGACAGACTTCATCAAG	8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:88:1454:418	147	seq2	349	99	35M	=	522	208	CCAGGAAGATACATTGCAAGACAGACTTCATCAAG	:<<:<<<<<<<<<<<::::<:<:<9<5<<<<<<8:	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:36:649:554	147	seq2	350	99	35M	=	523	208	CAGGAAGATACATTGCAAGACAGACTTCATCAAGA	<<<<<4<<8<<<<<<8<6<<88<<<<<<<-;<;0;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:189:831:878	147	seq2	351	99	35M	=	555	239	AGGAAGATACATTGCAAGACAGACTTCATCAAGAT	:<<<2<<<<<<<<<<:8<8<<<<<<<<<<87489;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:14:1211:1332	83	seq2	351	99	35M	=	178	-208	AGGAAGATACATTGCAAGACAGACTTCATCAAGAT	978961;;991;97;<;;<;<<;;;;;<;;<:8:<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:328:537:640	147	seq2	352	99	35M	=	185	-202	GGAAGATACATTGCAAGACAGACTTCATCAAGATA	;:<<;<<<<<::<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:85:361:418	83	seq2	353	99	36M	=	517	200	GAAGATACATTGCAAGACAGACTTCATCAAGATATG	<<<<<<<<<<<<<;<<<<<<<<<<<<<<;4;<<<<3	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:329:437:643	83	seq2	354	99	36M	=	540	222	AAGATACATTGCAAGACAGACTTCATCAAGATATGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<<<1	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:135:354:66	147	seq2	356	99	35M	=	188	-203	GATACATTGCAAGACAGACTTCATCAAGATATGTA	;;;;7<<<<:<<<<;<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:9:648:712	147	seq2	358	99	35M	=	182	-211	TACATTGCAAGACAGACTTCATCAAGATATGTAGT	*;0;;;95<<<<7<<<;;<<<;;<<<<;<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:36:1184:994	147	seq2	358	99	35M	=	518	195	TACATTGCAAGACAGACTTCATCAAGATATGTAGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<8<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:50:30:15	147	seq2	358	10	35M	=	192	-201	TACATTGCAAGACAGTCGTCAGCAAGATATGTAGT	1-%-22&&)&11,&/&&176<&<<<222<,6,<<<	MF:i:18	Aq:i:10	NM:i:3	UQ:i:26	H0:i:0	H1:i:0
+EAS51_66:4:322:350:374	147	seq2	360	99	35M	=	546	221	CATTGCAAGACAGACTTCATCAAGATATGTAGTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:41:745:603	147	seq2	360	99	35M	=	536	211	CATTGCAAGACAGACTTCATCAAGATATGTAGTCA	<<<<<<<<<<<<:<<<<<<<<<<<<<<<6<:8<<:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:138:186:459	147	seq2	360	97	35M	=	518	193	CATTGCAAGACAGACTTCATCAAGATATGTAGTCA	<*<<7<<0<7<<+<-:<<&<:6:4:0-:<<2.:5<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:41:1308:619	83	seq2	360	99	35M	=	184	-211	CATTGCAAGACAGACTTCATCAAGATATGTAGTCA	0<9476<<<<<0<<<2<&<0<.<<<<<<<<<.<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:125:884:276	147	seq2	362	99	35M	=	541	214	TTGCAAGACAGACTTCATCAAGATATGTAGTCATC	<<<<<<<<<<<8<<<<<<<<<<<<<<<<<<;;<<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:156:21:69	83	seq2	362	99	35M	=	163	-234	TTGCAAGACAGACTTCATCAAGATATGTAGTCATC	<:3:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:66:1381:181	147	seq2	362	99	40M	=	544	222	TTGCAAGACAGACTTCATCAAGATATGTAGTCATCAGACT	<<6<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<::4:7	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:11:1261:1200	147	seq2	362	99	35M	=	558	231	TTGCAAGACAGACTTCATCAAGTTATGTAGTCATC	<<<<<<<<<<<;<<<<<<<<;<<<;<:<<8<<:<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_99:5:191:885:623	147	seq2	363	99	35M	=	551	223	TGCAAGACAGACTTCATCAAGATATGTAGTCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:53:783:78	83	seq2	363	99	35M	=	561	233	TGCAAGACAGACTTCATCAAGATATGTAGTCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<7;<:;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:177:24:389	83	seq2	365	99	35M	=	175	-225	CAAGACAGACTTCATCAAGATATGTAGTCATCAGA	+<<;<9<<<9<<;<<7<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:58:684:520	83	seq2	367	99	35M	=	538	206	AGACAGACTTCATCAAGATATGTAGTCATCAGACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:71:187:824	83	seq2	367	99	35M	=	534	202	AGACAGACTTCATCAAGATATGTAGTCATCAGACT	;===;======3==;==========4=;=7;;3;6	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:324:238:736	83	seq2	367	99	35M	=	180	-222	AGACAGACTTCATCAAGATATGTAGTCATCAGACT	<<<9<<<70,<<4<<<<<7<4<7<<<<<0<<<<<7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:19:306:982	83	seq2	368	99	35M	=	538	205	GACAGACTTCATCAAGATATGTAGTCATCAGACTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:168:829:88	83	seq2	369	99	35M	=	205	-199	ACAGACTTCATCAAGATATGTAGTCATCAGACTAT	<,,;<838883;;;<<<<<;<8<8;<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:122:589:134	147	seq2	369	99	35M	=	562	228	ACAGACTTCATCAAGATATGTAGTCATCAGACTAT	<<:<<:<:<<<<<:<8<<<<<<<:<::<<<4:<;;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:3:303:970:243	147	seq2	370	99	35M	=	564	229	CAGACTTCATCAAGATATGTAGTCATCAGACTATC	<<<<<<<<<<<<<<<<<<<<;;<<<<<<<<<8<8<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:19:736:559	147	seq2	370	99	35M	=	209	-196	AAGACTTCATCAAGATATGTAGTCATCAGACTATC	)<7<2;;4<<4<<<<;<<<<<<<<<<7<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS51_66:3:246:711:981	83	seq2	371	99	35M	=	559	223	AGACTTCATCAAGATATGTAGTCATCAGACTATCT	<<<<<<<<;<<<<:;<<;;<:<<<4<<:4;00<;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:89:1164:573	83	seq2	371	99	35M	=	560	224	AGACTTCATCAAGAGATGTAGTCATCAGACTATCT	<:<<;<2<<<<<<<&:2<;<;<<<<;,+;:<<4:<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS220_1:8:18:1757:95	147	seq2	374	45	35M	=	216	-193	CTTCATCAAGATATGTAGTCATCAGACTATCTAAA	<<<6<&:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:284:597:682	83	seq2	375	99	35M	=	557	217	TTCATCAAGATATGTAGTCATCAGACTATCTAAAG	<<<<<<<9<<<<<;<<6<<<<<;<9<<<<<<1;;9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:10:394:392	83	seq2	376	99	35M	=	542	201	TCATCAAGATATGTAGTCATCAGACTATCTAAATT	<<<<<<<<<<<<<<<<<<<:<<<<<<;<<;;:6&;	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_97:5:28:538:148	147	seq2	376	99	35M	=	557	216	TCATCAAGATATGTAGTCATCAGACTATCTAAAGT	<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<+771;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:60:590:1760	147	seq2	376	99	35M	=	201	-210	TCATCAAGATATGTAGTCATCAGACTATCTAAAGT	<8<-<<<<<<<82<<<4<<<<<<<<<<<<<8<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:73:1158:535	83	seq2	377	99	40M	=	213	-204	AATAAAGATATGTAGTCATCAGACTATCTAAAGTCAACAT	+;6+;<;<<<<<<<<<0<<;<<<;<<<8<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:2	UQ:i:20	H0:i:1	H1:i:0
+EAS188_7:3:182:104:921	83	seq2	378	99	35M	=	575	232	ATCAAGATATGTAGTCATCAGACTATCTAAAGTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:160:173:889	83	seq2	379	99	35M	=	215	-199	TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA	;)<</<8<<<<<<</<;<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:71:311:202	83	seq2	379	99	35M	=	188	-226	TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA	;6<;<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:315:201:673	147	seq2	381	45	36M	=	542	197	AAGATATGTAGTCATCAGACTATCTAAAGTCAACAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<<:;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:228:915:631	147	seq2	381	66	35M	=	547	201	AAGATATGTAGTCATCAGACTATCTAAAGTCAACA	=================;==========4======	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:228:736:747	147	seq2	381	68	35M	=	542	196	AAGATATGTAGTCATCAGACTATCTAAAGTCAACA	<<<<<<<<<;<<<<<<<;;<<;<<<<;::<;;7;7	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:263:689:572	83	seq2	381	68	35M	=	553	207	AAGATATGTAGTCATCAGACTATCTAAAGTCAACA	<<<<;<<<<<;<<<<<<&;;<<<;<<:<+;;7;;7	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:81:685:141	147	seq2	382	85	35M	=	207	-210	AGATATGTAGTCATCAGACTATCTAAAGTCAACAT	;+;(;)..=3.1=.7=;=8;==<4====;======	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:2	H1:i:2
+EAS114_32:1:208:971:600	147	seq2	382	99	35M	=	559	212	AGATATGTAGTCATCAGACTATCTAAAGTCAACAT	<<<<<<<<<<<<<<<<<8<<:<<<0;44<<:4<:<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:7:1864:1569	83	seq2	382	99	35M	=	561	214	AGATATGTAGTCATCAGACTATCTAAAGTCAACAT	<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<8<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:224:592:744	147	seq2	383	99	35M	=	188	-230	GATATGTAGTCATCAGACTATCTAAAGTCAACATG	6<6<<<<<<9+<6-<<<:<:<:<<<<<:<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:6:25:949:33	147	seq2	383	99	35M	=	201	-217	GATATGTAGTCATCAGACTATCTAAAGTCAACATG	-<4<666<<-7<5<<<<<(<<<<<<<<<<<<<<-<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:2	H1:i:1
+EAS54_73:5:271:874:367	147	seq2	384	99	35M	=	560	211	ATATGTAGTCATCAGACTATCTAAAGTCAACATTA	<<<<<<<<<<<<<<4<;<;<:<;4<4<<99<7<+%	MF:i:18	Aq:i:51	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS139_19:4:26:1312:1400	147	seq2	385	99	40M	=	207	-218	TATGTAGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	::77:<;:+6<+<<<;<<74<<<;<<;<<<<<<<<<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:2
+EAS51_66:6:310:747:415	83	seq2	387	99	35M	=	217	-205	TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG	;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:2	H1:i:6
+EAS56_57:6:4:223:776	83	seq2	387	93	35M	=	203	-219	TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG	<;9<;<0<<;<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:2	H1:i:6
+EAS114_28:3:32:492:907	83	seq2	387	95	36M	=	571	220	TGTAGTCATCAGACTATCTAAAGTCAACATGAAGGA	<<<<<<<<<<<<<<<<<<<;<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS114_26:4:110:840:431	147	seq2	388	93	35M	=	567	214	GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA	=====================5:======54=+3+	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS114_45:6:86:693:234	83	seq2	388	82	35M	=	202	-221	GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA	83997;<;;;;98;;3*6<<;<:8;;;;;<;;<<<	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:3	H1:i:13
+EAS139_11:8:96:1314:1448	83	seq2	388	93	35M	=	213	-210	GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA	<<<<7<<:<<<<<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:3	H1:i:8
+EAS114_30:6:41:461:436	83	seq2	389	74	35M	=	200	-224	TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA	;<986<;6<<<<<<<;<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:3	H1:i:13
+EAS221_3:8:55:932:613	147	seq2	389	77	35M	=	568	214	TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA	<<<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:3	H1:i:10
+EAS1_97:5:219:174:684	147	seq2	390	71	35M	=	560	205	AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	<<<<<<<<<<<8<8<<<7<<;<<<<<2<;&;;;;9	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:2	H1:i:14
+EAS56_57:5:24:284:360	147	seq2	390	76	35M	=	567	212	AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	<<<<<<<<<<<<<<<<<;<<<<<<<;<9;<;99;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:2	H1:i:14
+EAS114_26:1:113:367:659	83	seq2	390	72	35M	=	222	-203	AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	<<5<0&9;<3<<<<<9<<<<4<;<9<9<<<<7<3<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:3	H1:i:17
+EAS114_32:5:109:199:592	147	seq2	390	72	35M	=	576	221	AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	<<<<<<<<<<<;:<;;<<:;6<<;:;:<<+;;;<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:2	H1:i:14
+EAS114_45:4:88:55:1187	147	seq2	391	66	35M	=	220	-206	GTCATCAGACTATCTAAAGTCAACATGAAGGAAAA	7769,7;;;;;;;;;;;;;;9;;;;;;;;;;;;;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:2	H1:i:7
+EAS56_59:2:60:677:921	147	seq2	393	96	35M	=	250	-178	CATCAGACTATCTAAAGTCAACATGAAGGAAAAAA	========9==;======8==>=============	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:4	H1:i:13
+EAS114_39:3:88:84:1558	147	seq2	394	95	35M	=	203	-226	ATCAGACTATCTAAAGTCAACATGAAGGAAAAAAA	;;<<;<<;<<5<<<<<<;<<:<<<;<<<<<<;<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:2	H1:i:3
+EAS56_59:2:201:768:529	83	seq2	396	99	35M	=	225	-206	CAGACTATCTAAAGTCAACATGAAGGAAAAAAATT	3<:<9<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:13:100:876	83	seq2	397	73	36M	=	223	-210	AGAATATATAAAGTCAACATGAAGGAAAAAAATTCT	;9<$<<<$<<<<<<<<75<<<<<<<9<9<<<<<<<<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:6	H0:i:1	H1:i:1
+EAS139_11:4:26:137:1382	83	seq2	397	99	35M	=	579	217	AGACTATCTAAAGTCAACATGAAGGAAAAAAATTC	<<<<<<7<<<77<<<<<<</<<+<<<<<<7<+<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_67:3:197:261:624	83	seq2	398	99	35M	=	587	224	GACTATCTAAAGTCAACATGAAGGAAAAAAATTCT	<<<<<<<<<<<;<<<<<<<;<<;<<<<<<;<<<9<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS218_4:3:41:1281:1785	147	seq2	399	99	35M	=	237	-197	ACTATCTAAAGTCAACATGAAGGAAAAAAATTCTA	<6<<<6<<<<<<:<<6<:<<<<<<<<<<<<6<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+B7_610:5:51:904:391	83	seq2	401	97	35M	=	212	-224	TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA	;<96<<<<<<7<<7<<<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_63:7:137:139:248	147	seq2	401	97	35M	=	569	203	TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA	<<<<<<<<<9<<<<<<<<<<;<<<<<<<;;<;<;<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:3	H1:i:2
+B7_610:7:15:696:693	147	seq2	403	34	35M	=	570	202	TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT	2:+:7<<3<<<<<6+36<<<<<<<6<<6&<<;<.7	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:2	H1:i:1
+EAS114_45:2:41:199:388	147	seq2	403	99	35M	=	243	-195	TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT	84898;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:163:611:211	83	seq2	405	99	35M	=	234	-206	TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA	<<<<9<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:1:114:19:769	147	seq2	405	90	35M	=	572	202	TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA	<<<<<*2;6;<<<4.;;<&;;<.<40)<);5-/7;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS51_64:7:92:493:891	147	seq2	408	99	35M	=	240	-203	AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA	<383<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:5:996:2000	147	seq2	408	99	35M	=	575	202	AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_93:1:179:629:513	83	seq2	409	99	35M	=	220	-224	GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA	<;,<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:84:1505:1037	83	seq2	409	99	35M	=	586	212	GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA	<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<::)	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS221_1:6:96:491:1891	83	seq2	409	99	35M	=	253	-191	GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA	:;5<<7<;:<<;<<<<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:307:481:625	147	seq2	410	99	36M	=	245	-201	TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA	;4<<4<;;<<;;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+B7_610:5:120:596:847	83	seq2	410	83	35M	=	211	-234	TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAG	;/<<:<;<<<<<<<<<<<<<;;<<<<<;<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_45:3:3:864:1888	83	seq2	411	99	35M	=	579	203	CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA	;<<;;<<;;;<;;<<;<;<<;<<;8<<:<;79799	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:34:1614:558	83	seq2	411	99	35M	=	569	193	CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA	<<<<<<<<<<<7<<<<<8<<<<<<2<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:117:570:971	83	seq2	413	99	35M	=	223	-225	ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA	<,<9<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:1
+EAS112_34:8:45:800:733	147	seq2	413	99	35M	=	607	229	ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA	<<<</<<<<<<<<<<<<<<<2<9<<<<<5*5;599	MF:i:18	Aq:i:34	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS219_FC30151:7:87:1289:83	147	seq2	413	99	35M	=	585	207	ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA	<<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<<<:	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_39:4:58:271:612	147	seq2	415	99	35M	=	236	-214	ATGAAGGAAAAAAATTCTAAAATCAGCAAGAGCAA	;:2=<<;<<<<<<:67:<<:<<<<<<<<<<<<,<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:11	H0:i:0	H1:i:2
+EAS1_108:1:33:779:821	147	seq2	416	99	35M	=	579	198	TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS112_34:6:75:615:555	147	seq2	416	99	35M	=	255	-196	TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA	;<<<;<<<<<<<<<:;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS188_7:6:11:994:584	147	seq2	417	97	35M	=	226	-226	GAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAAG	<<<<;<<<<<<<;<:<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS114_26:7:218:858:445	147	seq2	421	99	35M	=	239	-217	GAAAAAAATTCTAAAATCAGCAAGAGAAAAGCATA	;<<<<<<<8;:<<<<<<;<<:<<<<<<<<<<<<;<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS54_81:2:317:72:221	83	seq2	422	99	35M	=	270	-187	AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC	=========:======;==;===============	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:70:766:2016	147	seq2	422	99	35M	=	607	220	AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS56_53:4:45:707:147	83	seq2	424	99	35M	=	216	-243	AAAAATTCTAAAATCAGCAAGAGAAAAGCATACAG	<<<<<<;3<<<<<4;<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:16:1343:1621	147	seq2	426	99	35M	=	248	-213	AAATTCTAAAATCAGCAAGAGAAAAGCATACAGTC	;<<9;7=====;;==<==================<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:184:912:258	83	seq2	428	99	35M	=	582	189	ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:119:38:945	147	seq2	428	99	35M	=	221	-242	ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT	=;;8=====:========<================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:95:235:746	147	seq2	430	99	35M	=	598	203	TCTAAAATCAGCAAGAGAAAAGCATACAGACATCT	<<<<;<<<<<<<<79<<<<<<<<<<<<<<*;;;<9	MF:i:18	Aq:i:72	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+EAS1_99:2:188:782:483	83	seq2	431	99	35M	=	277	-189	CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA	7<<<<<<4<;;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:39:348:594	147	seq2	431	99	35M	=	600	204	CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA	<<;<<<<<<<<<;<;;<<<<<<<<<<;<<<:<:<:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:176:971:874	83	seq2	432	76	9M1D26M	=	273	-195	TAAAATCAGAAGAGAAAAGCATACAGTCATCTATA	<<<<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:3:14:697:541	147	seq2	432	99	35M	=	259	-208	TAAAAGCAGCAAGAGAAAAGCATACAGTCATCTAT	8<<<<&6<;8<<<<<<<<<<<<;<<<<;<<<<<<8	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_610:7:177:469:800	147	seq2	433	99	35M	=	259	-209	AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA	=<<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:131:518:588	147	seq2	433	99	35M	=	607	209	AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<1<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:8:6:237:885	147	seq2	433	99	35M	=	269	-199	AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA	<<<<1:<;:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:134:126:465	147	seq2	434	99	35M	=	245	-224	AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA	<<;:&<3)<<7<:<<<<.:<<<<<8<<<<<<<<<<	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:104:402:732	147	seq2	434	99	35M	=	610	211	AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA	=========================7=;===;=:=	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:65:85:1547	83	seq2	434	99	35M	=	257	-212	AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA	<<<<<<;:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:85:686:696	147	seq2	435	99	35M	=	594	193	AATCAGCAAGAGAAAAGCATACAGTCATCTATAAA	==================<=====:==<=<;=:==	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:144:242:602	147	seq2	436	99	36M	=	611	211	ATCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG	========================;=====<;;<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:204:737:61	83	seq2	437	99	35M	=	247	-225	TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG	(7=72=;==2=====<===<<==============	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:124:253:889	147	seq2	437	99	35M	=	598	196	TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG	<<<<<<6<<:<<<<<<<<<<<<<;;<<;<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:310:155:312	147	seq2	438	99	35M	=	606	203	CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA	;<<<;<<<8<<<<<<<<<<<<;<<<<<8<<<<8<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:78:692:671	83	seq2	438	99	35M	=	610	207	CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA	<<<<<<<<<<<<<;<<<<<<<:<<:<<<:8<<0;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:130:260:553	147	seq2	439	99	35M	=	250	-224	AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA	<*;<<7<);<<;9;<5<*<9<;<<;;<7<<<<<1<	MF:i:18	Aq:i:42	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:60:163:1612	147	seq2	439	99	35M	=	617	213	AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA	<<<<<<<<<21<<<<<<<<<3<--<+<<<+<<63<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:106:595:322	83	seq2	440	99	35M	=	274	-201	GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA	;+<<<<<<<<<<<<<<<<<<;<<7<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:211:84:84	147	seq2	440	99	35M	=	268	-207	GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA	6:<<:<<<<<<9<<<<<<<<<<<;<<<;;;<;<3;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:280:662:939	147	seq2	442	99	35M	=	294	-183	AAGAGAAAAGCATACAGTCATCTATAAAGGAAATC	<<;<;<<<<<:<<<;<<<;<<;<<<<<<<<<<<;<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:52:751:360	83	seq2	443	99	35M	=	263	-215	AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC	<-<9<<<<<6<<<8<<;;<<9<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:234:167:381	147	seq2	443	99	35M	=	625	217	AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;;7<;;	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:37:156:134	83	seq2	443	99	35M	=	261	-217	AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC	99998<<<<:<<<<<<<;<<><<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:93:490:901	83	seq2	445	99	35M	=	280	-200	AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA	<<<<<<<;<<<;<<<;<<;<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:96:489:453	83	seq2	445	99	35M	=	625	215	AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;:	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:46:13:880	147	seq2	445	99	35M	=	290	-190	AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA	=&====8==========0=================	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:167:905:852	147	seq2	445	99	36M	=	647	238	AGAAAAGCATACAGTCATCTATAAAGAAAATCCCAT	<<<7<<<<<<<<<<<<<<:<:<<:::&.<:<66:3<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS219_FC30151:3:13:674:1717	147	seq2	445	99	35M	=	623	213	AGAAAAGCATGCAGTCATCTATAAAGGAAATCCCA	<<<<<<<<<<%<<<<<<<<<<<<<<<<<<<;:;;;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS51_62:7:196:511:896	83	seq2	446	99	35M	=	283	-198	GAAAAGCATACAGTCATCTATAAAGGAAATCCCAT	8<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:154:118:488	147	seq2	447	99	35M	=	624	212	AAAAGCATACAGTCATCTATAAAGGAAATCCCATC	<<<<<<<<<<<<<<<<<<<<<<:7<<<<7<:;;::	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:44:153:969	83	seq2	447	95	35M	=	245	-237	AAAAGCATACAGTCATCTATAAAGGAAATCCCATC	<<5<:7<72<51<7<*79<<<<<5<<<<<<<<<2<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:215:246:640	83	seq2	447	99	36M	=	624	213	AAAAGCATACAGTCATCTATAAAGGAAATCCCATCA	<<<<<<<<<<9<;<<<<<<<<<<9;<<<<<<3;<;3	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:94:1655:1921	147	seq2	447	85	35M	=	258	-224	AAAAGCATACAGTCATCTATAAAGGAAATCCCATC	<<<<;:===<==;<==<;================;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:60:1037:1146	147	seq2	447	99	35M	=	250	-232	AAAAGCATACAGTCATCTATAAAGGAAATCCCATC	<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:23:536:229	83	seq2	448	99	35M	=	614	201	AAAGCATACAGTCATCTATAAAGGAAATCCCATCA	<<<<<<<<<<<<<<<<<:<8<:<<;<<<<<<7<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:130:865:838	147	seq2	448	99	35M	=	649	236	AAAGCATACAGTCATCTATAAAGGAAATCCCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:<;3	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:239:1001:406	83	seq2	450	99	35M	=	634	219	AGCATACAGTCATCTATAAAGGAAATCCCATCAGA	<<<<<<7<<<<<<<<8<;<<<7<<<<36<<3<:33	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:147:423:584	147	seq2	451	99	35M	=	277	-209	GCATACAGTCATCTATAAAGGAAATCCCATCAGAA	27<;<3<<<+<<;<<<;;-4<<<<<;<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:187:715:521	83	seq2	451	99	35M	=	291	-195	GCATACAGTCATCTATAAAGGAAATCCCATCAGAA	<7<:<9<<<<<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:172:196:746	83	seq2	451	99	35M	=	620	204	GCATACAGTCATCTATAAAGGAAATCCCATCAGAA	<<<<<<<<9<<<<9<<<<<<<<<;<<<<6<<<<;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:267:821:860	83	seq2	451	99	34M	=	296	-189	GCATACAGTCATCTATAAAGGAAATCCCATCAGA	$&<<<.<:;6<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS56_61:7:7:682:201	83	seq2	452	99	35M	=	288	-199	CATACAGTCATCTATAAAGGAAATCCCATCAGAAT	0:8;5<8<1:78<<<<<<<<<<<<:8<<2<<<<:<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:3:82:13:897	147	seq2	453	99	35M	=	606	188	ATACAGTCATCTATAAAGGAAATCCCAGCAGAATA	<<<<;<<<<<<;<;<;5<51;<1<<<<%<<<<,58	MF:i:18	Aq:i:41	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS56_53:6:180:695:621	83	seq2	453	99	35M	=	637	219	ATACAGTCATCTATAAAGGAAATCCCATCAGAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:158:909:321	83	seq2	453	99	35M	=	271	-217	ATACAGTCATCTATAAAGGAAATCCCATCAGAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:237:497:165	83	seq2	454	99	35M	=	619	200	TACAGTCATCTATAAAGGAAATCCCATCAGAATAA	8===<8===========37=<===7=;7=8=====	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:152:355:962	83	seq2	456	99	35M	=	269	-222	CAGTCATCTATAAAGGAAATCCCATCAGAATAACA	&<.9.<;+;<;<<<<<<<<<<::<<:<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS192_3:4:255:549:422	83	seq2	456	99	35M	=	295	-196	AAGTCATCTATAAAGGAAATCCCATCAGAATAACA	&<;;+<;4;<<<<<<<<<<<;<;<<;<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:2
+EAS220_1:4:100:20:1199	147	seq2	456	99	35M	=	614	193	CAGTCATCTATAAAGGAAATCCCATCAGAATAACA	7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:71:408:741	147	seq2	457	99	35M	=	637	215	AGTCATCTATAAAGGAAATCCCATCAGAATAACAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:285:395:450	147	seq2	458	99	35M	=	269	-224	GTCATCTATAAAGGAAATCCCATCAGAATAACAAT	8)3<8+;<)<<<<<<<<97:7<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:4:854:140	83	seq2	458	72	35M	=	638	215	GTCATCTATAAAGGAAATCCCATCAGAATAACAAT	<<<6<<<:<6<<<:36:<<<<3<<8:.6<38::4<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:227:657:95	147	seq2	458	99	35M	=	280	-213	GTCATCTATAAAGGAAATCCCATCAGAATAACAAT	;3;<);<<<<<<<<<<<<18<<<<<<<<<<<<<<<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:57:324:546	83	seq2	458	99	36M	=	281	-213	GTCATCTATAAAGGAAATCCCATCAGAATAACAATG	;;5<;,<<<;;<<<<<<<97<<<<<<<<<<9<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:26:274:1078	83	seq2	458	99	40M	=	282	-216	GTCATCTATAAAGGAAATCCCATCAGAATAACAATGGGCT	9:*:64<<;<<<<<<<<<;8;<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:107:636:642	147	seq2	458	99	35M	=	630	207	GTCATCTATAAAGGAAATCCCATCAGAATAACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:226:869:36	147	seq2	461	99	35M	=	273	-223	ATATATAAAGGAAATCCCATCAGAATAACAATGGG	<0/)</<<<:<<<<<)<<7<<<<<+55<<1<<<:<	MF:i:18	Aq:i:59	NM:i:1	UQ:i:14	H0:i:1	H1:i:0
+EAS192_3:4:312:915:751	83	seq2	461	99	35M	=	621	195	ATCTATAAAGGAAATCCCATCAGAATAACAATGGG	<2<<<<<<<8;<<<<<<<<:<<<<8<<<<<84,4:	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:96:899:106	83	seq2	462	99	35M	=	636	209	TCTATAAAGGAAATCCCATCAGAATAACAATGGGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:62:969:12	147	seq2	464	99	35M	=	303	-196	TATAAAGGAAATCCCATCAGAATAACAATGGGCTT	<<;<;<::<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:67:56:806	83	seq2	464	99	35M	=	637	208	TATAAAGGAAATCCCATCAGAATAACAATGGGCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<:7:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:37:611:267	83	seq2	464	99	35M	=	610	181	TATAAAGGAAATCCCATAAGAATAACAATGGGCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_93:7:319:280:57	147	seq2	467	99	35M	=	306	-196	AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC	<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:96:720:940	147	seq2	467	99	35M	=	654	222	AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC	<<<<<<;<<<<<<<<<<;9<<8<<6<;:;<;;.;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:2:59:286:290	83	seq2	467	99	35M	=	628	196	AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC	<<<<<<<<;<<<;<<<<<<<<<<<<<;;;<<;7;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:236:841:20	147	seq2	467	99	35M	=	652	220	AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC	<<<<<<<<<<<<<<<<<7<<<<:<<9<<<<;<:<9	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:49:656:507	83	seq2	468	99	35M	=	637	204	AAGGAAATCCCATCAGAATAACAATGGGCTTCTCA	<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:78:1314:1275	147	seq2	469	99	35M	=	277	-227	AGGAAATCCCATCAGAATAACAATGGGCTTCTCAG	<<<<<<<<6:<<<<<<<<<<<<<<<<<<<<<<<1<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:181:392:500	147	seq2	470	99	35M	=	299	-206	GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC	/5<<;(88<<<;<;<<6<<<<<7<<<<<<<7<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:133:8:379	147	seq2	470	99	35M	=	653	218	GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC	<<<<<<<<<<<<<<<<<<<<<<<<8;<<8<<<:6<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:198:929:684	147	seq2	471	99	35M	=	624	188	GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA	<7<<<<;<<<<<<<<<<<<;<<<<<:<<<<::<:7	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:181:582:435	83	seq2	471	99	35M	=	629	193	GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;::	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:214:784:690	83	seq2	472	99	35M	=	657	220	AAATCCCATCAGAATAACAATGGGCTTCTCAGCGG	<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<4<44	MF:i:18	Aq:i:30	NM:i:1	UQ:i:19	H0:i:1	H1:i:0
+EAS114_39:3:11:1238:1728	83	seq2	475	99	35M	=	310	-200	TCCCATCAGAATAACAATGGGCTTCTCAGCGGAAA	:677<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS112_34:4:12:273:89	147	seq2	477	99	35M	=	631	189	CCATCAGAATAACAATGGGCTTCTCAGCGGAAACC	==========<====:=========+===4414;;	MF:i:18	Aq:i:71	NM:i:1	UQ:i:28	H0:i:1	H1:i:0
+EAS56_63:2:119:161:322	147	seq2	479	99	35M	=	297	-217	ATCAGAATAACAATGGGCTTCTCAGCAGAAACCTT	<83<;<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_30:2:111:142:21	83	seq2	479	99	35M	=	304	-210	ATCAGAATAACAATGGGCTTCACAGCGGAAACCTT	;88<:<;;<6<;;<<<:<<<<;<<<<<<<<;<<<<	MF:i:18	Aq:i:28	NM:i:2	UQ:i:53	H0:i:0	H1:i:0
+EAS1_99:1:34:649:318	83	seq2	481	65	35M	=	328	-188	AAGAATAACAATGGGCTTCACAGCGGAACCCTTAC	)<7<<3<<<<<<+<1<;<8&<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:65	NM:i:3	UQ:i:59	H0:i:0	H1:i:0
+EAS114_30:6:214:565:337	147	seq2	481	99	35M	=	326	-190	CAGAATAACAATGGGCTTCTCAGCAGAAACCTTAC	;;<;<1<9<<<8<<<<<;<<<<<<8<<<;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:226:370:91	147	seq2	482	99	35M	=	335	-182	AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA	<':<6<;<<<;2<;<-7;;;<<<<<<<;;;<<7;<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_11:6:13:682:680	83	seq2	482	99	35M	=	685	238	AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA	<<<<<<<<<<<<<:<<<<<<<<<<;<;<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_593:2:273:348:37	147	seq2	483	99	36M	=	688	241	GAATAACAATGGGCTTCTCAGCAGAAACCTTACACG	<<<<<<<9<49<<<;<<<<*<<19<15;<</5<;.5	MF:i:18	Aq:i:41	NM:i:1	UQ:i:13	H0:i:1	H1:i:0
+EAS139_11:8:76:205:587	83	seq2	483	99	35M	=	306	-212	GAATAACAATGGGCTTCTCAGCGGAAACCTTACGA	8<<5<<<<<<<<<<<<<<<<<<<<<<<<<7<<</<	MF:i:18	Aq:i:28	NM:i:2	UQ:i:41	H0:i:0	H1:i:0
+B7_591:2:27:280:592	147	seq2	484	99	36M	=	310	-210	AATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC	<<<<<<<<<<<8<<<<<<<<7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_99:7:171:196:287	147	seq2	485	99	35M	=	658	208	ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC	<<<<<<<<<<<<<<<<<<<<<;6<<<<<<2:8<0:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:2:224:579:433	147	seq2	485	99	35M	=	662	212	ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC	<<<<<<<<<<<<<<<<<:<<<<<<<<<<<8<+8;:	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:22:490:2011	147	seq2	485	99	35M	=	307	-213	ATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC	<7<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_65:6:46:173:214	83	seq2	487	99	35M	=	308	-214	AACAATGGGCTTCTCAGCAGAAACCTTACAAGCCA	<<2<<<<<<<<<<<5<<5<7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:4	H1:i:6
+EAS1_103:4:164:79:134	83	seq2	488	99	35M	=	656	203	ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_32:2:283:577:398	147	seq2	488	99	35M	=	308	-215	ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG	;8;;&<<<;<;67<;<;<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:1	UQ:i:27	H0:i:0	H1:i:2
+EAS54_67:5:149:639:910	147	seq2	489	99	35M	=	669	215	CAATGGGCTTCTCAGCAGAAACCTTACAAGCCAGA	<<<<<<<<<<<<<<<<<<<<<<<<7<;;<<;<<;<	MF:i:18	Aq:i:42	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:250:628:423	83	seq2	489	99	36M	=	295	-230	CAATGGGCTTCTCAGCGGAAACCTTACAAGCCAGAA	+<<4;;9;;7.;7<;7<;<<<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_108:1:242:419:512	147	seq2	490	94	35M	=	672	217	AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA	<<8<<<<<<<<<<<<<<<<<<<<<<<<;<8<(<30	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_45:1:95:1530:28	83	seq2	490	74	35M	=	332	-193	AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA	77741(9;;994;5;;4;;1;;;;;1;<;<<<<;<	MF:i:18	Aq:i:9	NM:i:0	UQ:i:0	H0:i:42	H1:i:45
+EAS192_3:6:326:887:180	147	seq2	492	73	35M	=	672	215	TGGGCTTCTCAGCAGAAACCTTACAAGCCAGAAGC	;<<<<<;<<<<<<<<<8<<<<<<<<<<<<0<;;<+	MF:i:18	Aq:i:0	NM:i:1	UQ:i:25	H0:i:3	H1:i:7
+EAS1_99:1:86:871:319	83	seq2	494	71	35M	=	651	192	GGCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGA	<<<<<:<<<:<:<<<<<<<<<<<<8<<:<1;<::)	MF:i:18	Aq:i:0	NM:i:1	UQ:i:25	H0:i:0	H1:i:4
+EAS56_57:1:189:130:136	147	seq2	494	79	35M	=	314	-215	GGCTTCTCAGCAGAAACCTTACAAGCCAGAAGAGA	823;23<7<57<7<<<<<;<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:63	H1:i:85
+EAS51_64:7:140:752:822	83	seq2	495	76	35M	=	667	207	GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT	<<<<<<<<<<<<<<<<<7<<<<<<<<<<<<<;<:;	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:0	H1:i:5
+EAS56_57:5:53:544:889	147	seq2	495	76	35M	=	335	-195	GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT	,<;<<<;<<<<<<<<<:;;<<<<<;;<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:2	H1:i:32
+EAS54_65:4:61:346:384	83	seq2	496	68	35M	=	324	-207	CAACTAAGAAGAAACCTTACAAGCCAGAAGAGATT	7&$+&,<<+;;<;;<<6<<8<<<;<<;<<<<<<<<	MF:i:18	Aq:i:0	NM:i:3	UQ:i:19	H0:i:1	H1:i:53
+EAS54_81:8:177:800:714	83	seq2	497	76	35M	=	324	-208	TTCTCAGCAGAAACCTTACAAGCCAGAAGAGATTG	=;3=+=<:=<========8================	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:29	H1:i:85
+B7_597:6:20:592:496	83	seq2	498	75	35M	=	338	-195	TCTCAGCGGAAACCTTACAAGCCAGAAGAGATTGG	97<7;<;<;<<<<;<9<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:5	H1:i:48
+B7_591:5:243:557:560	83	seq2	499	75	36M	=	331	-204	CTAAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT	69&<;&<&<<;6.<<<+<<<;;<<<<<<<<;<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:1	H1:i:9
+EAS188_7:5:163:982:695	147	seq2	499	77	35M	=	339	-195	CTCAGCAGAAACCTTACAAGCCAGAAGAGATTGGA	<:<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:7	H1:i:42
+EAS139_19:1:1:1598:843	83	seq2	500	99	40M	=	347	-193	TCAGCGGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT	1)::6::<<;<98<<<<<<9<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:1	UQ:i:25	H0:i:1	H1:i:0
+EAS139_19:6:78:1029:512	147	seq2	500	99	40M	=	656	196	TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT	<0:;<<<<<<<<<:<<:;<<<;<7<<;<7;;;:6;::672	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:14:1872:1521	83	seq2	500	62	35M	=	339	-196	TCATCAAAAACCTTACAAGCCAGAAGAGATTGGAT	/1<%73&7<1<3577,<<<7/733<<<<<<<<1<<	MF:i:18	Aq:i:2	NM:i:2	UQ:i:9	H0:i:1	H1:i:8
+EAS221_3:6:51:1486:1131	147	seq2	500	77	35M	=	685	220	TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT	<<<<<<<<<;<<<<<<<<<1<5<<8<<<'<;<<;1	MF:i:18	Aq:i:3	NM:i:0	UQ:i:0	H0:i:22	H1:i:22
+EAS192_3:6:45:183:25	147	seq2	501	95	35M	=	672	206	CAGCGGAAACCTTACAAGCCAGAAGAGATTGGATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<86;<;:;	MF:i:18	Aq:i:23	NM:i:1	UQ:i:27	H0:i:0	H1:i:2
+B7_597:4:38:999:463	147	seq2	503	39	35M	=	317	-221	GCGGAAACCTTACAAGCCAGAAGAGATTGGATCTA	.*:&<<0<0!<<+<<<<<<<<<<<<<0<<<<<<<<	MF:i:18	Aq:i:39	NM:i:2	UQ:i:25	H0:i:0	H1:i:1
+EAS114_45:1:30:1882:1210	147	seq2	503	82	35M	=	665	197	GCAGAAACCTTACAAGCCAGAAGAGATTGGATCTA	;;::;;;;:;;;;;:;;;;;;9;;:7;;8:77777	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_108:6:222:579:961	147	seq2	504	99	35M	=	679	210	CAGAAACCTTACAAGCCAGAAGAGATTGGATCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<7<<:7;;;68	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:92:875:345	147	seq2	504	99	35M	=	690	221	CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_63:8:62:125:888	83	seq2	504	99	35M	=	347	-192	CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA	,;3<<<8;;3<,<<<8;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS221_1:2:23:127:880	83	seq2	504	99	35M	=	686	217	CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA	<<<<<<<<<<<<<<<<<<<;;<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS51_66:8:43:972:506	147	seq2	505	99	35M	=	686	216	AGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT	<;<<<<<<<<<<<<6;<;<<<<<<<<<<:;;<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:183:697:555	83	seq2	505	84	35M	=	341	-199	AGAAATCTTAGAAGCCAGAAGAGATTGGATCTAAT	<<<;&,.;);&96<84<<81<<&<<<9<<8<8<<1	MF:i:18	Aq:i:37	NM:i:2	UQ:i:16	H0:i:0	H1:i:1
+EAS221_3:8:65:463:703	83	seq2	506	99	35M	=	693	222	GAAACCTTACAAGCCAGAAGAGATTGGATCTAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:7:101:752:996	147	seq2	508	99	35M	=	687	214	AACCTTACAAGCCAGAAGAGATTGGATCTAATTTT	<<<<<<<<<<<<<<<;<<<<<9<<<<<<;<<;;;;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:267:953:459	83	seq2	509	99	35M	=	667	193	ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT	<<<<<<<<<9<<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:33:1240:846	83	seq2	509	99	35M	=	685	211	ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT	<<<<<<<<<<<<7<<2<;<<;<<<;<<<:6:<<<:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:135:401:735	83	seq2	510	99	35M	=	703	228	CCTTACAAGCCAGAAGAGATTGGATCTAATTTTTG	<<<<<<<<<<<<<<<<<<<<<;<<<<<8<<<<<<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:3:186:68	83	seq2	512	99	35M	=	687	210	TTACAAGCCAGAAGAGATTGGATCTAATTTTTGTA	<<<<<<<<<<<<;<<<<<<<<<<<<;;<<<<<&%8	MF:i:18	Aq:i:71	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_78:7:164:727:977	147	seq2	513	99	35M	=	689	211	TACAAGCCAGAAGAGATTGGATCTAATTTTTCGAC	<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;;79;	MF:i:18	Aq:i:75	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+B7_589:1:110:543:934	147	seq2	514	99	35M	=	700	221	ACAAGCCAGAAGAGATTGGATCTAATTTTTGGACT	<<<<<<<<<<<<;<<<<<;;<<<;;<<<<<,,;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:329:339:408	147	seq2	515	99	36M	=	325	-226	CAATCCAGAAGAGATTGGATCTAATTTTTGGACTTC	7<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:1	UQ:i:27	H0:i:1	H1:i:0
+EAS56_59:5:325:544:349	147	seq2	515	99	35M	=	716	236	CAAGCCAGAAGAGATTGGATCTAATTTTTGGACTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6;;;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:3:903:957	83	seq2	516	99	35M	=	661	180	AAGCCAGAAGAGATTGGATCTAATTTTTGGACTTC	<<<<<<<<<<<<<<<<;;<;<;<<<<<<66<;<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:85:361:418	147	seq2	517	99	36M	=	353	-200	AGCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT	;;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:138:186:459	83	seq2	518	97	35M	=	360	-193	GCCAGAAGAGATTGGAGCTAATTTTTGGACTTCTT	+/2/;<:<&7:7</<2&<<<&<<<<<<<<<8<<:3	MF:i:18	Aq:i:37	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS139_11:4:36:1184:994	83	seq2	518	99	35M	=	358	-195	GCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT	<84<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:270:430:269	83	seq2	519	99	36M	=	331	-224	CCAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA	28<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:295:882:282	147	seq2	520	99	35M	=	691	206	CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA	========================<6<======8;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:41:739:907	83	seq2	520	99	35M	=	344	-211	CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA	;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:272:240:950	147	seq2	520	97	35M	=	696	211	CAGCAGAGCTTGGATCTAATTTTTGGACTTCTTCA	6<<&:<<<&<::;&7<<<3<;<<;<:;:<8:<<(<	MF:i:18	Aq:i:25	NM:i:3	UQ:i:17	H0:i:0	H1:i:0
+EAS54_65:7:155:629:357	83	seq2	521	99	35M	=	333	-223	AGAAGAGATTGGATCTAATTTTTGGACTTCTTAAA	<<<<<<<<;<<<<<<<<<<<<6<<<<<<<<<;<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:14:88:306	147	seq2	521	99	35M	=	341	-215	AGAAGAGATTAGATCTAATTTTTGGACTTCTTAAA	<1;<;<;<4<&<<<:<<<:<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS1_108:5:115:193:231	147	seq2	522	99	35M	=	684	197	GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG	<<<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6<7	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:88:1454:418	83	seq2	522	99	35M	=	349	-208	GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG	<<<<<<<<<<6<96<<<1911<<<1<<<<<<<<<1	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:36:649:554	83	seq2	523	99	35M	=	350	-208	AAGAGATTGGATCTAATTTTTGGACTTCTTAAAGA	<<<<<888;<<<;<<<;<;<8<<<<8<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:119:651:88	83	seq2	527	99	35M	=	337	-225	GATTGGATCTAATTTTTGGACTTCTTAAAGAAAAA	<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:57:826:977	147	seq2	528	99	35M	=	693	200	ATTGGATCTAATTTTTGGACTTCTTAAAGAAAAAA	<<<<<<<<<<<<<<<<+<<<<<<<<6<9:6<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:285:417:147	83	seq2	529	99	35M	=	712	218	TTGGATCTAATTTTTGGACTTCTTAAAGAAAAAAA	<<<<<<<<<<<<<<<;8<<<<<<<<<;6<:<;<<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:160:130:351	83	seq2	530	99	35M	=	697	202	TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA	<<<<<<<<<<<<<<<;<<<<4<<<<<;<<<:<<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:287:665:495	147	seq2	530	99	35M	=	702	207	TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA	==========================98====8=8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:71:187:824	147	seq2	534	99	35M	=	367	-202	TCTAATTTTTGGACTTCTTAAAGAAAAAAAAACCT	0040;<7<<<<0<7<<<;<7*<<<<<7<<771<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:70:445:1289	83	seq2	535	99	35M	=	702	202	CTAATTTTTGGACTTCTTAAAGAAAAAAAAACCTG	<<<<<<<<<<2<<<<<<<<<<:<<<<<<<;;;;<:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:41:745:603	83	seq2	536	99	35M	=	360	-211	TAATTTTTGGACTTCTTAAAGAAAAAAAAACCTGT	;<<;;<;<8<<<<<<<<<<<;<<;<<<<<<<<<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:197:759:975	147	seq2	537	99	35M	=	698	196	AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<;	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:140:253:322	83	seq2	537	99	35M	=	689	187	AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC	<<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:58:684:520	147	seq2	538	99	35M	=	367	-206	ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA	<85;;:<<<7<<7<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:19:306:982	147	seq2	538	99	35M	=	368	-205	ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA	<<<<<<<<<9<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:273:562:954	83	seq2	539	99	35M	=	722	218	TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:78:775:555	83	seq2	539	99	35M	=	691	187	TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA	6:<<<<:<<<<6:<<)::8<6<<:<<)<::63832	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:49:330:699	147	seq2	540	99	35M	=	722	217	TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAA	==;=================;======5;;;==5=	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:329:437:643	147	seq2	540	99	36M	=	354	-222	TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC	885<8;;<;3,8<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:125:884:276	83	seq2	541	99	35M	=	362	-214	TTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC	,;;3,<7<;7<<===;============;======	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:315:201:673	83	seq2	542	45	36M	=	381	-197	TTGGACTTATTAAAGAAAAAAAAACCTGTCAAACAC	;;;;<-;;&;;<<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_597:3:10:394:392	147	seq2	542	99	35M	=	376	-201	TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA	28-:;0-<0<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:228:736:747	83	seq2	542	68	35M	=	381	-196	TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA	<07<<&<;+<<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:267:394:437	147	seq2	544	99	35M	=	735	226	GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACG	<<<<<<<<<<;<;<<<<<;;<<<<<;<<:;8<;<8	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:66:1381:181	83	seq2	544	99	40M	=	362	-222	GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT	;;;+;;&<7<<<+<<<<<<<;<;8<<<;<<<<8<<<;<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:74:668:424	83	seq2	545	99	40M	=	707	202	GACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:322:350:374	83	seq2	546	99	35M	=	360	-221	ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA	<+;8&84<<<:<<<<<<<<<<;<<<<<<<;<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:307:208:477	147	seq2	546	99	35M	=	710	199	ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA	<<<<<<<;<<;<<<<<<<<<<<<<<<<;:<<<88;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:228:915:631	83	seq2	547	66	35M	=	381	-201	ATTATTAAAGAAAAAAAAACCTGTCAAACACGAAT	&-))-*===/=========9====4==========	MF:i:18	Aq:i:0	NM:i:2	UQ:i:13	H0:i:1	H1:i:0
+EAS1_93:5:246:177:525	83	seq2	549	98	35M	=	738	224	TCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT	<<<<<<<<<<<<<<<<<<<<<1<<<<<<;;;<8;;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:93:634:323	83	seq2	550	99	35M	=	721	206	CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT	<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<,<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:8:165:441:708	147	seq2	550	99	35M	=	737	222	CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT	=<===============================99	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:5:191:885:623	83	seq2	551	99	35M	=	363	-223	TTAAAGAAAAAAAAACCTGTCAAACACGAATGTTA	66<<<<<<<<<<<<<2<<<<9<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:127:828:697	147	seq2	552	99	35M	=	346	-241	TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT	;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:115:249:673	147	seq2	552	99	35M	=	743	226	TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<6<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:263:689:572	147	seq2	553	68	35M	=	381	-207	AAAGAAAAAAAAACCTGTCAAACACGAATGTTATG	<9<2<<<<<<<<<22;;02<<<9<<;9<9<<;<<3	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:99:1632:76	83	seq2	553	99	40M	=	705	192	AAAGAAAAAAAACCCTGTCAAACACGAATGTTATGCCCTG	<<<<<<<<<<<<*<<<<8<9<<<<<<<<<9;;;;<18:;:	MF:i:18	Aq:i:47	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+EAS54_71:7:250:698:842	147	seq2	554	99	35M	=	753	233	AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<24	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:41:314:1173	83	seq2	554	99	35M	=	718	199	AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC	<;<<<<<<<;;<<<<<-<<<;;;<;8<*;;<<<<'	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:189:831:878	83	seq2	555	99	35M	=	351	-239	AGAAAAAAAAACCTGTCAAACACGAATGTTATGCC	<9<<<<<<<<<<;9<:<<<<<6<<<<<<<;<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:216:47:302	83	seq2	557	99	35M	=	729	207	AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT	<<<<<<<<<<<7<<<<<<<<<<<<+<<<<<//6;<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:28:538:148	83	seq2	557	99	35M	=	376	-216	AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT	<<<<<<<<<<7;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:284:597:682	147	seq2	557	99	35M	=	375	-217	AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT	<<<<<<<<9;;7<;:<<<:<;<<<<<<<<;<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:11:1261:1200	83	seq2	558	99	35M	=	362	-231	AAAAAAAACCTGTCAAACACGAATGTTATGCCCTG	<<<<<<<:<<6<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:246:711:981	147	seq2	559	99	35M	=	371	-223	AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC	;;:;7<<:5:<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:1:208:971:600	83	seq2	559	99	35M	=	382	-212	AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC	<<<<<<<3*+<4/<<<<7<<<<0<<:<8<<<<0<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:219:174:684	83	seq2	560	71	35M	=	390	-205	AAAAAAACTGTCAAACACGAATGTTATGCCCTGCT	<<<<:;+9<<<;<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS51_66:7:4:234:610	147	seq2	560	84	35M	=	729	204	AAAAAACCTGTCAAACACGAATGTTATGCCCTCCT	<<<<<<<<7;<<<;7<7;7;7<;-<-<&<<<0%06	MF:i:18	Aq:i:22	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS54_73:5:271:874:367	83	seq2	560	99	35M	=	384	-211	AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT	<<<<<<5;<<<:<<<;<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:2:168:1878	83	seq2	560	37	35M	=	743	218	AAAAAACCTGGCAAACACGAATGTTATGACATGTN	;<:;;<:<;<;<;;;;:;<;:::&9:&:68&6&*!	MF:i:18	Aq:i:37	NM:i:5	UQ:i:61	H0:i:0	H1:i:1
+EAS221_1:6:89:1164:573	147	seq2	560	99	35M	=	371	-224	AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT	3<<<6<%7<<08<<4<3<<103<1<<<<<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:53:783:78	147	seq2	561	99	35M	=	363	-233	AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA	<;;;;<<0<,<<<<<<<<<;<<<;<;<<<<;<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:30:570:902	147	seq2	561	99	35M	=	730	204	AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA	<<<<<<<<<<<;4<<:<<44<<<<<<<<<<<4<<+	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:7:1864:1569	147	seq2	561	99	35M	=	382	-214	AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:89:942:84	147	seq2	562	74	35M	=	759	232	AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:122:589:134	83	seq2	562	99	35M	=	369	-228	AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA	;<;4<<538<<;<<;<<<<';,:<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:77:1529:522	83	seq2	562	99	35M	=	722	195	AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA	<<;<<<<<<<<<<<4<<4<;;:;2:7<<<2*<;;8	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:48:805:860	83	seq2	563	78	35M	=	755	227	AAACCTGTCAAACACGAATGTTATGCCCTGCTAAA	<<<<<<<;<<<<<<<41;<<8<<<<<<<8+<4,+;	MF:i:18	Aq:i:13	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:144:492:61	83	seq2	564	99	35M	=	728	199	AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC	<<<;<<<<<<<<<<<;<<<<<<7:<<<<::;9;;6	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:3:303:970:243	83	seq2	564	99	35M	=	370	-229	AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC	<<0+<<<,<4<:<:<<<<<<<<<<<::<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:78:806:800	147	seq2	564	99	40M	=	717	193	AACCTGTCAAACACGAATGTTATGCCCTGCTAAACTAAGC	<<<<<<<<<<<<<<<<<<<4<<:<1<0<;<9;<:78::::	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:94:1440:2016	147	seq2	564	99	35M	=	751	222	AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC	<<<<<<<<<<<<<<<<<<<;<<;;;<<:<8:::75	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:103:443:166	147	seq2	565	99	35M	=	747	217	ACCTGTCAAACACGAATGTTATGCCCTGCTAAACT	<<<<<<<<<<<<<<<<<<<<;<<<<<<<1<-;;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:24:284:360	83	seq2	567	76	35M	=	390	-212	CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA	:;<;:<<<;<<<<<<<<<<<<<<<<<;;<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:166:626:836	147	seq2	567	99	35M	=	757	225	CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA	<<<<<<<<<<<<<<<<<<<<9<<<<<<<<;<;;;9	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:110:840:431	83	seq2	567	93	35M	=	388	-214	CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA	77<;7<<<<<<<<<4<<<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:116:738:142	83	seq2	568	99	35M	=	722	189	TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG	<<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<:;2	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:55:932:613	83	seq2	568	77	35M	=	389	-214	TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:137:139:248	83	seq2	569	97	35M	=	401	-203	GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC	;;;99<<<;<;;<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:34:1614:558	147	seq2	569	99	35M	=	411	-193	GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC	<<9<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:15:696:693	83	seq2	570	10	35M	=	403	-202	TCAAACACGAATGTTAATCCCTGCTAAACTAATCA	)6<:7<.7<6.<0&&<&3:&7<<7<0<<<<<<<<<	MF:i:18	Aq:i:10	NM:i:3	UQ:i:50	H0:i:0	H1:i:0
+EAS114_28:3:32:492:907	147	seq2	571	95	36M	=	387	-220	CAAACACGAATGTTATGCCCTGCTAAACTAAGCATC	8<;<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:1:114:19:769	83	seq2	572	90	35M	=	405	-202	AAACACGAATGTTATGCCCTGCTAAACTAAGCATC	5+;+3/6;<+;/8<8*/<7/59<97147<;;9<7<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:182:104:921	147	seq2	575	99	35M	=	378	-232	CACGAATGTTATGCCCTGCTAAACTAAGCATCATA	;<;<<<<<<:<<<<<:<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:5:996:2000	83	seq2	575	99	35M	=	408	-202	CACGAATGTTATGCCCTGCTAAACTAAGCATCATA	<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:109:199:592	83	seq2	576	72	35M	=	390	-221	ACGAATATTATGCCCTGCTAAACTAAGCATCATAA	;9<9<:&:<<<<;;<;;<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS219_1:3:90:219:528	147	seq2	576	75	35M	=	758	217	ACGAATGTTATGCCCTGCTAAACTAAGCATCATAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<9	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:94:294:387	147	seq2	578	99	35M	=	736	193	GAATGTTATGCCCTGCTAAACTAAGCATCATAAAT	<<<<<<<;<<<<<<<<<:<<<<<<<<<<<<;)7;;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:33:779:821	83	seq2	579	99	35M	=	416	-198	AATGTTATGCCCTGCTAAACTAAGCATCATAAATG	<<730<<<<9<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:43:114:617	147	seq2	579	99	35M	=	738	194	AATGTTATGCCCTGCTAAACTAAGCATCATAAATG	=============;=========;===========	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:23:944:377	83	seq2	579	75	36M	=	757	214	AATGTTATGCCCTGCTAAACTAAGCATCATAAATGA	<<<<<<<<9<<<<;<<<<<<<<<;<7<<<<;8;<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:3:864:1888	147	seq2	579	99	35M	=	411	-203	AATGTTATGCCCTGCTAAACTAAGCATCATAAATG	888588;;;;;;;;;;;;;;;;;;;;8;;;;;;;;	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:26:137:1382	147	seq2	579	99	35M	=	397	-217	AATGTTATGCCCTGCTAAACTAAGCATCATAAATG	<<-<8<<<<<<:<<<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:265:251:147	147	seq2	581	99	35M	=	754	208	TGTTATGCCCTGCTAAACTAAGCATCATAAATGAA	<<<<<<<<<<<<<<88<<<80:;<<<<<;:4;;:4	MF:i:18	Aq:i:50	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:184:912:258	147	seq2	582	99	35M	=	428	-189	GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG	<;;<<<<;:<<7<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:115:646:430	83	seq2	582	45	35M	=	768	217	GTTATGCCCTGCTAAACTTAGCATCATAAATGAAG	<7<<<<<<<<<<<<;<<<<<;<7<<<<;5;<;67<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_108:3:24:319:429	147	seq2	582	99	35M	=	740	193	GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG	<<<<<<<<<<<<<<<<;<<<<<<<<1<<-6<<</<	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:8:49:182:192	83	seq2	582	99	35M	=	750	203	GTTATGCCCTGCTAAACTGAGCATCATAAATGAAG	=====================;============<	MF:i:18	Aq:i:49	NM:i:1	UQ:i:28	H0:i:0	H1:i:1
+EAS114_45:1:100:979:1863	83	seq2	583	85	35M	=	757	209	TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG	;<;;;;;;;7;;;79;;77;9;;99;974;677-6	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:53:458:581	73	seq2	583	77	35M	=	583	0	TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:53:458:581	133	seq2	583	0	*	=	583	0	CTCAATTAATTGTTTTATAAAACCTGTGAGTTTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<99<<<<<	MF:i:-64
+B7_589:6:108:958:42	147	seq2	584	81	35M	=	755	206	TATGCCCTGCTAAACTAAGCATCATAAATGAAGGG	<<<<<<<<<<<<<<<<<<<<1<<<<<<9<<;<5<:	MF:i:18	Aq:i:9	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:89:457:591	83	seq2	585	69	35M	=	770	216	ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG	<<<<<<<<<<<4<<<<<<<<<<<<8<7/4<<<<4+	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:87:1289:83	83	seq2	585	99	35M	=	413	-207	ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG	<<<::<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:84:1505:1037	147	seq2	586	99	35M	=	409	-212	TGCCCTGCTAAACTAAGCATCATAAATGAAGGGGA	<<966<<7<<<<7<<<<9<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:197:261:624	147	seq2	587	99	35M	=	398	-224	GCCCTGCTAAACTAAGCATCATAAATGAAGGGGAA	866;2:/;<<<;:<<<;<;;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:118:41:489	147	seq2	588	76	35M	=	779	226	CCCTGCTAAACTAAGCATCATAAATGAAGGGGAAA	<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<95:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:157:361:309	83	seq2	589	99	35M	=	747	193	CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<;<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_39:6:71:644:1792	147	seq2	589	84	35M	=	754	200	CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT	<<<<<<<;<<<<<<<<<<;<<<<<<<<<;<;:<:<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_589:2:9:49:661	147	seq2	591	99	35M	=	747	191	TGCTAAACTAAGCATCATAAATGAAGCGGAAATAA	<<<<<<<<<<<<<<<<;<<<<<<;:<<;;;7<9;9	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_71:2:85:686:696	83	seq2	594	99	34M	=	435	-193	TAAACTAAGCATCATAAATGAAGTGGAAATAAAG	:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS188_7:1:177:522:118	69	seq2	594	0	*	=	594	0	TCTCAATTAATTGTTTTATAAAACCTGTGAGTTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<57<<<<	MF:i:-64
+EAS188_7:1:177:522:118	137	seq2	594	49	35M	=	594	0	TAAACTAAGCATCATAAATGAAGGGGAAATAAAGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:103:870:105	83	seq2	595	44	35M	=	778	214	AAACTAAGCATCATAAATGAAGGGGAAATAAAGTC	<<<<<<<<<<<<<<<<<<<<<<<<8<<<<<;<<7;	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS51_62:8:52:967:804	73	seq2	596	76	35M	=	596	0	AACTAAGCATCATAAATGAAGGGGAAATAAAGTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:8:52:967:804	133	seq2	596	0	*	=	596	0	TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT	===============<=======<<===<======	MF:i:-64
+EAS1_108:6:95:235:746	83	seq2	598	99	35M	=	430	-203	CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG	==&=;===7=3===8======;=;8===8=====;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:124:253:889	83	seq2	598	99	35M	=	437	-196	CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG	8<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:174:650:125	83	seq2	600	76	35M	=	770	201	AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:39:348:594	83	seq2	600	99	35M	=	431	-204	AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC	<<;;<;:<;<<<;<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:92:693:228	83	seq2	601	75	35M	=	770	200	AGCATCATAAATGAAGGGGAAATAAAGTCAAGTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;9<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:285:349:797	147	seq2	604	76	35M	=	773	200	ATCATAAATGAAGGGGAAATAAAGTCAAGTCTTTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:3:82:13:897	83	seq2	606	99	35M	=	453	-188	CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT	,<2<;<<;<<<<;;;<<;<<<<<<<;;;;<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:310:155:312	83	seq2	606	99	35M	=	438	-203	CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT	2;<<;<<;<<;;/<<<<<<;<<<<8<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:45:178:1321	147	seq2	606	77	35M	=	771	196	CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:193:420:78	83	seq2	607	99	35M	=	787	215	ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:131:518:588	83	seq2	607	99	35M	=	433	-209	ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG	<.<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:45:800:733	83	seq2	607	99	35M	=	413	-229	ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG	<7<<7&<<9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:34	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:70:766:2016	83	seq2	607	99	35M	=	422	-220	ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:2:1217:398	147	seq2	608	99	40M	=	780	212	TAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC	<<<<<<<<<<<<<;<<<<<<<7<<<3<<<<;<<<<9:7::	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:73:1458:1337	147	seq2	609	99	35M	=	806	232	AAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGAC	<<<<<;;;<<<<<<<<<<<<<<<<<<<;<<7;;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:104:402:732	83	seq2	610	99	35M	=	434	-211	AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:37:611:267	147	seq2	610	99	35M	=	464	-181	AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA	<<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:78:692:671	147	seq2	610	99	35M	=	438	-207	AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA	<<);<<;;<<<<<;<<<<<<<<<<<<<6<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:144:242:602	83	seq2	611	99	36M	=	436	-211	ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:6:1243:981	69	seq2	611	0	*	=	611	0	TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT	<<<<8<<8<<<<2<<<<<<<<8<55<<8*<<8<<<	MF:i:-64
+EAS219_FC30151:5:6:1243:981	137	seq2	611	68	35M	=	611	0	ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAA	<;<;;<<<;3;;3<<<;<<;<7%<<<.1<<<..<3	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:291:404:199	147	seq2	612	76	36M	=	777	197	TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:266:994:429	83	seq2	612	76	35M	=	769	188	TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG	=====================9=======4===:=	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:7:159:253:353	147	seq2	613	67	35M	=	778	196	GAAGGGGAAATAAAGTCAAGTCTTTCCTGACAGGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<0,%4(+,	MF:i:18	Aq:i:67	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS1_108:5:175:149:296	147	seq2	614	99	35M	=	811	232	AAGGGGAAATAAAGTCAAGCCTTTCCTGACAAGCA	<<<<<<<<<<<<<<<<<<<49<<<<<<<<<<<<;4	MF:i:18	Aq:i:45	NM:i:1	UQ:i:19	H0:i:0	H1:i:1
+EAS56_65:1:23:536:229	147	seq2	614	99	35M	=	448	-201	AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA	<<99<<<<<;<<<;2<<<<<<;<<<9<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:100:20:1199	83	seq2	614	99	35M	=	456	-193	AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA	:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:181:713:140	83	seq2	615	84	35M	=	793	213	AGGGGAAATAAAGTCAAGTATTTCCTGACAAGCAA	<7<<<<<<<<<<<<7<7<6+<<<5;<;<2<;;+;;	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS139_19:6:82:1051:921	147	seq2	616	99	40M	=	800	224	GGGGAAATAAAGTCAAGGCTTTCCTGACAAGCAAATGCTA	<<<<<9<799<<<<7::/<<<9<7:9:;2:7552+9''66	MF:i:18	Aq:i:41	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS192_3:3:309:187:267	147	seq2	616	99	35M	=	786	205	GGGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAA	<<<<<<<<<<<<<<<<<<<<<<<;<;<;<;68;;8	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:115:649:259	83	seq2	617	99	36M	=	782	201	GGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;<<9	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:261:267:597	147	seq2	617	86	35M	=	787	205	GGGTAATAAAGTCAAGTCTTTCCTGACAAGCAAAT	<<<<<<<<<;<<<<<7<<<<<<<<<:7<7<;44:;	MF:i:18	Aq:i:41	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_26:4:123:1001:580	147	seq2	617	43	35M	=	771	185	GGGAANTAAAGTCAAGTCTTTCCTGACAAGCAAAT	=====!=====================1.8131*=	MF:i:18	Aq:i:43	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS139_11:7:60:163:1612	83	seq2	617	99	35M	=	439	-213	GGGAACTAAAGTCAAGTCTTTCCTGACAAGCAAAT	-<<<<)<<<<<<<<<<<<<<<<<<<<<8<<<<<<<	MF:i:18	Aq:i:59	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS54_65:4:325:795:213	147	seq2	618	99	35M	=	790	207	GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG	<<<<<<<;<<<<;;<<<<<<<<<<<<;:<</;/;;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:165:665:220	147	seq2	618	76	35M	=	779	196	GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG	<<<<<<<<<<<<<<<<<<<<<;<;;<<<;;<;<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:22:206:150	147	seq2	619	99	35M	=	792	208	GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC	==========================::=5&;<2<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:237:497:165	147	seq2	619	99	35M	=	454	-200	GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC	9=:=======2=27======<>&<=,==4>4=>>=	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:82:1540:77	147	seq2	619	99	35M	=	786	202	GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<:8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:172:196:746	147	seq2	620	99	35M	=	451	-204	AAATAAAGTCAAGTCTTTCCTGACAAGCAAATGCT	<<<;><<+<<<<:<<<<2<;<<<;<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:97:892:419	147	seq2	621	99	35M	=	800	214	AATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:312:915:751	147	seq2	621	99	35M	=	461	-195	AATAAAGTCAAGTCTTTCCTGACAAGCAAAAGCTA	<:-<<<99:::);:7<4;8<<<<<<<;<2<+8<;<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS1_93:4:325:352:67	147	seq2	622	99	35M	=	794	207	ATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAA	==================<========<=<;-===	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:83:731:540	83	seq2	623	99	35M	=	804	216	TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG	<<<<<<<<<;<<<<<<<<<<<<<:<7<*;&;<;;9	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:74:329:459	147	seq2	623	99	35M	=	795	207	TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG	<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9;599	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:13:674:1717	83	seq2	623	99	35M	=	445	-213	TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:141:415:738	69	seq2	624	0	*	=	624	0	TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT	<<<<<<<<<<<<<<<<<<<<<<<;<<<<<;<8<<<	MF:i:-64
+EAS1_105:1:141:415:738	137	seq2	624	76	35M	=	624	0	AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA	<<<<<<<<<<<<<<<<<<<<<<:<<;<<;<<<<6:	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:154:118:488	83	seq2	624	99	35M	=	447	-212	AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA	<<<;58<<95:<<;<;<<<;<<<;;<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:198:929:684	83	seq2	624	99	35M	=	471	-188	AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA	<<;<<<<<:<<<<<<<<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:215:246:640	147	seq2	624	99	36M	=	447	-213	AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT	;<<,<<<96<<:<:<9<6<97<<<<<9<<<<9<<9<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:234:167:381	83	seq2	625	99	35M	=	443	-217	AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT	<<;<;<<<<;<<<<7<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:96:489:453	147	seq2	625	99	35M	=	445	-215	AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT	;<;;;<<<<5:<<:<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:3:79:879:15	83	seq2	626	99	35M	=	790	199	AGTCAAGTCTTTCCTGACAAGCAAATGCTAAGATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<;<<1<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:2:59:286:290	147	seq2	628	99	35M	=	467	-196	TCAAGTCTTTCCTGACAAGCAAATGCTAAGATAAT	77<<<<7<<<97<<,7<<<;<<<;<9<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:5:263:511:936	83	seq2	629	99	35M	=	801	207	CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT	<<<<<<<<<<<<<<<<<;<<<<<;<<:<:<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:181:582:435	147	seq2	629	99	35M	=	471	-193	CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT	<<<<<<<<;<<<<<;<<4<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:107:636:642	83	seq2	630	99	35M	=	458	-207	AAGTCTTTCCTGACAAGCAAATGCTAAGATAATTC	<<<<<<<;<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:12:273:89	83	seq2	631	99	35M	=	477	-189	AGTCTTTCCTGACAAGCAAATGCTAAGATAATTCA	<:737<288<<<7<<<<<<<<<:9<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:239:1001:406	147	seq2	634	99	35M	=	450	-219	CTTTCCTGACAAGCAAATGCTAAGATAATTCATCA	0':.71;;:9==9=;====;=;=============	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:96:899:106	147	seq2	636	99	35M	=	462	-209	TTCCTGACAAGCAAATGCTAAGATAATTCATCATC	;;;;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:67:56:806	147	seq2	637	99	35M	=	464	-208	TCCTGACAAGCAAATGCTAAGATAATTCATCATCA	844:8;7<88;8<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:71:408:741	83	seq2	637	99	35M	=	457	-215	TCCTGACAAGCAAATGCTAAGATAATTCATCATCA	;7;<;<0<<<<<<<<:;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:6:180:695:621	147	seq2	637	99	35M	=	453	-219	TACTGAAAAGCAAATGCTAAGATAATTCATCATCA	;&377<&<<;7<<<<<7<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:2	UQ:i:10	H0:i:1	H1:i:0
+EAS114_30:6:49:656:507	147	seq2	637	99	35M	=	468	-204	TCCTGACAAGCAAATGCTAAGATAATTCATCATCA	%44;;<:<<;<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:4:854:140	147	seq2	638	72	35M	=	458	-215	CCTGACAAGCAAATGCTAAGATAATTCATCATCAC	:9':<;<<<;<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:85:1521:58	83	seq2	639	99	40M	=	813	214	CTGACAAGCAAATGCTAAGATAATTCATCATCACTAAACC	<<<<<<<<9<<<<<<<<<<<<<7<<<<<<<<<<<<;;:7:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:57:1064:925	137	seq2	640	76	35M	*	0	0	TGACAAGCAAATGCTAAGATAATTCATCATCACTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<	MF:i:32	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:323:196:855	147	seq2	642	99	35M	=	809	202	ACAAGCAAATGCTAAGATAATTCATCATCACTAAA	<<<<<<<7<<<<<<:<<<<<<<<<<<<<<<<<;7:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:117:33:262	147	seq2	642	99	35M	=	814	207	ACAAGCAAATGCTAAGATAATTCATCATCACTAAA	<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:59:742:549	83	seq2	642	99	35M	=	816	209	ACAAGCAAATGCTAAGATAATTCATCATCACTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:55:562:403	147	seq2	643	99	36M	=	825	218	CAAGCAAATGCTAAGATAATTCATCATCACTAAACC	<<<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<;<;:	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:97:743:602	147	seq2	644	99	35M	=	821	211	AAGCAAATGCTAAGATAATTCATCATCACTAAACC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<:	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:167:905:852	83	seq2	647	99	36M	=	445	-238	CAAATGCTAAGATAATTCATCATCACTAAACCAGTC	+<<<9;7;<<+<<<<<39<;9<;9<<7<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:130:865:838	83	seq2	649	99	35M	=	448	-236	AATGCTAAGATAATTCATCATCACTAAACCAGTCC	;<:84<<<4<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:60:1420:660	147	seq2	649	99	35M	=	808	194	AATGCTAAGATAATTCATCATCACTAAACCAGTCC	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:180:89:582	83	seq2	650	99	36M	=	809	195	ATGCTAAGATAATTCATCATCACTAAACCAGTCCTA	<<<<<<<<<7<<<<<<<<<7<<<:<<<:<<::77:<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:86:871:319	147	seq2	651	71	35M	=	494	-192	TGCTAAGATAATTCATCATCACTAAACCAGTCCTA	7;+1;<:<<<<<<<<;<<;<<9<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:236:841:20	83	seq2	652	99	35M	=	467	-220	GCTAAGATAATTCATCATCACTAAACCAGTCCTAT	7;<<<;<<<<;;<<<<<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:133:8:379	83	seq2	653	99	35M	=	470	-218	ATAAGATAATTCATCATCACTAAACCAGTCCTATA	&=========='==7==0=2====28===00====	MF:i:18	Aq:i:70	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_105:8:96:720:940	83	seq2	654	99	35M	=	467	-222	TAAGATAATTCATCATCACTAAACCAGTCCTATAA	*<<<<;<<<9<<;,<;0<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:71:994:576	83	seq2	655	99	35M	=	805	185	AAGATAATTCATCATCACTAAACCAGTCCTATAAG	<<<<<<<<<<<<<<<<<<<<<<<;<<5<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:164:79:134	147	seq2	656	99	35M	=	488	-203	AGATAATTCATCATCACTAAACCAGTCCTATAAGA	<;<;<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:78:1029:512	83	seq2	656	99	40M	=	500	-196	AGATAATTCATCATCACTAAACCAGTCCTATAAGAAATGC	;;;;;<;;<<<.<<6;<<;<;8<<<<::<<<<<<<<;<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:214:784:690	147	seq2	657	99	35M	=	472	-220	GATAATTCATCATCACTAAACCAGTCCTATAAGAA	-<7<<7<:<<2<<<<;<<<<<;<<<<3<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS220_1:4:6:1178:1105	83	seq2	657	93	35M	=	830	208	GATAATTCATCATCACTAAACCAGTCCTATAAGAA	<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:171:196:287	83	seq2	658	99	35M	=	485	-208	ATAATTCATCATCACTAAACCAGTCCTATAAGAAA	<;;;98;<;&<;;<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:220:801:282	83	seq2	660	99	36M	=	837	213	AATTCATCATCACTAAACCAGTCCTATAAGAAATGC	<<<<<<<<<<<<<<<<<<<<<;<+<;<<<<<::<<:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS221_1:2:73:955:728	147	seq2	660	44	35M	=	823	198	AATTCATCATCACTAAACCAGTCCTATAAGAAATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:14	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS1_105:1:3:903:957	147	seq2	661	99	35M	=	516	-180	ATTCATCATCACTAAACCAGTCCTATAAGAAATGC	<%12<&<<<;<:<<<<<<<<<7<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_65:2:224:579:433	83	seq2	662	99	35M	=	485	-212	TTCATCATCACTAAACCAGTCCTATAAGAAATGCT	'<08/8<+<</<<:<<<<<8<<9<38<<<<<<<<;	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:209:824:866	147	seq2	665	73	35M	=	828	198	ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:30:1882:1210	83	seq2	665	82	35M	=	503	-197	ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA	776778;5;;;;8;;7:8;;;;;;;<<<;;;;;<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:181:476:394	147	seq2	666	99	35M	=	847	216	TCATCACTAAACCAGTCCTATAAGAAATGCTCAAA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<:<<<:;;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:267:953:459	147	seq2	667	99	35M	=	509	-193	CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA	%<07<94========<<==================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:140:752:822	147	seq2	667	76	35M	=	495	-207	CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA	;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:322:391:742	83	seq2	667	99	35M	=	847	215	CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:149:639:910	83	seq2	669	99	35M	=	489	-215	TCACTAAACCAGTCCTATAAGAAATGCTCAAAAGA	<;49;<<;;<<<<8;<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:42	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:242:419:512	83	seq2	672	94	35M	=	490	-217	CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT	*:<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:45:183:25	83	seq2	672	95	35M	=	501	-206	CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT	;1<<;<<<;;;;<<<<<+<<<<<<<<<9<<<<<<<	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:326:887:180	83	seq2	672	73	35M	=	492	-215	CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT	8:<<:<5<<<;7<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:145:635:390	147	seq2	673	99	35M	=	860	222	TAAACCAGTCCTATAAGAAATGCTCAAAAGAATTG	<<<<<<<<<<<<<<<<<<:<<<<<<<8<<<::;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:31:628:1820	147	seq2	675	98	35M	=	828	188	AACCAGTCCTATAAGAAATGCTCAAAAGAATTGTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:7:117:452:744	147	seq2	676	99	35M	=	850	209	ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA	<<<<<<<<<<;<<<;<<<<<<<<<<:<<<<<<<;;	MF:i:18	Aq:i:50	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:297:949:26	147	seq2	676	99	35M	=	842	201	ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:17:437:1378	147	seq2	676	99	35M	=	847	206	ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:222:579:961	83	seq2	679	99	35M	=	504	-210	AGTCCTATAAGAAATGCTCAAAAGAATTGTAAAAG	=58====;==8=======;================	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:98:995:929	147	seq2	680	99	35M	=	844	199	GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT	<;<;<8<;<<;1;<<<<<;<;;;08;<;<1&0+8<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:76:1765:700	147	seq2	680	99	35M	=	866	221	GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT	;;6;;;;;;;;;6;;;;6;;;;;;;;;;;;88878	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:68:306:409	83	seq2	682	99	40M	=	856	214	CCTATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;:;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:115:193:231	83	seq2	684	99	35M	=	522	-197	TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA	=========7===========<=============	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:57:1675:720	83	seq2	684	99	35M	=	841	192	TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:13:682:680	147	seq2	685	99	35M	=	482	-238	ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA	<<<<<<<<<<:<5<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:51:1486:1131	83	seq2	685	77	35M	=	500	-220	ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA	<<<<<<<<<<,<6<<<<<<<<<<<<<<<<<<7<<<	MF:i:18	Aq:i:3	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:33:1240:846	147	seq2	685	99	35M	=	509	-211	ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA	<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:43:972:506	83	seq2	686	99	35M	=	505	-216	TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT	;<<<<<<<+;<;<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:23:127:880	147	seq2	686	99	35M	=	504	-217	TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT	<<<<<<<<<%<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:7:101:752:996	83	seq2	687	99	35M	=	508	-214	AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT	<<<<<<<<7<7<<<<<<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:3:186:68	147	seq2	687	99	35M	=	512	-210	AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT	<<;<<<<<&:,<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:273:348:37	83	seq2	688	99	36M	=	483	-241	AGAAATGCGCAAAAGAATTGTAAAAGTCAAAATTAA	9;7;;0<++1<<<;<7<+;;1<<<;<17<<<<<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS51_78:7:164:727:977	83	seq2	689	99	35M	=	513	-211	GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA	;<;<;<:<:<<<<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:140:253:322	147	seq2	689	99	35M	=	537	-187	GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA	=;===;54:====================>>===>	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:146:374:692	83	seq2	690	99	35M	=	874	219	AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA	<<<<<<<<<<<<<<<</<<<<<<<<<<<<<<<<<:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:92:875:345	83	seq2	690	99	35M	=	504	-221	AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA	<<<;<.;7<<<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:45:601:439	147	seq2	691	99	35M	=	864	208	AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG	<<<<;<<<<<<<<<<<<<<<<4<<<<9<<<<<<;;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:295:882:282	83	seq2	691	99	35M	=	520	-206	AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG	<<:<8<-<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:78:775:555	147	seq2	691	99	35M	=	539	-187	AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG	<<-<%4/<<<<<<<<<<<<<<<<<5<<<0<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:255:796:239	83	seq2	692	99	35M	=	869	212	ATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGT	<<<<<<<<6<<<<<<<<<<<<<<<<;6<<<:<:<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:57:826:977	83	seq2	693	99	35M	=	528	-200	TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT	875:6<<<<<<<<<<<<<<<;<<<<<<;8<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:187:996:432	83	seq2	693	99	36M	=	860	203	TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:65:463:703	147	seq2	693	99	35M	=	506	-222	TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT	<<3<9<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:288:384:444	147	seq2	696	99	35M	=	855	194	TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:272:240:950	83	seq2	696	97	35M	=	520	-211	TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA	37<<<<<<<<<<<<<<<<<<<<<<;;<;<<<<<<;	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:160:130:351	147	seq2	697	99	35M	=	530	-202	CAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAAT	4<;;<;<<<-<<<<<<<<<<;;<<<<;<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:189:530:40	147	seq2	698	99	36M	=	883	221	AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATAC	<<<<<<<<<<;<<<<<:<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:168:247:414	83	seq2	698	99	35M	=	876	213	AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA	<<<<<<<<<<<<<<<<*<<<<<<<<<;:6<<<<<;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:197:759:975	83	seq2	698	99	35M	=	537	-196	AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:29:411:1208	83	seq2	698	99	40M	=	882	224	AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC	<<<<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<;;;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:110:543:934	83	seq2	700	99	35M	=	514	-221	AAGAATTGTAAAAGTCAAAATTAAAGTTCAATACT	<<<<<5<<;<<<<<<;<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:287:665:495	83	seq2	702	99	35M	=	530	-207	GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA	===,9=;;====7=====5===;==1=========	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:70:445:1289	147	seq2	702	99	35M	=	535	-202	GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA	<<<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:172:827:592	147	seq2	703	99	35M	=	899	231	AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC	=;=======;==;===:==========;==9<<.3	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:135:401:735	147	seq2	703	99	35M	=	510	-228	AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC	<<::7<<<<<<::<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:39:208:644	83	seq2	704	99	35M	=	859	190	ATTGTAAAAGTCAAAATTAAAGTTCAATACTCACC	<;<<<<<;;:<<;;<<<<<<;;;;;;.<;<79997	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:99:1632:76	147	seq2	705	99	40M	=	553	-192	TTGTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATA	4641::<<4<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:52:1144:509	83	seq2	706	99	35M	=	867	196	TGTAAAAGTCAAAATTAAAGTTCAATACTCACCAT	<<<<<<<<<<<<<<<<<<<;<<<<<<<;<;<<;<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:116:157:612	83	seq2	707	99	35M	=	889	217	GTAAAAGTCAAAATTAAAGTTCAATACTCACCATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:36:481:1079	147	seq2	707	99	40M	=	881	214	GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::8	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:74:668:424	147	seq2	707	99	40M	=	545	-202	GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA	:::::<<96<<<<<;<<<;<<5<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:122:398:994	147	seq2	708	99	35M	=	871	198	TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA	<:<9<<<<<<4<<<;9<<<<<98<;<<<:;<;<;7	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:36:1231:1381	83	seq2	708	99	35M	=	891	218	TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:57:366:844	147	seq2	708	99	40M	=	877	209	TAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::7:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:307:208:477	83	seq2	710	99	35M	=	546	-199	AAAGTCAAAATTAAAGTTCAATACTCACCATCATA	<<<<<.<<<<<<<<<<<<;<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:285:417:147	147	seq2	712	99	35M	=	529	-218	AGTCAAAATTAAAGTTCAATACTCACCATCATAAA	<..)<<<<;<<<<7<;-<<;<<<<<;8<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:325:544:349	83	seq2	716	99	35M	=	515	-236	AAAATTAAAGTTCAATACTCACCATCATAAATACA	<<<<57<<<7<;6<<<<;<7<7;<<7<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:33:357:858	147	seq2	716	99	35M	=	870	189	AAAATTAAAGTTCAATACTCACCATCATAAATACA	<<<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:78:806:800	83	seq2	717	99	40M	=	564	-193	AAATTAAAGTTCAATACTCACCATCATAAATACACACAAA	::;9:<<<;<<:<<<<:<.<1:<<1<<<<<<;<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:41:314:1173	147	seq2	718	99	35M	=	554	-199	AATTAAAGTTCAATACTCACCATCATAAATACACA	<<2**<<82/<<<<<<<<<<9<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:82:963:128	147	seq2	719	99	35M	=	905	221	ATTAAAGTTCAATACTCACCATCATAAATACACAC	<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<<;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:240:719:799	83	seq2	720	99	35M	=	900	215	TTAAAGTTCAATACTCACCATCATAAATACACACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:93:634:323	147	seq2	721	99	35M	=	550	-206	TAAAGTTCAATACTCACCATCATAAATACACACAA	<<<<;<;<<<<;;<<2<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:12:1335:1372	147	seq2	721	99	40M	=	906	225	TAAAGTTCAATACTCACCATCATAAATACACACAAAAGTA	<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<99::.:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:116:738:142	147	seq2	722	99	35M	=	568	-189	AAAGTTCAATACTCACCATCATAAATACACACAAA	<:<7;+:<<:<<<;<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:49:330:699	83	seq2	722	99	35M	=	540	-217	AAAGTTCAATACTCACCATCATAAATACACACAAA	===/=;========;=;==================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:273:562:954	147	seq2	722	99	35M	=	539	-218	AAAGTTCAATACTCACCATCATAAATACACACAAA	;<<+;95<<<;5;<<;:<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:77:1529:522	147	seq2	722	99	35M	=	562	-195	AAAGTTCAATACTCACCATCATAAATACACACAAA	<<<;7;,<<<<<<.<,6<<6<<<<<<<;<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:67:1467:1447	147	seq2	722	99	35M	=	898	211	AAAGTTCAATACTCACCATCATAAATACACACAAA	<<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:251:819:772	83	seq2	726	99	36M	=	881	191	TTCAATACTCACCATCATAAATACACACAAAAGTAC	<3<<<9<9<3<</<<<<<<59<3<9<<</9/++*/'	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:144:492:61	147	seq2	728	99	35M	=	564	-199	AAATACTCACCATCATAAATACACACAAAAGTACA	+;;3;,:7<:;<<7<<<<<<<;;<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:11	H0:i:1	H1:i:0
+EAS54_73:7:200:65:291	83	seq2	728	99	35M	=	930	237	CAATACTCACCATCATAAATACACACAAAAGTACA	<<<<1<<<<<<<<<<<<<<<<<<<:<8<<<<:<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:130:609:467	83	seq2	728	99	35M	=	877	184	CAATACTCACCATCATAAATACACACAAAAGTACA	==8=====;==8==;=4=;;8=====;6=177.==	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:216:47:302	147	seq2	729	99	35M	=	557	-207	AATACTCACCATCATAAATACACACAAAAGTACAA	<<;<8<:<6<<<;<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:4:234:610	83	seq2	729	84	35M	=	560	-204	AAAAATCAACATCACAAATACACACAAAAGTACAA	<:+:'+&<+'<+'2&<:<7<2<':2<:<<7<7<<<	MF:i:18	Aq:i:22	NM:i:4	UQ:i:31	H0:i:0	H1:i:0
+EAS54_81:8:271:180:509	83	seq2	729	99	35M	=	896	202	AATACTCACCATCATAAATACACACAAAAGTACAA	=============================='====	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:41:530:663	147	seq2	730	99	35M	=	908	213	ATACTCACCATCATAAATACACACAAAATTACAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;;<<	MF:i:18	Aq:i:74	NM:i:1	UQ:i:22	H0:i:1	H1:i:0
+EAS114_39:4:30:570:902	83	seq2	730	99	35M	=	561	-204	ATACTCACCATCATAAATACGCACAAAAGTACAAA	<:<6:6<&:<<6<<<<<<<<.<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:13	H0:i:0	H1:i:1
+EAS1_105:1:87:430:995	83	seq2	731	67	35M	=	909	213	TACTCACCATCATAAATACACACAAAATTACAAAA	<<;<<7;;;<;<<777;7(77;;1;7;%117;,7(	MF:i:18	Aq:i:30	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS114_28:7:215:863:521	147	seq2	732	99	36M	=	890	194	ACTCACCATCATAAATACACACAAAAGTACAAAACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:267:394:437	83	seq2	735	99	35M	=	544	-226	AAACATCATAAATACACACAAAAGTACAAAACTCA	&<&,<8.<;<<<;<8<8<7<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:2	UQ:i:10	H0:i:1	H1:i:0
+EAS1_108:6:94:294:387	83	seq2	736	99	35M	=	578	-193	ACCATCATAAATACACACAAAAGTACAAAACTCAC	779=53=9===;=:=;=========;=========	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:38:332:54	147	seq2	737	99	36M	=	904	203	CCATCATAAATACACACAAAAGTACAAAACTCACAG	<;<<<<<<<<<<<<<<<<<<<<<<<<<<<0;;;<;;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:8:165:441:708	83	seq2	737	99	35M	=	550	-222	CCATCATAAATACACACAAAAGTACAAAACTCACA	6+<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:246:177:525	147	seq2	738	98	35M	=	549	-224	CATCATAAATACACACAAAAGTAAAAAACTCACAG	%<(4<2<<<<<:<;<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_26:5:43:114:617	83	seq2	738	99	35M	=	579	-194	AATCATAAATACACACAAAAGTACAAAACTCACAG	+=22=6=================9===========	MF:i:18	Aq:i:52	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS1_99:8:152:778:228	147	seq2	739	99	35M	=	915	211	ATCATAAATACACACAAAAGTACAAAACTCACAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:24:319:429	83	seq2	740	99	35M	=	582	-193	TAATAAATACACACAAAAGTACAAAACTCACAGGT	0%=3%=3====<=9=====89==93==9=6=====	MF:i:18	Aq:i:56	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_66:5:210:674:911	83	seq2	740	99	35M	=	904	199	TCATAAATACACACAAAAGTACAAAACTCACAGGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:88:451:1773	83	seq2	742	99	35M	=	902	195	ATAAATACACACAAAAGTACAAAACTCACAGGTTT	;;:::<:;:<<;:6::;:;;:::;;<;;;367177	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:2:168:1878	147	seq2	743	37	35M	=	560	-218	TAAATACACACAAAAGTAGAAAACGCACCAGTTTT	*3/6)9.;;;;;;;;5;;);;;3;(;;;+(;7.)3	MF:i:-126	Aq:i:37	NM:i:4	UQ:i:32	H0:i:0	H1:i:0
+EAS188_7:5:115:249:673	83	seq2	743	99	35M	=	552	-226	TAAATACACACAAAAGTACAAAACTCACAGGTTTT	:<<<;<<<;<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:178:187:610	83	seq2	744	99	35M	=	903	194	AAATACACACAAAAGTACAAAACTCACAGGTTTTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:2:9:49:661	83	seq2	747	99	35M	=	591	-191	TACACACAAAAGTACAAAACTCACAGGTTTTATAA	<<6<5<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:157:361:309	147	seq2	747	99	35M	=	589	-193	TACACACAAAAGTACAAAACTCACAGGTTTTATAA	:<-<5<0<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:103:443:166	83	seq2	747	99	35M	=	565	-217	TACACACAAAAGTACAAAACTCACAGGTTTTATAA	7<4<4<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:8:49:182:192	147	seq2	750	99	35M	=	582	-203	ACACAAAAGTACAAAACTCACAGGTTTTATAAAAC	<5<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:12:630:707	83	seq2	751	99	35M	=	915	199	CACAAAAGTACAAAACTCACAGGTTTTATAAAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:94:1440:2016	83	seq2	751	99	35M	=	564	-222	CACAAAAGTACAAAACTCACAGGTTTTATAAAACA	:<8<<<<9<<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:206:741:810	147	seq2	753	99	35M	=	929	210	CAAAAGTACAAAACTCACAGGTTTTATAAAACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:-;<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:250:698:842	83	seq2	753	99	34M	=	554	-233	AAAAAGTACAAAACTCACAGGTTTTATAAAACAA	)<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS54_81:6:265:251:147	83	seq2	754	99	35M	=	581	-208	AAAAGTACAAAACTCACAGGTTTTATAAAACAATT	<<<<::<8<<<;<;8<8<<<<<<<<:<<<<<<<<<	MF:i:18	Aq:i:50	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:71:644:1792	83	seq2	754	84	35M	=	589	-200	AAAAGTACAAAACTCACAGGTTTTATAAAACAATT	<<<<;<<<<<<:;/<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:108:958:42	83	seq2	755	81	35M	=	584	-206	AAAGTACAAAACTCACAGGTTTTATAAAACAATTA	<<<;;</<<<<;<<<<<<<<<<<<<<<<<<<<<<+	MF:i:18	Aq:i:9	NM:i:1	UQ:i:27	H0:i:0	H1:i:3
+B7_597:8:48:805:860	147	seq2	755	78	35M	=	563	-227	AAAGTACAAAACTCACAGGTTTTATAAAACAATTA	<<<;3<;7<<97<7<<<<7<4<<<<<<<<<<;8<+	MF:i:18	Aq:i:13	NM:i:1	UQ:i:27	H0:i:0	H1:i:3
+B7_591:3:179:496:161	147	seq2	756	99	36M	=	919	199	AAGTACAAAACTCACAGGTTTTATAAAACAATTAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+	MF:i:18	Aq:i:49	NM:i:2	UQ:i:53	H0:i:1	H1:i:0
+EAS56_59:3:166:626:836	83	seq2	757	99	35M	=	567	-225	AGTACAAAACTCACAGGTTTTATAAAACAATTAAT	<;;7<<<<<<;<7;<<<<<<<<<<<<7<<<<<<<+	MF:i:18	Aq:i:28	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS114_28:5:23:944:377	147	seq2	757	75	36M	=	579	-214	AGTACAAAACTCACAGGTTTTATAAAACAATTAATT	<;7;8<<<<:<;<:<<<<<<<<<<<<<;<<<<<<<;	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_45:1:100:979:1863	147	seq2	757	85	35M	=	583	-209	ATTACAAAACTCACAGGTTTTATAAAACAATTAAT	6&,*3;6;66;9(572692;;;79;4)9;96;59+	MF:i:18	Aq:i:23	NM:i:3	UQ:i:51	H0:i:0	H1:i:0
+EAS219_1:3:90:219:528	83	seq2	758	75	35M	=	576	-217	GTACAAAACTCACAGGTTTTATAAAACAATTAATT	;:<5<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_108:5:89:942:84	83	seq2	759	74	35M	=	562	-232	TACAAAACTCACAGGTTTTATAAAACAATTAATTG	===================>=>>>==>>===>==>	MF:i:-126	Aq:i:74	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_108:6:159:493:275	83	seq2	760	72	35M	=	939	214	ACAAAACTCACAGGTTTTATAAAACAATTAATTGA	=====3=============================	MF:i:-126	Aq:i:72	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS139_11:1:81:1019:558	147	seq2	760	77	35M	=	926	201	ACAAAACTCACAGGTTTTATAAAACAATTAATTGA	<<<<<<<<<<<6<<<<<<<<<<<<<<<<<<<<<7<	MF:i:-126	Aq:i:77	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS51_62:7:162:195:761	147	seq2	767	30	18M4I13M	=	922	190	TCACAGGTTTTATAAAACAATTAATTGAGACTACA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;;	MF:i:-126	Aq:i:30	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+B7_597:3:115:646:430	147	seq2	768	45	17M4I14M	=	582	-217	CACAGGTTTTATAAAACAATTAATTGAGACTACAG	5;5<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:45	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:6:243:209:110	147	seq2	768	48	17M4I14M	=	920	187	CACAGGTTTTATAAAACAATTAATTGAGACTACAG	<<<<<;<;<<<;<<<<<<<<<<<;<:;<<:;;+85	MF:i:-126	Aq:i:48	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_108:2:266:994:429	147	seq2	769	76	16M4I15M	=	612	-188	ACAGGTTTTATAAAACAATTAATTGAGACTACAGA	</<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:5:32:461:154	83	seq2	769	71	16M4I15M	=	945	211	ACAGGTTTTATAAAACAATTAATTGAGACTACAGA	<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<+<;;	MF:i:-126	Aq:i:71	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_39:6:7:492:1088	83	seq2	769	57	16M4I15M	=	926	192	ACAGGTTTTATAAAACAATTAATTGAGACTACAGA	<<<<<<<<<<<<<<<<<<<<<<<<7<:<<<<<<6;	MF:i:-126	Aq:i:57	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_95:6:174:650:125	147	seq2	770	76	15M4I16M	=	600	-201	CAGGTTTTATAAAACAATTAATTGAGACTACAGAG	===;===============================	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_59:6:89:457:591	147	seq2	770	69	15M4I16M	=	585	-216	CAGGTTTTATAAAACAATTAATTGAGACTACATAG	797<<9<<<<<<<3<7<<<<<<<<<<)<<<<<07<	MF:i:-126	Aq:i:69	NM:i:1	UQ:i:15	H0:i:0	H1:i:0
+EAS114_39:2:38:670:564	83	seq2	770	73	15M4I16M	=	930	195	CAGGTTTTATAAAACAATTAATTGAGACTACAGAG	<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;<5<;	MF:i:-126	Aq:i:73	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS188_7:4:92:693:228	147	seq2	770	75	14M4I17M	=	601	-200	AAGGTTTTATAAAAAAATTAATTGAGACTACAGAG	6=77=<<=======&====================	MF:i:-126	Aq:i:75	NM:i:1	UQ:i:28	H0:i:0	H1:i:0
+EAS218_1:4:61:1369:440	147	seq2	770	47	15M4I16M	=	964	229	CAGGTTTTATAAAACAATTAATTGAGACTACAGAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<8	MF:i:-126	Aq:i:47	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_26:4:123:1001:580	83	seq2	771	43	14M4I17M	=	617	-185	AGGTTTTATAAAACAATTAATTGAGACTACAGAGC	<.00..3<6<<<<<<<3;<<08<<<<<6<<<<<<<	MF:i:-126	Aq:i:43	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_39:4:10:1312:1558	147	seq2	771	76	14M4I17M	=	928	192	AGGTTTTATAAAACAATTAATTGAGACTACAGAGC	5<<<<<<<<<<<<<<<<<<<<<<<;;<<<<<;8;<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS220_1:8:45:178:1321	83	seq2	771	77	14M4I17M	=	606	-196	AGGTTTTATAAAACAATTAATTGAGACTACAGAGC	<<<<<<<<<<<<<<<<<:<<:<<<<<<<<<<<<<<	MF:i:-126	Aq:i:77	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_59:5:125:137:58	147	seq2	772	76	13M4I18M	=	932	195	GGTTTTATAAAACAATTAATTGAGACTACAGAGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS192_3:3:285:349:797	83	seq2	773	76	12M4I19M	=	604	-200	GTTTTAAAAAACCAATAATTGAGACTACAGAGCAA	;;<<<7.:<<<..<.<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:1	UQ:i:13	H0:i:0	H1:i:0
+EAS114_45:5:56:1757:1319	147	seq2	775	67	10M4I21M	=	957	217	TTTATAAAACAATTAATTGAGACTACAGAGCAACT	;;;;9;;;;;;;;;;;;;4;9;98;;;;;9388&7	MF:i:-126	Aq:i:67	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+B7_591:3:291:404:199	83	seq2	777	76	8M4I24M	=	612	-197	TATAAAACAATTAATTGAGACTACAGAGCAACTAGG	<<<<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS54_65:7:159:253:353	83	seq2	778	67	7M4I24M	=	613	-196	ATAAAACAATTAATTGAGACTACAGAGCAACTAGG	<8<<<<:<<;;<<<<<<<<<<<;<<<<<<<<<<<<	MF:i:-126	Aq:i:67	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_57:1:122:38:103	147	seq2	778	79	7M4I24M	=	972	229	ATAAAACAATTAATTGAGACTACAGAGCAACTAGG	<<<<<<<<<<<<<<<<;<<<<<<<<3<<<<9<8;<	MF:i:-126	Aq:i:79	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS188_4:5:103:870:105	147	seq2	778	44	7M4I24M	=	595	-214	ATAAAACAATTAATTGAGACTACAGAGCAACTAGG	<<<<<<<<<<<<<=<:<;<<<<<<<<<<*<<<<<<	MF:i:-126	Aq:i:44	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_105:8:24:718:322	147	seq2	779	23	35M	=	953	209	ACAATTAATTGAGACTACAGACCAATTATGTAAAA	5/7<3+<;<1<<1<95<.&&.&&.<&)5)1)17<%	MF:i:-126	Aq:i:23	NM:i:3	UQ:i:18	H0:i:0	H1:i:0
+EAS51_64:6:118:41:489	83	seq2	779	76	35M	=	588	-226	ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA	<+<<;<<<38<<<<5<<3<<<<3<<8<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_61:3:165:665:220	83	seq2	779	76	35M	=	618	-196	ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA	<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:6:238:803:383	83	seq2	779	75	35M	=	954	210	ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA	<<<<<<<<<<<<;<<<<<;<;<<;<<;<<<9<;<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_105:3:232:364:583	83	seq2	780	71	35M	=	956	211	CAATTAATTGAGACTACAGAGCAACTAGGTAAAAA	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:-126	Aq:i:71	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS139_19:2:2:1217:398	83	seq2	780	99	40M	=	608	-212	CAATTAATTGAGACTACAGAGCAACTAGGTAAAAAATTAA	+;;:9<<66<<<;+<<7<<<<;<<+;<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:3	UQ:i:73	H0:i:1	H1:i:0
+B7_593:2:81:435:410	83	seq2	782	99	36M	=	966	220	ATTAATTGAGACTACAGAGCAACTAGGTAAAAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<;<<;;	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+B7_593:3:115:649:259	147	seq2	782	99	36M	=	617	-201	ATTAATTGAGAATACAGAGCAACTAGGTAAAAAATT	;<;<<;<<<<;&<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:3	UQ:i:58	H0:i:0	H1:i:1
+EAS1_93:3:181:93:694	147	seq2	783	99	35M	=	954	206	TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT	++<<<<<<;<<<<<<:;8<<;<<<5;<;<<<+<<<	MF:i:18	Aq:i:28	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS114_30:1:188:863:790	147	seq2	783	98	35M	=	969	221	TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT	++<;<<;;;:<<<<:<:<<:1<<1<<<6:6;4;;4	MF:i:18	Aq:i:27	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS1_93:2:313:711:530	147	seq2	784	99	35M	=	968	219	TAATTGAGACTACAGAGCAACTAGGTAAAAAATTA	+<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<:	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_589:7:154:26:712	83	seq2	786	99	35M	=	959	208	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC	<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:185:87:475	147	seq2	786	99	36M	=	949	199	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:69:1593:819	147	seq2	786	99	40M	=	977	231	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACATTAC	<<<<<<<<<<<<<<;<<<<<;;<:<<<<<:<<<<<:777:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:309:187:267	83	seq2	786	99	35M	=	616	-205	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC	<:0;<;<4<<7<<<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:82:1540:77	83	seq2	786	99	35M	=	619	-202	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC	<48;<;</;<<<<<<:<<0<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:193:420:78	147	seq2	787	99	35M	=	607	-215	TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA	81<<;<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:261:267:597	83	seq2	787	86	35M	=	617	-205	TTGAGAATAAAGAGCAACTAGGTAAAAAATTAACA	*-1<9<+1<+<<<<:<<;9<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:41	NM:i:2	UQ:i:20	H0:i:0	H1:i:1
+EAS56_59:4:262:928:237	83	seq2	787	99	35M	=	971	219	TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:262:53:888	147	seq2	787	99	35M	=	965	213	TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA	<<<<<<<<;<<<<<<<<<<;<<;<;<;6<<;<;;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:138:211:582	83	seq2	788	99	35M	=	957	204	TGAGACTACAGAGCAAATAGGTAAAAAATTAACAT	<<;<<<<<<<<<<<<<&;<;<7<<;<<<<<<<5<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_597:7:113:408:211	83	seq2	789	99	35M	=	952	198	GAGACTACAGAGCAACTAGGTAAAAAATTAACATT	<<<<<<<<<<<<<<<:&<<<&:<<<<<<<<<<;:/	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:3:79:879:15	147	seq2	790	99	35M	=	626	-199	AGACTACAGAGCAACTAGGTAAAAAATTAACATTA	<;;5;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:325:795:213	83	seq2	790	99	35M	=	618	-207	AGACTACAGAGCAACTAGGTAAAAAATTAACATTA	<<<0<<;<<<<;<<;:<<<<<<<<<<<;<<<<<9<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:22:206:150	83	seq2	792	99	35M	=	619	-208	AAAAAAGAGCAACTAGGTAAAAAATTAACATTACA	8&)<)<<<<+<<+<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:3	UQ:i:21	H0:i:1	H1:i:0
+EAS56_59:5:181:713:140	147	seq2	793	84	35M	=	615	-213	CTACAGAGCAACAAGGTAAAAAATTAACATTACAA	78<+<7<-7;;;&<5<7<<<<7<<<<<<<<<<<7<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_589:7:76:306:561	147	seq2	794	89	35M	=	987	228	TACAGAGCAACTAGGTAAAAAATTAACATTACAAC	<<)<<<<<<8<<8<<<<<<<;;;<<1<<3;=7<<9	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:325:352:67	83	seq2	794	99	35M	=	622	-207	TACAGAGCAACTAGGTAAAAAATTAACATTACAAC	;<8<<<;;<<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:310:287:420	83	seq2	794	99	35M	=	965	206	TACAGAGCAACTAGGTAAAAAATTAACATTACAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:74:329:459	83	seq2	795	99	35M	=	623	-207	ACAGAGCAACTAGGTAAAAAATTAACATTACAACA	</<;<8/<<9<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:57:1342:1166	83	seq2	796	99	35M	=	964	203	CAGAGCAACTAGGTAAAAAATTAACATTACAACAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:3:542:428	147	seq2	797	99	35M	=	965	203	AGAGCAACTAGGTAAAAAATTAACATTACAACAGG	7<4<<<6<<,<9)<<<<6<,<<7<<7<<<<<<<<1	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:97:892:419	83	seq2	800	99	35M	=	621	-214	GCAACTAGGTAAAAAATTAACATTACAACAGGAAC	;8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:82:1051:921	83	seq2	800	99	40M	=	616	-224	GCAAATAGGTAAAAAATTAACATTACAACAGGAACAAAAC	3-::-7<;+:9<;<<<5<;9,::53-;:3<<<<9<<3<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS1_95:5:263:511:936	147	seq2	801	99	35M	=	629	-207	CAAATAGGTAAAAAATTAACATTACAACAGGAACA	+<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS114_26:7:157:876:302	147	seq2	801	99	35M	=	964	198	CAACTAGGTAAAAAATTAACATTACAACACGAACA	2<<;<<<22<<<<<<77<<<<22<7<<<<%-<<1<	MF:i:18	Aq:i:66	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS54_65:2:127:288:655	147	seq2	803	99	35M	=	999	231	ACTAGGTAAAAAATTAACATTACAACAGGAACAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:83:731:540	147	seq2	804	99	35M	=	623	-216	CTAGGTAAAAAATTAACATTACAACAGGAACAAAA	;7<:+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:82:843:1838	83	seq2	804	99	35M	=	999	230	CTAGGTAAAAAATTAACATTACAACAGGAACAAAA	;<<;:;;<<<;;<<<<;;<<;;;;;<;;;;68887	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:71:994:576	147	seq2	805	99	35M	=	655	-185	TAGGTAAAAAATTAACATTACAACAGGAACAAAAC	<<9;;<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:24:415:944	83	seq2	805	99	35M	=	974	204	TAGGTAAAAAATTAACATTACAACAGGAACAAAAC	<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:73:1458:1337	83	seq2	806	99	35M	=	609	-232	AGGTAAAAAATTAACATTACAACAGGAACAAAACC	<</<<<<<<<6:<::<<<1<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:142:353:398	147	seq2	807	99	35M	=	977	205	GGTAAAAAATTAACATTACAACAGGAACAAAACCT	=================================9=	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:46:522:426	147	seq2	807	99	35M	=	964	192	GGTAAAAAATTAACATTACAACAGGAACAAAACCT	=======================:==;<===78==	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:59:871:351	147	seq2	808	99	35M	=	963	190	GTAAAAAATTAACATTACAACAGGAACAAAACCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:235:505:553	147	seq2	808	99	35M	=	987	214	GTAAAAAATTAACATTACAACAGGAACAAAACCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:;:	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:60:1420:660	83	seq2	808	99	35M	=	649	-194	GTAAAAAATTAACATTACAACAGGAACAAAACCTC	99<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:180:89:582	147	seq2	809	99	36M	=	650	-195	TAAAAAATTAACATTACAACAGGAACAAAACCTCAT	;<<<<<<4<<<:<<<<<<<<<6<<<<<<<<<<;<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:323:196:855	83	seq2	809	99	35M	=	642	-202	TAAAAAATTAACATTACAACAGGAACAAAACCTCA	&<<<<<<09<<7<7;<;<<0<<<<<;<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:295:547:216	147	seq2	809	99	35M	=	970	196	TAAAAAATTAACATTACAACAGGAACAAAACCTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:126:361:250	83	seq2	810	99	35M	=	1002	227	AAAAAATTAACATTACAACAGGAACAAAACCTCAT	<<<<<<;9<<<<<<<<<<<<<<;;;<<<;<664;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:266:133:789	83	seq2	810	99	35M	=	988	213	AAAAAATTAACATTACAACAGGAACAAAACCTCAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:175:149:296	83	seq2	811	99	35M	=	614	-232	AAAAATTAACATTACAACAGGAACAAAACCTCATA	=;==26==;==;================7======	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:136:260:254	83	seq2	813	99	35M	=	988	210	AAATTAACATTACAACAGGAACAAAACCTCATATA	<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:85:1521:58	147	seq2	813	99	40M	=	639	-214	AAATTAACATTACAACAGGAACAAAACCTCATATATCAAT	:::86<<:<<8<<<<;<<8<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:164:719:947	83	seq2	813	99	35M	=	1005	227	AAATTAACATTACAACAGGAACAAAACCTCATATA	<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<<<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:50:257:341	147	seq2	813	99	35M	=	971	193	AAATTAACATTACAACAGGAACAAAACCTCATATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<6<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:117:33:262	83	seq2	814	99	35M	=	642	-207	AATTAACATTACAACAGGAACAAAACCTCATATAT	<<;;<<;<:8<7<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:90:706:1276	147	seq2	814	99	35M	=	980	201	AATTAACATTACAACAGGAACAAAACCTCATATAT	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:<:<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:116:966:193	147	seq2	815	99	35M	=	967	187	ATTAACATTACAACAGGAACAAAACCTCATATATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:59:742:549	147	seq2	816	99	35M	=	642	-209	TTAACATTACAACAGGAACAAAACCTCATATATCA	-<<<3<<<<6<<6<<<<<6<<<<6<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:74:213:877	83	seq2	816	99	35M	=	996	215	TTAACATTACAACAGGAACAAAACCTCATATATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_610:3:85:219:371	147	seq2	817	99	35M	=	967	185	TAACATTACAACAGGAACAAAACCTCATATATCAA	<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<;<;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:176:653:957	147	seq2	819	82	35M	=	982	198	ACATTACAACAGGAACAAAACCTCATATATCAATA	????????????<<???@<<<<<@<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:64:526:339	147	seq2	819	96	35M	=	1019	235	ACATTACAACAGGAACAAAACCTCATATATCAATA	<<<<<<<<;<<<<<<<<<<7<:<<<<<<<<<8:<:	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:97:743:602	83	seq2	821	99	34M	=	644	-211	ATTACAACAGGAACAAAACCTCATATATCAATAT	<(&<:<<&<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:2	H1:i:6
+B7_610:2:75:887:149	147	seq2	823	99	35M	=	1004	216	TACAACAGGAACAAAACCTCATATATCAATATTAA	<<<<<<<<<<<<<<;<<<<<<<;<<<<<<<;<;;;	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS221_1:2:73:955:728	83	seq2	823	44	35M	=	660	-198	TACAACAGGAACAAAACCTCATATATCAATATTAA	;<-<<6<;<<<6<<<<;7<6<<<<<<<<<<<<<<<	MF:i:18	Aq:i:14	NM:i:0	UQ:i:0	H0:i:3	H1:i:18
+EAS1_108:2:102:543:160	147	seq2	825	99	35M	=	977	187	CAACAGGAACAAAACCTCATATATCAATATTAACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<:<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_28:2:55:562:403	83	seq2	825	99	36M	=	643	-218	CAACAGGAACAAAACCTCATATATCAATATTAACTT	+<<&<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+B7_593:1:19:695:59	83	seq2	826	99	36M	=	988	198	AACAGGAACAAAACCTCATATATCAATATTAACTTT	<<<<<<<<<<<;<<<<<<<<<;<<;;<;<<7<<<<;	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS221_1:2:8:327:522	147	seq2	826	99	35M	=	1001	210	AACAGGAACAAAACCTCATATATCAATATTAACTT	<<<<<<<<<<:<<<<<<<<<<:<<<<<<<<<:<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS114_45:6:90:561:850	147	seq2	827	85	35M	=	1004	212	ACAGGAACAAAACCTCATATATCAATATTAACTTT	;;;;;;;;;;;;;;;;;;;;;;;;9;9;6;77777	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:2	H1:i:25
+EAS56_61:5:209:824:866	83	seq2	828	73	35M	=	665	-198	CAGCAACAAAACCTCATATATCAATATTAACTTTG	;<:&<<:<<<<;<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:1	UQ:i:5	H0:i:1	H1:i:7
+EAS139_11:2:31:628:1820	83	seq2	828	98	35M	=	675	-188	CAGGAACAAAACCTCATATATCAATATTAACTTTG	<<<<<<:<<<<:6<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS220_1:4:6:1178:1105	147	seq2	830	93	35M	=	657	-208	GGAACAAAACCTCATATATCAATATTAACTTTGAA	<:<<9<<<<::7<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:11
+EAS114_28:4:305:707:258	83	seq2	831	58	36M	=	992	197	GAACAAAACCTCATATATCAATATTAACTTTGAATA	9<<<<<<<<<<<<;<<-<<;;<;<<9<<;<<+99;7	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:2	H1:i:9
+EAS54_67:3:114:736:433	147	seq2	832	63	35M	=	998	201	AACAAAACCTCATATATCAATATTAACTTTGAATA	;<<9<8;<<<<8<8<;<<;;;0<<8;<;<<47;;;	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+B7_591:7:157:447:758	83	seq2	833	99	36M	=	994	197	ACAAAACCTCATATATCAATATTAACTTTGAATAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_591:4:159:508:571	83	seq2	834	84	36M	=	989	191	CAAAACCTCATATATCAATATTAACTTTGAATAAAA	<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS54_65:7:68:825:405	147	seq2	835	30	35M	=	1015	215	AAAACCTCATATATCAATATTAACTTTGAATAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;9	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+B7_593:3:102:856:670	83	seq2	836	99	36M	=	1025	225	AAACCTCATATATCAATATTAACTTTGAATAAAAAG	<<<<<<<;<<<;<<;:<<<<<<<<<<:;;<<;<<<7	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:260:827:289	147	seq2	836	99	35M	=	999	198	AAACCTCATATATCAATATTAACTTTGAATAAAAA	<<<<2<<<<;<<<<;<<<<<<:<<<&-<8<<88<3	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS114_28:1:220:801:282	147	seq2	837	99	36M	=	660	-213	AACCTCATATATCAATATTAACTTTGAATAAAAAGG	;7;87;===;==;====:===<==7===========	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:57:1675:720	147	seq2	841	99	35M	=	684	-192	TCATATATCAATATTAACTTTGAATAAAAAGGGAT	<,<<<<<<:<<<<<<<<:9<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:297:949:26	83	seq2	842	99	35M	=	676	-201	CATATATCAATATTAACTTTGAATAAAAAGGGATT	5<;<;<;:<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:76:34:691	89	seq2	843	58	35M	*	0	0	ATATATCAATATTAACTTTGAATAAAAAGGGATTA	<<<<<<16<<<<<916<<<499<966161919<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:98:995:929	83	seq2	844	99	35M	=	680	-199	TATAACAATATTAACTTTGAATAAAAAGGGATTAA	&<+<'7<<+<&<<<7+4<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:63	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS139_19:3:58:923:1915	147	seq2	846	99	40M	=	1007	201	TATCAATATTAACTTTGAATAAAAAGGGATTAAATTCCCC	<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<:::::	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:181:476:394	83	seq2	847	99	35M	=	666	-216	AACAATATTAACTTTGAATAAAAAGGGATTAAATT	<+;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS112_32:7:322:391:742	147	seq2	847	99	35M	=	667	-215	ATCAATATTAACTTTGAATAAAAAGGGATTAAATT	<63<<<<9<<<:<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:17:437:1378	83	seq2	847	99	35M	=	676	-206	ATCAATATTAACTTTGAATAAAAAGGGATTAAATT	<<7<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:155:375:623	147	seq2	849	99	35M	=	1029	215	CAATATTAACTTTGAATAAAAAGGGATTAAATTCC	0<<<<<;<<<<<<<<<<<<<4<<8<<<<<<<<;<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:2:29:729:70	147	seq2	850	51	35M	=	1009	194	ANTATTANCTTTGANNAAAAAGGGATTAAATTCCC	:!<:<<8!::::5:!!:.77::33888633:8777	MF:i:-126	Aq:i:51	NM:i:3	UQ:i:0	H0:i:0	H1:i:0
+EAS54_65:7:117:452:744	83	seq2	850	99	35M	=	676	-209	AATATTAACTTTGAATAAAAAGGGATTAAATTCCC	<;;<;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:50	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:288:384:444	83	seq2	855	99	35M	=	696	-194	TAACTTTGAATAAAAAGGGATTAAATTCCCCCACT	;=9;;<====<=;=/=9;<========<=======	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:133:514:754	147	seq2	855	63	36M	=	1036	217	TAAATTTGAATAAAAAGGGATTAAATTCCCCCACTT	***&,,,+(*,*********+*)*(***(**((*)(	MF:i:18	Aq:i:19	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS139_19:5:68:306:409	147	seq2	856	99	40M	=	682	-214	AACTTTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG	::2:7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:155:758:710	147	seq2	859	98	35M	=	1048	224	TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG	=======8================6=:7===:=:=	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:39:208:644	147	seq2	859	99	35M	=	704	-190	TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG	78899;;;;4;;;;;;;;;;;;;;;;;;8;;8;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:16:438:245	89	seq2	860	65	35M	*	0	0	TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA	8*8<5'<77;;;;;7<7<<7-<;<<<;;<<<;;79	MF:i:32	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:145:635:390	83	seq2	860	99	35M	=	673	-222	TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA	+9;<<;<<<<<;;;<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:187:996:432	147	seq2	860	99	36M	=	693	-203	TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG	;<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:123:924:645	147	seq2	861	84	36M	=	1045	220	TGAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA	<<<<<<<<<<<<;<<<<<<;<<<<<<<6:<7<1<+<	MF:i:18	Aq:i:11	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:146:961:63	147	seq2	861	86	35M	=	1041	215	TGAATAAAAAGGGCTTAAATTCCCCCACTTAAGGG	<<+<<<<::+1<;&<<88<<<<;;.<0;;85(;(8	MF:i:18	Aq:i:37	NM:i:2	UQ:i:12	H0:i:0	H1:i:1
+EAS114_30:6:4:665:771	69	seq2	862	0	*	=	862	0	GTGCTTTATCTGATATCAATGCCGATAAACTGCCT	<<<<<<<<<<<<%<8<3:7:77<(7,:3(:&2:(0	MF:i:-64
+EAS114_30:6:4:665:771	137	seq2	862	71	35M	=	862	0	GAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA	<;<<;<18<;<8<<<<;<;;<<<<1<<<<6;;;;;	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:45:601:439	83	seq2	864	99	35M	=	691	-208	ATAAAAAGGGATTAAATTCCCCCACTTAAGAGATA	<8<<<<<<1<<<<<<<<)<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:4:126:966:514	147	seq2	865	99	35M	=	1027	197	TAAAAAGGGATTAAATTCCCCCACTTAAGAGATAT	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:76:1765:700	83	seq2	866	99	35M	=	680	-221	AAAAAGGGATTAAATTCCCCCACTTAAGAGATATA	77777;;;;7;7;<;;;;+;;<9<<<79;<1<<77	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:155:807:19	83	seq2	867	99	35M	=	1074	242	AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG	<<<<<<<<<<<<<<<<9+<<<<<<9<<9;4<<<<:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:226:885:729	83	seq2	867	98	35M	=	1037	205	AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG	<<<;<<<<<<;<;<<<<<<<:;<<;4;%;<<;<<.	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:1:156:196	83	seq2	867	77	40M	=	1042	215	AAAAGGGATTAAATTCCCCCACTTAAGAGATATAGATTGG	<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<:;9:9	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:52:1144:509	147	seq2	867	99	35M	=	706	-196	AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG	<<<<:<<<<<<<<<<;::;:<;<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:73:735:329	83	seq2	868	99	35M	=	1035	202	AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA	================;==;====;=;=======;	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:11:801:386	147	seq2	868	97	35M	=	1061	228	AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA	<<<<<<<<<<8<<<<<:4<::<854:5<:::;4+4	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:4:150:94:843	83	seq2	868	75	35M	=	1050	217	AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA	<<<<<<<<7<<<6<<<<<<<<<<<6<<62<<<<<2	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:255:796:239	147	seq2	869	99	35M	=	692	-212	AAGGGATTAAATTCCCCCACTTAAGAGATAGAGAT	<<3;;<7:<<<;(7<<7;<<;<<<<<<<<<7<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:22	H0:i:0	H1:i:1
+B7_589:5:147:405:738	147	seq2	870	99	35M	=	1048	213	AGGGATTAAATTCCCCCACTTAAGAGATATAGATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:33:357:858	83	seq2	870	99	35M	=	716	-189	AGGGATTAAATTCCCCCACTTAAGAGATATAGATT	<;<:<<<<<<<<<;<9<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:122:398:994	83	seq2	871	99	35M	=	708	-198	GGGATTAAATTCCCCCACTTAAGAGATATAGATTG	95:<9<<<<:9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_105:2:146:374:692	147	seq2	874	99	35M	=	690	-219	ATTAAATTCCCCCACTTAAGAGATATAGATTGGCA	<4:<<<1:<:<::<<<;<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:119:428:415	147	seq2	876	99	36M	=	1037	197	TAAATTCCCCCACTTAAGAGATATAGATTGGCAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;<;;;	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:168:247:414	147	seq2	876	99	35M	=	698	-213	TAAATTCCCCCACTTAAGAGATATAGATTGGCAGA	,;;;,146<6;6<<8<<<<1<8<<<<<<<<<<;1<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:130:609:467	147	seq2	877	99	35M	=	728	-184	AAATTCCCCCACTTAAGAGATATAGATTGGCAGAA	===:2===;<====>==>=>=>=>>>==>>>=>>>	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:57:366:844	83	seq2	877	99	40M	=	708	-209	AAATTCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT	;;;7:8&555<,;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:3:236:475:254	147	seq2	880	99	35M	=	1051	206	TTCCCCCACTTAAGAGATATAGATTGGCAGAACAG	<<<<<<<<<<<<<<<<<<<<<<<<<:::<:;</;/	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:251:819:772	147	seq2	881	99	36M	=	726	-191	TCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT	6+7++1<<%<<<<<<<+<+<9<<99<9<<<<<<9<<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:36:481:1079	83	seq2	881	99	40M	=	707	-214	TCCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAA	:11+)*<4;<<<<<<<<<;;<<<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:29:411:1208	147	seq2	882	99	40M	=	698	-224	CCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAAA	766+6<996<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:62:1076:540	83	seq2	882	99	35M	=	1066	219	CCCCCACTTAAGAGATATAGATTGGCAGAACAGAT	<<<<<<<<<<;<<<<<<<<<<<<<<<<;;<<;<7;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:189:530:40	83	seq2	883	99	36M	=	698	-221	CCCCACTTAAGAGATATAGATTGGCAGAACAGATTT	883;<<<<<<<<<:<<<<<<<<3<;<<<<<<<<;<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:113:856:319	147	seq2	884	99	35M	=	1067	216	CCCACTTAAGAGATATAGATTGGCAGAACAGATTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:55:296:1457	83	seq2	884	99	35M	=	1061	212	CCCACTTAAGAGATATAGATTGGCAGAACAGATTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:15:881:1932	83	seq2	886	92	35M	=	1061	210	CACTTAAGAGATATAGATTGGCAGAACAGATTTAA	<<<<<<<<<<<<<<<;<<<<:<<<2<26<8<<;;.	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:116:157:612	147	seq2	889	99	35M	=	707	-217	TTAAGAGATATAGATTGGCAGTACAGATTTAAAAA	;;<<<<<<<<<<<<<<<<;<</<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS114_28:7:215:863:521	83	seq2	890	99	36M	=	732	-194	TAAGAGATATAGATTGGCAGAACAGATTTAAAAACA	;<<<<<<<<<<<<<;<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:254:572:431	147	seq2	891	97	35M	=	1048	192	AAGAGATATAGATTGGCAGAACAGATTTAAAAACA	<<<<<<<<<<<<<<<<;<<<<<<<<<<<99;;;;;	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:273:424:207	147	seq2	891	99	35M	=	1066	210	AAGAGATATAGATTGGCAGAACAGATTTAAAAACA	<,<,<9<<9<<<<<<<<<<79<,599,<191<99+	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:4:571:820	147	seq2	891	99	35M	=	1071	215	AAGAGATATAGATTGGCAGAACAGATTTAAAAACA	<<<<<<<<<<<9<<;9<;;;<;6;:<<<3:;;;:6	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:36:1231:1381	147	seq2	891	99	35M	=	708	-218	AAGAGATATAGATTGGCAGAACAGATTTAAAAACA	<<<<<<;<<<<<<<<<8<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:66:718:481	83	seq2	891	99	40M	=	1072	221	AAGAGATATAGATTGGCAGAACAGATTTAAAAACATGAAC	<<<<<<<<<<<<<<;<<<<<<<<;<<<<<<<;<<<:1:;:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:22:632:176	147	seq2	894	99	36M	=	1091	233	AGATATAGATTGGCAGAACAGATTTAAAAACATGAA	<<<<<;<<<<<<;<<;<:<<<:<<:<<<;<<<;;;:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:271:180:509	147	seq2	896	99	35M	=	729	-202	ATATAGATTGGCAGAACAGATTTAAAAACATGAAC	<<<<<<<<<9<:<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:198:564:731	147	seq2	898	99	35M	=	1089	226	ATAGATTGGCAGAACAGATTTAAAAACATGAACTA	<<<<<;<<<<<<;<<:<<;9<<<<<<<<1;<<58<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:67:1467:1447	83	seq2	898	99	35M	=	722	-211	ATAGATTGGCAGAACAGATTTAAAAACATGAACTA	<<<<<::<<:<<<<:<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:172:827:592	83	seq2	899	99	35M	=	703	-231	TAGATTGGCAGAACAGATTTAAAAACATGAACTAA	8<<<<;7;7<<<<;<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:240:719:799	147	seq2	900	99	35M	=	720	-215	AGATTGGCAGAACAGATTTAAAAACATGAACTAAC	<:<<<<<:<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:24:1345:1627	73	seq2	900	78	35M	=	900	0	AGATTGGCAGAACAGATTTAAAAACATGAACTAAC	<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<8<3	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:24:1345:1627	133	seq2	900	0	*	=	900	0	NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	MF:i:-64
+EAS139_19:1:58:726:1746	147	seq2	900	99	40M	=	1061	201	AGATTGGCAGAACAGATTTAAAAACATGAACTAACTATAT	<<<<<<<<<<<<<<<<<<<6<<<<8<<<<<<<<:8:8:88	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:88:451:1773	147	seq2	902	99	35M	=	742	-195	ATTGGCAGAACAGATTTAAAAACATGAACTAACTA	973776;;;;;;;;;::;;;;;;;;;;;;;;3;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:178:187:610	147	seq2	903	99	35M	=	744	-194	TTGGCAGAACAGATTTAAAAACATGAACTAACTAT	66:,:<7<<<<<<<1<<<<<<<<<<<<<<<2<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:38:332:54	83	seq2	904	99	36M	=	737	-203	TGGCAGAACAGATTTAAAAACATGAACTAACTATAT	8;;&<;<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:210:674:911	147	seq2	904	99	35M	=	740	-199	TGGCAGAACAGATTTAAAAACATGAACTAACTATA	27;2<;<<5<<<<;;<<<<<;<<<<<<;<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:82:963:128	83	seq2	905	99	35M	=	719	-221	GGCAGAACAGATTTAAAAACATGAACTAACTATAT	585<;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:12:1335:1372	83	seq2	906	99	40M	=	721	-225	GAAGAACAGATTTAAAAACATGAACTAACTATATGCTGTT	:&;;;<*<<<9<<<<<<<<<<<<<<4<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_39:1:98:641:1040	147	seq2	907	99	35M	=	1085	213	CAGAACAGATTTAAAAACATGAACTAACTATATGC	<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:41:530:663	83	seq2	908	99	35M	=	730	-213	AGAACAGATTTAAAAACATGAACTAACTATATGCT	=8=;*=5==;;=====:=====;===;========	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:87:430:995	147	seq2	909	67	35M	=	731	-213	GAAAAGAGTTAAAAACATGAACTAACTATATGCTG	1<4%81<..1<<<<<0<<<<<0.<<9<<(<6<<6<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:17	H0:i:0	H1:i:1
+B7_595:3:85:964:950	147	seq2	910	99	35M	=	1095	220	AACAGATTTAAAAACATGAACTAACTATATGCTGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:8:68:570:705	83	seq2	910	99	35M	=	1100	225	AACAGATTTAAAAACATGAACTAACTATATGCTGT	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<8<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:198:503:669	83	seq2	912	99	35M	=	1107	230	CAGATTTAAAAACATGAACTAACTATATGCTGTTT	<<<<<<<<<<;8<<<<<;<<<<<<;<;<8<<8<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:273:545:1001	147	seq2	913	99	35M	=	1088	210	AGATTTAAAAACATGAACTAACTATATGCTGTTTA	<<<<<<<<<<<<<<<;;<<<<<<;<8;28<8;<<8	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:152:778:228	83	seq2	915	99	35M	=	739	-211	ATTTAAAAACATGAACTAACTATATGCTGTTTACA	<;;7=<<<<<<;<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:53:463:1132	147	seq2	915	99	40M	=	1109	234	ATTTAAAAACATGAACTAACTATATGCTGTTTACANGAAA	<<<<<<<<<<<<<<<<<<<<<;<<<8<<<<<<<8<!1488	MF:i:18	Aq:i:71	NM:i:1	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:12:630:707	147	seq2	915	99	35M	=	751	-199	ATTTAAAAACATGAACTAACTATATGCTGTTTACA	<:<<<<<<<;<<<<<9<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:179:119:876	147	seq2	917	60	35M	=	1112	230	TTAAAAACATGAACTAACTATATGCTGTTTACCAG	<<<<<<<7<<<<<<<8<<<6<<<<<<7<<<:0&<0	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:1
+EAS1_97:6:308:667:658	83	seq2	918	10	35M	=	1116	233	TAAAAACATGAACTAACTATATCCTTCTTACAATA	9<96<<<;<96<<9<51<<<<<1:9++<9*%4;*5	MF:i:18	Aq:i:10	NM:i:4	UQ:i:45	H0:i:0	H1:i:0
+EAS114_28:5:163:832:715	147	seq2	918	99	36M	=	1085	203	TAAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<0;<9<<<<<<<<<<<<9<<<<<<<<<<<<;;;<6	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:179:496:161	83	seq2	919	99	36M	=	756	-199	AAAAACATGAACTAACTATATGCTGTTTACAAGAAA	<<<<<9<<<<<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:8:13:325:483	147	seq2	919	99	35M	=	1101	217	AAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_103:7:139:578:951	147	seq2	919	98	35M	=	1095	211	AAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<0;;	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_108:8:19:929:765	83	seq2	919	98	35M	=	1069	185	AAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;77<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:5:214:644:390	147	seq2	919	72	35M	=	1082	198	AAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<;<;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_30:6:243:209:110	83	seq2	920	48	35M	=	768	-187	AAAACATGAACTAACTATATGCTGTTTACAAGAAA	;<;;;:<:<:;<<;;<;<;<;7<<;<<;;<;<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:247:900:123	83	seq2	920	99	35M	=	1123	238	AAAACATGAACTAACTATATGCTGTTTACAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;<;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS51_62:7:162:195:761	83	seq2	922	30	35M	=	767	-190	AACATGAACTAACTATATGCTGTTTACAAGAAACT	<<8<<:<<:<<<<<<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_103:2:184:980:396	147	seq2	923	99	35M	=	1092	204	ACATGAACTAACTATATGCTGTTTACAAGAAACTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:162:272:415	83	seq2	923	83	35M	=	1112	224	ACATGAACTAACTATATGCTGTTTACAAGAAACTC	<<<<<<<<<<<<<<<<<<<<<<;<<<<<9;<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:184:237:476	147	seq2	925	99	35M	=	1101	211	ATGAACTAACTATATGCTGTTTACAAGAAACTCAT	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;<;;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:202:341:984	83	seq2	926	99	35M	=	1094	203	TGAACTAACTATATGCTGTTTACAAGAAACTCATT	=========================4;========	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:107:738:484	83	seq2	926	75	35M	=	1097	206	TGAACTAACTATATGCTGTTTACAAGAAACTCATT	<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:7:492:1088	147	seq2	926	57	35M	=	769	-192	TGAACTAACTATATGCTGTTTACAAGAAACTCATT	4;<<75<<::<:<<<-<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_11:1:81:1019:558	83	seq2	926	77	35M	=	760	-201	TGAACTAACTATATGCTGTTTACAAGAAACTCATT	<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:10:1312:1558	83	seq2	928	76	35M	=	771	-192	AACTAACTATATGCTGTTTACAAGAAACTCATTAA	<<:<<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:206:741:810	83	seq2	929	99	34M	=	753	-210	ACTAACTATATGCTGTTTACAAGAAACTCATTAA	<3<<;5<<<<<;:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:200:65:291	147	seq2	930	99	35M	=	728	-237	CTAACTATATGCTGTTTACAAGAAACTCATTAATA	;9<;3<<9<7<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:38:670:564	147	seq2	930	73	35M	=	770	-195	CTAACTATATGCTGTTTACAAGAAACTCATTAATA	3<<<3:<<<<<:;<<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:57:1114:2032	83	seq2	931	99	35M	=	1102	206	TAACTATATGCTGTTTACAAGAAACTCATTAATAA	<7<<<<<<<<<<<<<<<<<777<<<7<<<<<3<<7	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:125:137:58	83	seq2	932	76	35M	=	772	-195	AACTATATGCTGTTTACAAGAAACTCATTAATAAA	<<9;<<<<<;<;<<<<;<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:1:38:250:647	147	seq2	933	71	35M	=	1100	202	ACTATATGCTGTTTACAAGAAACTCATTAATAAAT	<<<<<<<9<<9<<<<<<<6<<<<<<<<<<8<779%	MF:i:18	Aq:i:0	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS192_3:6:116:464:261	83	seq2	934	99	35M	=	1107	208	CTATATGCTGTTTACAAGAAACTCATTAATAAAGA	<<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<;;8<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:168:69:249	147	seq2	936	99	35M	=	1125	224	ATATGCTGTTTACAAGAAACTCATTAATAAAGACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:246:647:765	147	seq2	937	99	35M	=	1119	217	TATGCTGTTTACAAGAAACTCATTAATAAAGACAT	;<<<<<<<<<;<&<<3+3<<<3<<9&</:/87</8	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:3:307:113:346	147	seq2	938	99	35M	=	1123	220	ATGCTGTTTACAAGAAACTCATTAATAAAGACATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<8	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:159:493:275	147	seq2	939	72	35M	=	760	-214	TGCTGTTTACAAGAAACTCATTAATAAAGACATGA	4949;<<<<<<<<<<<6<;<<<<;<<<<<*<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:257:288:731	83	seq2	939	99	34M	=	1131	227	TGCTGTTTACAAGAAACTCATTAATAAAGACATG	<<<<<<<<8<8<<;<;<<<;<<<5<;;88.8<6<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:231:815:626	147	seq2	940	99	35M	=	1119	214	GCTGTTTACAAGAAACTCATTAATAAAGACATGAG	<;<<<<9<<<<<<<<<<<<<<<<<;<<;5<<<;:;	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:93:77:1338	147	seq2	940	10	35M	=	1098	193	GCTGCTTACAAGAAGCGCATTAATAAAGACATGAG	<<<<*<2<<<:<4<&<6<8<4<::<8<<<<82;;7	MF:i:18	Aq:i:0	NM:i:3	UQ:i:35	H0:i:0	H1:i:0
+EAS114_45:2:54:1886:719	83	seq2	941	99	35M	=	1125	219	CTGTTTACAAGAAACTCATTAATAAAGACATGAGT	;;;9;;<;;;9;;;;;:;<9;:;;;;9;;;99799	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:94:273:165	83	seq2	945	99	35M	=	1128	218	TTACAAGAAACTCATTAATAAAGACATGAGTTCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;:7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:5:32:461:154	147	seq2	945	71	35M	=	769	-211	TTACAAGAAACTCATTAATAAAGACATGAGTTCAG	;;</<<<<<;:<.<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:303:131:673	147	seq2	947	99	36M	=	1112	201	ACAAGAAACTCATTAATAAAGACATGAGTTCAGGTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:10:106:737	147	seq2	947	99	35M	=	1106	194	ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT	<<<;<1<;<<<<<<9<<<<;;<<<<<99<<94008	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:214:950:32	147	seq2	947	99	35M	=	1132	220	ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT	>>=>>>>==>=>>>==>=>=:=====;=:=6:::6	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:10:686:1024	147	seq2	947	99	35M	=	1103	191	ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT	<:<<<<:<<<<<<<<<<:<:<<<<<<<<<<<5<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:53:61:31	147	seq2	949	99	35M	=	1122	208	AAGAAACTCATTAATAAAGACATGAGTTCAGATAA	<<<7;<7<<<;7<;;<7<7<7<;5<73<<</%;/;	MF:i:18	Aq:i:66	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS114_28:6:185:87:475	83	seq2	949	99	36M	=	786	-199	AAGAAACTCATTAATAAAGACATGAGTTCAGGTAAA	<<4<<<+<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:235:899:847	83	seq2	950	99	35M	=	1112	197	AGAAACTCATTAATAAAGACATGAGTTCAGGTAAA	<<3<;<<<<<<<<<;;<<<<<<<+<<<+6<8<3/<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:193:661:771	147	seq2	952	99	35M	=	1129	212	AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG	<<<<<<<<<;<<<;;;<<<<<;<<<=;<:;5:9::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:113:408:211	147	seq2	952	99	35M	=	789	-198	AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG	<:;:;:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:24:718:322	83	seq2	953	23	35M	=	779	-209	AACTCATTAATAATGTCATGAGTTCAGGTAAAGGG	5:+:0;**&+<00&<&<<<5<28<<;;<83<<<<<	MF:i:18	Aq:i:23	NM:i:2	UQ:i:10	H0:i:0	H1:i:0
+EAS56_61:5:263:314:696	147	seq2	953	99	35M	=	1117	199	AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG	<<<<<<<<<<<<<<;<<<<<<<<<<<<:<<;<775	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:93:312:331	147	seq2	953	99	35M	=	1145	227	AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:3:181:93:694	83	seq2	954	99	35M	=	783	-206	ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG	<4;8<<+<<:<<<<<<<<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:238:803:383	147	seq2	954	75	35M	=	779	-210	ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG	;;<;;<<<<<<<<<<<<<<<<;:<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:44:77:1255	147	seq2	955	99	35M	=	1113	193	CTCATTAATAAAGACATGAGTTCAGGTAAAGGGGT	;;;;;;;8;;;7;8;;;;;;;;;;886;;;76777	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:232:364:583	147	seq2	956	71	35M	=	780	-211	TCATTAATAAAGACATGAGTTCAGGTAAAGGGGTG	;%;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:256:354:173	147	seq2	957	99	36M	=	1121	200	CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:138:211:582	147	seq2	957	99	35M	=	788	-204	CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG	:<8;<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:61:631:567	83	seq2	957	99	35M	=	1131	209	CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:56:1757:1319	83	seq2	957	67	35M	=	775	-217	CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG	&7778<<<<<8<;<<:::;<:<4<<:<:;8<8<;<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:154:26:712	147	seq2	959	99	35M	=	786	-208	TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:10:975:766	147	seq2	959	99	35M	=	1166	242	TTAATAAAGACATGAGTTCAGGTAAAGGGGTGAAA	<<<<<<<<;<<<<;<:<<;<6;;<<<:6-:+1+;;	MF:i:18	Aq:i:64	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS54_73:5:220:733:736	83	seq2	959	99	35M	=	1143	219	TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<5<<;9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:46:1566:668	147	seq2	959	99	35M	=	1148	224	TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:59:871:351	83	seq2	963	99	35M	=	808	-190	TAAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAG	;<<<<<:<;<<<4;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:46:522:426	83	seq2	964	99	35M	=	807	-192	AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA	<<<<<:<<<<<<1/<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:157:876:302	83	seq2	964	99	35M	=	801	-198	AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA	===:=8=;==:892=,28==88==28====8=;;8	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:61:1369:440	83	seq2	964	47	35M	=	770	-229	AAAGACATGATTTCAGGTAAAGGGGTGGAAAAAGA	<<<<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+EAS221_1:6:57:1342:1166	147	seq2	964	99	35M	=	796	-203	AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA	<<<<<;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:310:287:420	147	seq2	965	99	35M	=	794	-206	AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT	<<<<;<;<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:262:53:888	83	seq2	965	99	35M	=	787	-213	AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:3:542:428	83	seq2	965	99	35M	=	797	-203	AAGACATGAGTTCAGGTACAGGGGTGGAAAAAGAT	<<876</3<8874:<8:<)<5<<<;<<<<7<<<:<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:8	H0:i:0	H1:i:1
+B7_593:2:81:435:410	147	seq2	966	99	36M	=	782	-220	AGACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT	;<;;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:85:219:371	83	seq2	967	99	35M	=	817	-185	GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT	<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:116:966:193	83	seq2	967	99	35M	=	815	-187	GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT	===================================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:30:432:228	147	seq2	967	99	35M	=	1145	213	GACATGAGTTCAGGGAAAGGGGTGGAAAAAGATGT	<<<<<<<<<<<<<<8<<<<<<<<<<<<:<<<<<;;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+B7_610:1:12:88:200	147	seq2	968	99	35M	=	1133	200	ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT	<<<<<<<<<<<;<<<<<<<;<<<:<<<<<<9<<5<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:313:711:530	83	seq2	968	99	35M	=	784	-219	ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT	<7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:74:866:49	147	seq2	969	99	35M	=	1143	209	CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC	====================9==91==<=6==;:=	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:248:17:435	83	seq2	969	99	35M	=	1139	205	CATGAGTTCAGGAAAAGGGGTGGAAAAAGATGTTC	<<<<8<<<888<+<<<<<;<:<<<<8<<<<<;3<3	MF:i:18	Aq:i:43	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS114_30:1:188:863:790	83	seq2	969	98	35M	=	783	-221	CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC	;<7<<<55<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:75:1503:1399	147	seq2	969	99	40M	=	1130	201	CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC	<<<<<<<<<<<<<<<<<<9<<<;<<<<<<;<<<<:::711	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:2:56:155:49	83	seq2	970	99	35M	=	1145	210	ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT	<<<<<<<<<<<<<<<<<<<<<<;<<;<<<;<9<9;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:295:547:216	83	seq2	970	99	35M	=	809	-196	ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:262:928:237	147	seq2	971	99	35M	=	787	-219	TGAGTTCAGGTAAAGGTGTGGAAAAAGATGTTCTA	;<<<<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS219_1:1:50:257:341	83	seq2	971	99	35M	=	813	-193	TGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:122:38:103	83	seq2	972	79	35M	=	778	-229	GAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTAC	===;3<===:=======<=================	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:82:670:302	83	seq2	973	99	35M	=	1146	208	AGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:24:415:944	147	seq2	974	99	35M	=	805	-204	GTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC	<;;<<<<:<<<<<<<;<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:108:440:208	83	seq2	975	99	35M	=	1142	202	TTCAGGTAAAGGGGAGGAAAAAGATGTTCTACGCA	<<<;<<<<<<<<<</<<<<;<<<;<<;<;<64/:+	MF:i:18	Aq:i:43	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+B7_595:3:229:543:583	83	seq2	976	99	35M	=	1139	198	TCAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAA	<<<<<<<<<<8<8<9<<<<8<<588<<<<*<2:2*	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:142:353:398	83	seq2	977	99	35M	=	807	-205	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA	===================================	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:102:543:160	83	seq2	977	99	35M	=	825	-187	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA	9==9=====;=====================<===	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:191:40:536	147	seq2	977	66	35M	=	1167	225	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA	<<<<<<<<8<<;<<8<<;<;;<<8<<<<<</<74/	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:272:328:400	147	seq2	977	99	35M	=	1151	209	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA	<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<7<;:7	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:69:1593:819	83	seq2	977	99	40M	=	786	-231	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA	);::7<<<<:;<<<<<<<<<<<<<<<9<<9<3<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_597:3:133:707:886	83	seq2	978	99	35M	=	1146	203	AGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAAC	<<<<7;<<<<<<<<<;<<<<<<<<<<<<<5<;66<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_591:4:92:411:955	83	seq2	979	99	36M	=	1149	206	GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_61:8:60:358:494	83	seq2	979	44	35M	=	1179	235	GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<:<:<<;;4;	MF:i:18	Aq:i:14	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_597:7:41:34:211	147	seq2	980	99	35M	=	1164	219	GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3:;5;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:40:1291:1045	83	seq2	980	99	35M	=	1167	222	GTAAAGGGGTGGAAAAAGATGTTCTACGCAACAAG	<<<<<<<<<5<<5<<<<7<<<<<<<<<5<9<&%73	MF:i:18	Aq:i:39	NM:i:2	UQ:i:9	H0:i:1	H1:i:0
+EAS218_1:8:90:706:1276	83	seq2	980	99	35M	=	814	-201	GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG	<;<<<<<<<;<<<<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_32:4:5:396:292	147	seq2	981	99	35M	=	1155	209	TAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGA	<<<<<<<<<<<<<<;;<<<<:<<<<;;<;;3/&+8	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:176:653:957	83	seq2	982	82	35M	=	819	-198	AAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA	===::=============<==<====<========	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS54_71:6:264:705:89	83	seq2	983	99	34M	=	1155	207	AAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA	<<<<<<<<<<;8<<<<<<<<<<<<<<<&<<,;;(	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:2:66:757:918	147	seq2	985	99	35M	=	1143	193	GGGGTGGAAAAAGATGTTCTACGCAAACAGAAACC	===================================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:7:114:506:971	147	seq2	986	99	35M	=	1150	199	GGGTGGAAAAAGATGTTCTACGCAAACAGAAACCA	===================================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:220:809:850	83	seq2	986	60	35M	=	1187	236	GGGGGGAAAAAGATGTGCTACACAAAAAGATTCCA	<<;7;<<0::8<-6:<0624-*<&-93-,8+(&08	MF:i:-126	Aq:i:60	NM:i:4	UQ:i:64	H0:i:0	H1:i:0
+B7_589:7:76:306:561	83	seq2	987	89	35M	=	794	-228	GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA	9<7<<9<<<<<<7<<71<71*7<<<<<<<<<<1<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS192_3:6:235:505:553	83	seq2	987	99	35M	=	808	-214	GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA	;8518<<<<<;<;<<<;<<;<.<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:19:695:59	147	seq2	988	99	36M	=	826	-198	GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAAT	;+;8<<<<<<<<<<<5<<+<:<<;<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:136:260:254	147	seq2	988	99	35M	=	813	-210	GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA	;:;;<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:5:266:133:789	147	seq2	988	99	35M	=	810	-213	GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA	9;;<<<<<<<<<<<<5<<;<5<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_591:4:159:508:571	147	seq2	989	84	36M	=	834	-191	TGGAAAAAGATGTTCTACGCAAACAGAAACCAAATG	9<6<<<<<<<<<<<;<<;<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:166:84:766	147	seq2	990	99	35M	=	1167	212	GGAAAAAGATGTTCTACGCAAACAGAAACCAAATG	<<<<<<<<;<<<<<<<<;<<<<<<;<<<7<;::93	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_61:6:283:963:234	83	seq2	992	99	35M	=	1157	200	AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG	<<<<<<<<<<<<<<<;<<<<<<<<<<<;<<;<<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:4:184:659:377	83	seq2	992	99	35M	=	1173	216	AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:305:707:258	147	seq2	992	58	36M	=	831	-197	AAAAAGATGTTCTACGCAAGCAGAAACCAAATGAGA	3<<7<,;<<<<0<66<6+<%<<<.<<<<<<<<<9<<	MF:i:18	Aq:i:17	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS219_1:7:20:1444:328	83	seq2	993	99	35M	=	1149	191	AAAAGATGTTCTACGCAAACAGAAACCAAATGAGA	<<<<;<<<<<<<<;<<<<<<<<;<<<<<;<;;8:7	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:157:447:758	147	seq2	994	99	36M	=	833	-197	AAAGATGTTCTACGCAAACAGAAACCAAATGAGAGA	<<<;<<5<</<<6<5<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:37:763:1437	147	seq2	994	99	35M	=	1191	232	AAAGATGTTCTACGCAAACAGAAACCAAATGAGAG	;;;;;6;;;;;;;;;:;6;5;5;;;;;76;767/7	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:94:1273:1462	147	seq2	995	99	35M	=	1166	206	AAGATGTTCTACGCAAACAGAAACCAAATGAGAGA	<<<<<<<<<<<<:<<<<<<<<:<<<<:6:7;744;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:74:213:877	147	seq2	996	99	35M	=	816	-215	AGATGTTCTACGCAAACAGAAACCAAATGAGAGAA	<<<<<<<&<<-<-<<<7<<<<<77<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:2:168:61:867	147	seq2	997	99	35M	=	1188	226	GATGTTCTACGCAAACAGAAACCAAATGAGAGAAG	====7====================7======6==	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:307:252:632	147	seq2	998	99	35M	=	1142	179	ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<;;	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:37:604:389	83	seq2	998	99	35M	=	1188	225	ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG	<<<<<<<<<3<<<<<4<<<<<9<2;949<;35:95	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:147:687:428	83	seq2	998	99	35M	=	1159	196	ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:114:736:433	83	seq2	998	63	35M	=	832	-201	ATGTTCTACGCAAACAGAAACCAAGTGAGAGAAGG	<9<9+9;<6<9<<;9<<<<<;<<<99<<<<<<<<<	MF:i:18	Aq:i:18	NM:i:1	UQ:i:24	H0:i:0	H1:i:1
+B7_597:8:35:118:589	147	seq2	999	99	35M	=	1188	224	TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<<9	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:2:127:288:655	83	seq2	999	99	35M	=	803	-231	TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA	<<:<3<<:<.<<<;<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:260:827:289	83	seq2	999	99	35M	=	836	-198	TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA	6;99+<<<<<<<<<<<<<<6<<<<<7<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:82:843:1838	147	seq2	999	99	35M	=	804	-230	TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA	888829;;;;;;;;;;;;;;:;;;;;;;;;;;;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:8:64:350:174	147	seq2	1000	99	35M	=	1166	201	GTTCTACGCAAACAGAAACCAAATGAGAGAAGGAG	<<<<<<<<<<<<<<<<<<<<<:<<<<<6<<<<<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:8:327:522	83	seq2	1001	99	35M	=	826	-210	TTCTACGCAAACAGAAACCAAATGAGAGAAGGAGT	;;4;<-<-<<<7<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:126:361:250	147	seq2	1002	99	35M	=	810	-227	TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA	72:;7</<<<:<-7<<:<<<<<<<:<6<+:<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:189:571:366	147	seq2	1002	99	35M	=	1194	227	TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA	<<<<<<<<<<<<<<<<<<<<<<<<<7<:<<99;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:202:275:776	147	seq2	1002	99	36M	=	1196	230	TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTAG	<<<<<<<<<<<<<<<<<<<<<;<<9<;;<<<;<;<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:194:998:663	147	seq2	1002	99	35M	=	1165	198	TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA	<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<8<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:30:599:589	83	seq2	1003	99	36M	=	1188	221	CTACGCAAACAGAAACCAAATGAGAGAAGGAGCAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;<&<<;	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS112_34:4:92:412:435	83	seq2	1003	89	35M	=	1184	216	CTACGCAAACAGAAACCAANTGAGAGAAGGAGTAG	<<<<<<<4<<<<<<<<<66!<<<<<<6<<77<<97	MF:i:18	Aq:i:43	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+B7_610:2:75:887:149	83	seq2	1004	99	35M	=	823	-216	TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC	:<:<0<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:2:1422:1820	147	seq2	1004	99	35M	=	1164	195	TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC	;7;;;;;;;;:;;;;;;;;;;;;;;;;;;;77777	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:90:561:850	83	seq2	1004	85	35M	=	827	-212	TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC	78376<;;9<;<<;:9<<<6;<;<;;8;;<;/;;;	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:164:719:947	147	seq2	1005	99	35M	=	813	-227	ACGCAAACAGAAACCAAATGAGAGAAGGAGTAGCT	===,=========6====)================	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:154:952:558	83	seq2	1007	99	35M	=	1173	201	GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<:<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:58:923:1915	83	seq2	1007	99	40M	=	846	-201	GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA	:+;;;8<<<<<<,<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:253:175:31	83	seq2	1008	72	35M	=	1187	214	CAAACAGAAACCAAATGAGAGAAGGAGTAGCTATA	<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<:<;;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:2:29:729:70	83	seq2	1009	51	35M	=	850	-194	AAACAGAAACCAAATGAGAGAAGGAGTAGCTATAC	<<<:<<<<<<7<<<<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:174:157:573	147	seq2	1012	99	35M	=	1191	214	CAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:7:197:399:319	147	seq2	1012	99	35M	=	1189	212	TAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA	+<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;;<<;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_65:7:68:825:405	83	seq2	1015	30	35M	=	835	-215	AAACCAAATGAGAGAAGGAGTAGCTATACTTATAT	<<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:13:701:55	83	seq2	1015	99	36M	=	1187	208	AAACCAAATGAGAGAAGGAGTAGCTATACTTATATC	<<<<<<<<<9<<<9<<<<<<6<<<<<<<6<<6<<6+	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:128:555:941	153	seq2	1016	10	36M	*	0	0	AACCAAAAGAGAGAAGGAGTAGTTATACACATATCA	55--555560355$55555555.57757$7555577	MF:i:32	Aq:i:10	NM:i:4	UQ:i:58	H0:i:0	H1:i:0
+EAS219_FC30151:1:53:140:421	147	seq2	1016	99	35M	=	1185	204	AACCAAATGAGAGAAGGAGTAGCTATACTTATATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:64:526:339	83	seq2	1019	96	35M	=	819	-235	CAAATGAGAGAAGGAGTATCTATACTTATATCAGA	3<<<7<<;<<<<<<<<<<<;<<<<;<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS192_3:3:194:378:230	147	seq2	1022	99	35M	=	1198	211	ATGAGAGAAGGAGTAGCTATACTTATATCAGATAA	<<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:45:239:851	147	seq2	1023	61	35M	=	1211	223	TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA	<<88;<208<9<;6<<<6269;94<&401-662&2	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:39:956:676	147	seq2	1023	99	35M	=	1191	203	TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA	;;;;;;;;;;;;9;;;;;;;;;;;;;;;9957777	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:15:1763:1143	83	seq2	1023	99	35M	=	1193	205	TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:309:109:987	147	seq2	1024	99	35M	=	1194	205	GAGAGAAGGAGTAGCTATACTTATATCAGATAAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<;<;;;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_593:3:102:856:670	147	seq2	1025	99	36M	=	836	-225	AGAGAAGGAGTAGCTATACTTATATCAGATAAAGCA	;;<<<<:<<<:<<4<<<<<<<<;<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+B7_610:6:107:252:533	147	seq2	1025	60	35M	=	1173	183	AGAGAAGGAGTAGCTATACTTATATCAGATAAAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:3	H1:i:3
+EAS56_65:4:126:966:514	83	seq2	1027	99	35M	=	865	-197	AGAAGAAGTAGCTATACTTATATCAGATAAAGCAC	<4<<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:4	H0:i:1	H1:i:1
+EAS114_26:1:171:527:247	147	seq2	1027	67	35M	=	1194	202	AGAAGGAGTAGCTAGACTTATATCAGATAAAGCAC	=4==4===8==99=&=8+9=19+.2.6'=99+999	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:0	H1:i:3
+EAS1_105:1:234:185:359	147	seq2	1029	46	35M	=	1183	189	AAGGAGTAGCTATACTTATATCAGATAAAGCACAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;9--:	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:11
+EAS51_66:3:155:375:623	83	seq2	1029	99	35M	=	849	-215	AAGGAGTAGCTATACTTATATCAGATAAAGCACAC	;;;;<<:<<<<;<<;<<<<<<;<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_19:5:4:939:2021	147	seq2	1031	99	40M	=	1197	206	GGAGTAGCTATACTTATATCAGATAAAGCACACTTTAAAT	<<<<<<<<<<<<<<<<<<<<<97<<<;<<;<7;<<:48::	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:2
+EAS220_1:2:50:513:882	147	seq2	1031	99	35M	=	1192	196	GGAGTAGCTATACTTATATCAGATAAAGCACACTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:2	H1:i:14
+EAS1_103:5:188:20:592	147	seq2	1032	95	35M	=	1202	205	GAGTAGCTATACTTATATCAGATAAAGCACACTTT	<<<<<<<<<<<<<<<<<<<<;;<<<<:<<<;<;;<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:3	H1:i:16
+EAS114_45:3:35:896:1588	147	seq2	1032	91	35M	=	1205	208	GAGTAGCTATACTTATATCAGATAAAGCACACTTT	;;;;;;;;;;;;;;;;;;;;8;;;;;8;;;88989	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:3	H1:i:18
+EAS1_108:6:73:735:329	147	seq2	1035	99	35M	=	868	-202	TAGCTATACTTATATCAGATAAAGCACACTTTAAA	;;;9;<<7<<<<<<<<<<<<<<<<<<<2<<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:133:514:754	83	seq2	1036	63	36M	=	855	-217	AGCTATACTTATATCAGATAAAGCACACTTTAAATC	;;4;<;<;<<<<<<<<;<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS218_1:4:62:561:531	147	seq2	1036	99	35M	=	1203	202	AGCTATACTTATATCAGATAAAGCACACTTTAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_593:6:119:428:415	83	seq2	1037	99	36M	=	876	-197	GCTATACTTATATCAGATAAAGCACACTTTAAATCA	84<<<<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_30:2:226:885:729	147	seq2	1037	98	35M	=	867	-205	GCTGAACTTACATCAGATAAAGCACACTTTAAATC	/*220%.(;<%<3.<<<4<<<<86;<8<<8<<<<<	MF:i:18	Aq:i:30	NM:i:3	UQ:i:36	H0:i:0	H1:i:1
+EAS1_108:1:189:863:213	147	seq2	1039	99	35M	=	1202	198	TATACTTATATCAGATAAAGCACACTTTAAATCAA	<<<<<<<<<<<<<<<<<<<<;<<<;<<<<;7<9;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_597:4:146:961:63	83	seq2	1041	86	35M	=	861	-215	TACTTATATCAGATAAAGCACACTTTAAATCAACA	7;;<<<<<;<<<7<<<<<<<<;;<<;<;<<;<<<7	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:68:996:104	83	seq2	1041	70	35M	=	1214	208	TACTTATATCAGATAAAGCACACTTTAAATCAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:47:1791:444	147	seq2	1041	74	35M	=	1213	207	TACTTATATCAGATAAAGCACACTTTAAATCAACA	;3;;;;;;;;;;;;;;;;;;;;;;;;;;;877977	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:1:156:196	147	seq2	1042	77	40M	=	867	-215	ACTTATATCAGATAAAGCACACTTTAAATCAACAACAGTA	:::::<<<<<<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:70:1349:1788	147	seq2	1043	99	35M	=	1203	195	ATTATATCAGATAAAGCACACTTTAAATCAACAAC	&<8<<<85:580;<:0-><;>588>9<>7:<0<9;	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_589:2:30:644:942	83	seq2	1045	83	35M	=	1229	219	TATATCAGATAAAGCACACTTTAAATCAACAACAG	<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<9;<9<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+B7_591:2:123:924:645	83	seq2	1045	84	36M	=	861	-220	TATATCAGATAAAGCACACTTTAAATCAACAACAGT	;<<<<*<<<<<<</7<2<8<<<<<<<4<<<<<<<<<	MF:i:18	Aq:i:11	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_589:5:147:405:738	83	seq2	1048	99	35M	=	870	-213	ATCAGATAAAGCACACTTTAAATCAACAACAGTAA	<9/<:<<<<<<<<7</<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_61:3:155:758:710	83	seq2	1048	98	35M	=	859	-224	ATCAGATAAAGCACACTTTAAATCAACAACAGTAA	=46=4=5===:========:=7=7======11===	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_73:7:254:572:431	83	seq2	1048	97	35M	=	891	-192	ATCAGATAAAGCACACTTTAAATCAACAACAGTAA	<63<;<;<<<:7<:<7;<:<<<<:<<<<7<<<<:<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_57:7:33:954:724	147	seq2	1049	97	35M	=	1210	196	TCAGATAAAGCACACTTTAAATCAACAACAGTAAA	;<<<<<<<<<<<<<8<<<<:<;;<<;;<;<<;;;;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_63:6:102:816:260	83	seq2	1049	99	35M	=	1225	211	TCAGATAAAGCACACTTTAAATCAACAACAGTAAA	<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;;;;	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS192_3:5:197:914:256	83	seq2	1049	97	35M	=	1204	190	TCAGATAAAGCACACTTTAAATCAACAACAGTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8;:::	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_65:4:150:94:843	147	seq2	1050	0	35M	=	868	-217	CAGATACATCCCACTTTAAATCAACCACAGTAAAA	4<9<41*747*7<:9<:7:::<72;+<;::<7<<<	MF:i:18	Aq:i:0	NM:i:4	UQ:i:47	H0:i:0	H1:i:0
+EAS1_108:5:321:712:224	147	seq2	1051	58	35M	=	1220	204	AGATAAAGCACACTTTAAATCAACAACAGAAAAAT	<<<<<<<<2<<<<<<<<<<<<<<<:<<<<(<<:<,	MF:i:18	Aq:i:28	NM:i:1	UQ:i:7	H0:i:1	H1:i:2
+EAS114_32:3:236:475:254	83	seq2	1051	99	35M	=	880	-206	AGATAAAGCACACTTTAAATCAACAACAGTAAAAT	<:<<<<<;9<7<;<<<<<<<<<<9<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:72:1288:1211	83	seq2	1052	84	35M	=	1235	218	GATAAAGCACACTTTAAATCAACAACAGTAAAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_65:2:264:157:150	83	seq2	1054	30	35M	=	1238	219	TAAAGCACACTTTAAATCAACAACAGTAAAATAAA	<<<<<<9<9<<<<.9;<<9&<97<;9933309605	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS1_95:7:310:800:761	147	seq2	1055	99	35M	=	1249	229	AAAGCACACTTTAAATCAACAACAGTAAAATAAAA	===========================+=======	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:88:465:1877	83	seq2	1055	99	35M	=	1212	192	AAAGCACACTTTAAATCAACAACAGTAAAATAAAA	<<<<<<<<<<;<<<<<<<<<<<<<<<<7<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:66:891:294	147	seq2	1057	99	35M	=	1233	211	AGCACACTTTAAATCAACAACAGTAAAATAAAACA	<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:100:735:530	147	seq2	1058	99	35M	=	1257	234	GCACACTTTAAATCAACAACAGTAAAATAAAACAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:68:440:424	83	seq2	1060	99	35M	=	1237	212	ACACTTTAAATCAACAACAGTAAAATAAAACAAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS220_1:8:66:1046:167	83	seq2	1060	99	35M	=	1241	216	ACACTTTAAATCAACAACAGTAAAATAAAACAAAG	<<<<<:<<<<<<<<<<<<<9<;77<9<7<<;<9;-	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_81:6:11:801:386	83	seq2	1061	97	35M	=	868	-228	CACTATAAATCAACAACAGTAAAATAAAACAAAGG	5<2:$6<<<38<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:3	H0:i:1	H1:i:1
+EAS114_28:2:141:7:963	147	seq2	1061	85	36M	=	1240	215	CACTTTAAATCAACAACAGTAAAATAAAACAAAGGA	<<<<<<<<<<<<;<:<<<<<<1<<&<;<;<<;,<;5	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:55:296:1457	147	seq2	1061	99	35M	=	884	-212	CACTTTAAATCAACAACAGTAAAATAAAACAAAGG	-<%63<<<<<1<<<<<5<<<<<<<<<<<<<<<7<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_19:1:58:726:1746	83	seq2	1061	99	40M	=	900	-201	CAATTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTC	&:&::;<<<76<<:<<6<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS221_1:8:15:881:1932	147	seq2	1061	92	35M	=	886	-210	CACTTTAAATCAACAACAGTAAAATAAAACAAAGG	)<4<<<<<<<4<<4<<4<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_95:5:284:212:932	83	seq2	1063	10	35M	=	1257	229	CTTTAAATCAACAACAATAAAAAAAAACAAAGGAG	<<9<<<<<<<<<<<<<&&<<<<5<<<<8<<<1:<:	MF:i:18	Aq:i:0	NM:i:2	UQ:i:25	H0:i:0	H1:i:0
+EAS139_19:4:18:1335:1514	83	seq2	1063	99	40M	=	1235	212	CTTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTCAT	<<<;<<<<<<<<<<<<<<<;<:<<;<<<<<<;<;<;;;9;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:273:424:207	83	seq2	1066	99	35M	=	891	-210	TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:62:1076:540	147	seq2	1066	99	35M	=	882	-219	TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC	6<<;:+=====5=:6===================2	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:113:856:319	83	seq2	1067	99	33M	=	884	-216	AAATCAACAACAGTAAAATAAAACAAAGGAGGT	<<<77<<:<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:8:19:929:765	147	seq2	1069	98	35M	=	919	-185	ATCAACAACAGTAAAATAAAACAAAGGAGGTCATC	<3+<<;<<;<<<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:88:54:900	147	seq2	1069	68	35M	=	1257	223	ATCAACAACAGAAAAATAAAACAAAGGAGGTCATC	.....&.....,.......................	MF:i:18	Aq:i:19	NM:i:1	UQ:i:11	H0:i:0	H1:i:1
+EAS56_63:7:109:22:383	147	seq2	1071	99	35M	=	1244	208	CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<;<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:4:571:820	83	seq2	1071	99	35M	=	891	-215	CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT	&<<7<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:255:441:47	83	seq2	1072	99	35M	=	1237	200	AACAACAGTAAAATAAAACAAAGGAGGTCATCATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<;:<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:66:718:481	147	seq2	1072	99	40M	=	891	-221	AACAACAGTAAAATAAAACAAAGGAGGTCATCATACAATG	::5::1<;;<<<<<<1<<<<<<<<<<<<7<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:155:807:19	147	seq2	1074	99	35M	=	867	-242	CAACAGTAAAATAAAACAAAGGAGGTCATCATACA	:==4=5:====:============:==========	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:43:1229:1855	147	seq2	1074	99	35M	=	1244	205	CAACAGTAAAATAAAACAAAGGAGGTCATCATACA	<<<<<<<<<<<<<<<<<<<<<<<<<4<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:125:875:553	83	seq2	1075	99	36M	=	1233	194	AACAGTAAAATAAAACAAAGGAGGTCATCATACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<;	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:118:775:467	147	seq2	1075	99	35M	=	1245	205	AACAGTAAAATAAAACAAAGGAGGTCATCATACAA	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:301:161:195	83	seq2	1076	75	35M	=	1239	198	ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT	<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:54:695:952	83	seq2	1076	99	35M	=	1264	223	ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:77:589:741	147	seq2	1078	99	35M	=	1263	220	AGTAAAATAAAACAAAGGAGGTCATCATACAATGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:200:263:280	147	seq2	1078	99	35M	=	1236	193	AGTAAAATAAAACAAAGGAGGTCATCATACAATGA	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;8<;1	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:64:199:1288	83	seq2	1079	77	35M	=	1240	196	GTAAAATAAAACAAAGGAGGTCATCATACAATGAT	<<<<<<<<<<<<<<;<<<<<<<<<<<<<<;<<<;<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:27:228:31	83	seq2	1082	99	35M	=	1264	217	AAATAAAACAAAGGAGGTCATCATACAATGATAAA	<<<<<<<<<<<<<<<<<;9<:;<<<<<<75<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:214:644:390	83	seq2	1082	72	35M	=	919	-198	AAATAAAACAAAGGAGGTCATGATACAATGATAAA	<<<;<<<<<<<<<<<<<<<<<&<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS114_45:2:79:554:354	83	seq2	1082	63	35M	=	1242	195	AAATAAAACAAAGGAGGTCATCATACAATGATAAA	17;<;;+<<;;;;93;;:;3;;;;1;;;;<77744	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:303:542:924	147	seq2	1083	76	35M	=	1242	194	AATAAAACAAAGGAGGTCATCATACAATGATAAAA	<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:8:26:242:35	83	seq2	1084	99	35M	=	1251	202	ATAAAACAAAGGAGGTCATCATACAATGATAAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:163:832:715	83	seq2	1085	99	36M	=	918	-203	TAAAACAAAGGAGGTCATCATACAATGATAAAAAGA	;<<<<9<<<<<<<<;;<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:98:641:1040	83	seq2	1085	99	35M	=	907	-213	TAAAACAAAGGAGGTCATCATACAATGATAAAAAG	4<<<<7<<<<<<<<<:<<;<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:32:562:1695	83	seq2	1085	76	35M	=	1258	208	TAAAACAAAGGAGGTCATCATACAATGATAAAAAG	<<<<<<<<<<<<<<8<<<<<:<<<<<<<:<8<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:6:758:988	147	seq2	1087	99	35M	=	1253	201	AAACAAAGGAGGTCATCATACAATGATAAAAAGAT	3+;0;0;;;0;;;;;;5;;;9;;;;90;;;57560	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:273:545:1001	83	seq2	1088	99	35M	=	913	-210	AACAAAGGAGGTCATCATACAATGATAAAAAGATC	<7(<<72;<2;27<;:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:74:656:272	147	seq2	1088	99	35M	=	1245	192	AACAAAGGAGGTCATCATACAATGATAAAAAGATC	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:198:564:731	83	seq2	1089	99	35M	=	898	-226	ACAAAGGAGGTCATCATACAATGATAAAAAGATCA	<6<;<<<<<<:7<<;<<<8<<+<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:23:885:274	83	seq2	1089	99	35M	=	1289	235	ACAAAGGAGGTCATCATACAATGATAAAAAGATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<;;<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:22:632:176	83	seq2	1091	99	36M	=	894	-233	AAAGGAGGTCATCATACAATGATAAAAAGATCAATT	<9<<<<<<<-;<;<<7;6;<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:184:980:396	83	seq2	1092	99	35M	=	923	-204	AAGGAGGTCATCATACAATGATAAAAAGATCAATT	<<;;<77;;<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:110:984:98	83	seq2	1092	99	36M	=	1270	214	AAGGAGGTCATCATACAATGATAAAAAGATCAATTC	98<<<<<<2<<<<<<;;<;;<<<5;5;<<;;<<<<+	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:202:341:984	147	seq2	1094	99	35M	=	926	-203	GGAGGTCATCATACAATGATAAAAAGATCAATTCA	<<<(<8&<92<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:219:40:833	147	seq2	1094	99	35M	=	1278	219	GGAGGTCATCATACAATGATAAAAAGATCAATTCA	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:23:1126:1886	83	seq2	1094	99	35M	=	1268	209	GGAGGTCATCATACAATGATAAAAAGATCAATTCA	7<<<7<<<<<<<<7<<<<<<<<<<<<<;8<;<<5<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:85:964:950	83	seq2	1095	99	35M	=	910	-220	GAGGTCATCATACAATGATAAAAAGATCAATTCAG	<<8::<<;;<<<;<<6<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:139:578:951	83	seq2	1095	98	35M	=	919	-211	GAGGTCATCATACAATGATAAAAAGATCAATTCAG	;<0;:&<:9<<<7<<<<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:107:738:484	147	seq2	1097	75	35M	=	926	-206	GGTCATCATACAATGATAAAAAGATCAATTCAGCA	.8/<<<7<8<<<<<<<<<<<<<<<<9<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_39:4:93:77:1338	83	seq2	1098	10	35M	=	940	-193	GTCATCATACAATGAAAAAAAGATCAATTCAGCAA	<<7<7<<<<<1<7<<&97;;<1<;1<<7<;7<<;<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_610:8:68:570:705	147	seq2	1100	99	35M	=	910	-225	CATCATACAATGATAAAAAGATCAATTCAGCAAGA	4<;4<;;:<<<<<<<<;<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS51_62:1:38:250:647	83	seq2	1100	71	35M	=	933	-202	AATAATAAAATGATAAAAAGATCAATTCAGCAAGA	+<&+<1<,<<7<<7<<<<<<<1,<<<<7<<2<<<<	MF:i:18	Aq:i:0	NM:i:3	UQ:i:34	H0:i:0	H1:i:3
+EAS1_93:8:13:325:483	83	seq2	1101	99	35M	=	919	-217	ATCATACAATGATAAAAAGATCAATTCAGCAAGAA	;:;<;=:========;==========;========	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:128:584:952	147	seq2	1101	99	35M	=	1277	211	ATCATACAATGATAAAAAGATCAATTCAGCAAGAA	<<<<<<<<<<<<<<+<;<<<<<<;<<<;<<<+<66	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:184:237:476	83	seq2	1101	99	35M	=	925	-211	ATCATACAATGATAAAAAGATCAATTCAGCAAGAA	<;2<;<4<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+EAS51_64:6:300:622:86	147	seq2	1102	99	35M	=	1264	197	TCATACAATGATAAAAAGATCAATTCAGCAAGAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:57:1114:2032	147	seq2	1102	99	35M	=	931	-206	TATTACAATGATAAAAAGATCAATTCAGCAAGAAG	;+!5<4<<<<<<<<<<<<<;<&<;7<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:10	H0:i:1	H1:i:6
+B7_593:3:310:193:629	147	seq2	1103	99	36M	=	1267	200	CATACAATGATAAAAAGATCAATTCAGCAAGAAGAT	<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:6:529:366	83	seq2	1103	99	35M	=	1291	223	CATACAATGATAAAAAGATCAATTCAGCAAGAAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:10:686:1024	83	seq2	1103	99	35M	=	947	-191	CATACAATGATAAAAAGATCAATTCAGCAAGAAGA	&<<<3<<<<<<<<<<<<<<7<<<<<<<<<<7<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS114_45:7:14:978:1296	147	seq2	1104	90	35M	=	1249	180	ATACAATGATAAAAAGATCAATTCAGCAAGAAGAT	;6;;;;;;;;;;;:;;;;;;;6;;;;;;;;77777	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS56_57:2:237:855:581	83	seq2	1105	87	35M	=	1271	201	TACAATGATAAAAAGATCAATTCAGCAAGAAGATA	<;4<7<<<;47<<74<:*<<2:<<7.799:2<<9:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+EAS139_19:7:85:262:751	147	seq2	1105	99	40M	=	1305	240	TACAATGATAAAAAGATCAATTCAGCAAGAAGATATAACC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::92	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:10:106:737	83	seq2	1106	99	35M	=	947	-194	ACAATGATAAAAAGATCAATTCAGCAAGAAGATAT	<-<<;<<<<<<<<<<<;<<<<;<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:6
+B7_610:6:143:620:158	147	seq2	1107	99	35M	=	1283	211	CAATGATAAAAAGATCAATTCAGCAAGAAGATATA	<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS54_67:6:198:503:669	147	seq2	1107	99	35M	=	912	-230	CAATGATAAAAAGATCAATTCAGCAAGAAGATATA	5<<:<<;<<<<<<<;;<<9<<<<<<<<;<<<<;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS192_3:6:116:464:261	147	seq2	1107	99	35M	=	934	-208	CAATGATAAAAAGATCAATTCAGCAAGAAGATATA	;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_73:5:263:557:988	83	seq2	1108	84	35M	=	1289	216	AATGATAAAAAGATCAATTCAGCAAGAAGATATAA	<<<<<<<<<<<<<<<<<<<<<;;<<<<<<<<;<<<	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:8
+EAS139_19:1:53:463:1132	83	seq2	1109	99	40M	=	915	-234	ATGATAAAAAGATCAATTCAGCAAGAAGATATAACCATCC	;::;:<<<<<<<<:<<;<<<<8<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:46:1528:799	83	seq2	1109	96	35M	=	1306	232	ATGATAAAAAGATCAATTCAGCAAGAAGATATAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:7
+EAS54_81:7:324:472:791	83	seq2	1110	89	35M	=	1274	199	TGATAAAAAGATCAATTCAGCAAGAAGATATAACC	<<<<<<<<:<<<<<<<<<<<<<<:<<<<<<<<<:3	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS54_61:8:4:173:814	147	seq2	1111	99	35M	=	1289	213	GATAAAAAGATCAATTCAGCAAGAAGATATAACCA	=====================<==========;==	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+B7_593:3:303:131:673	83	seq2	1112	99	36M	=	947	-201	ATAAAAAGATCAATTCAGCAAGAAGATATAACCATC	<;<<<<<<<<:<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:235:899:847	147	seq2	1112	99	35M	=	950	-197	ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT	<7<<<<<<<<:<<<<:<</<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS1_105:8:179:119:876	83	seq2	1112	60	35M	=	917	-230	ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT	<<<<<<<7<<<<<<;;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_59:2:162:272:415	147	seq2	1112	83	35M	=	923	-224	ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT	=7=======;5==<<6==1==<=============	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_45:6:44:77:1255	83	seq2	1113	99	35M	=	955	-193	TAAAAAGATCAATTCAGCAAGAAGATATAACCATC	79998;;;9:;<696<;.<;;<<;<;<;<;;;<8;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:162:257:203	147	seq2	1114	99	35M	=	1301	222	AAAAAGATCAATTCAGCAAGAAGATATAACCATCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:3:55:464:146	83	seq2	1114	99	35M	=	1295	216	AAAAAGATCAATTCAGCAAGAAGATATAACCATCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:6:308:667:658	147	seq2	1116	34	35M	=	918	-233	AAAGATCACTTCAGCAATAAGATATAACCATCCTA	<9;;;45;&<;&.<5683;84+<;<;+8<;<<8;<	MF:i:18	Aq:i:10	NM:i:2	UQ:i:23	H0:i:0	H1:i:0
+EAS56_57:4:98:862:154	147	seq2	1116	99	35M	=	1290	209	AAAGATCAATTCAGCAAGAAGATATAACCATCCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<:99<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_61:5:263:314:696	83	seq2	1117	99	35M	=	953	-199	AAGATCAATTCAGCAAGAAGATATAACCATCCTAC	<<;<;:<<<<7<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:83:1456:1854	147	seq2	1117	99	35M	=	1275	193	AAGATCAATTCAGCAAGAAGATATAACCATCCTAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:231:815:626	83	seq2	1119	99	35M	=	940	-214	GATCAATACAGCAAGAAGATATAACCATCCTACTA	'<4%<<<22<<,<<;<<4;<<<<<<<<<<<<<<7<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:17	H0:i:0	H1:i:1
+EAS114_32:4:246:647:765	83	seq2	1119	99	35M	=	937	-217	GATCAATTCAGCAAGAAGATATAACCATCCTACTA	9<+,<<&,39<,<;<<<<<<<&<<<<;0<<3;<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:256:354:173	83	seq2	1121	99	36M	=	957	-200	TCAATTCAGCAAGAAGATATAACCATCCTACTAAAT	-9<<:9<<;6<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:53:61:31	83	seq2	1122	99	35M	=	949	-208	CAATTCAGCAAGAAGATATAACCATCCTACTAAAT	5;;<95<<5<<<<<<<<<<:5;<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:308:509:948	83	seq2	1123	99	36M	=	1298	211	AATTCAGCAAGAAGATATAACCATCCTACTAAATAC	<9<<<<<<<;<7<<;<<<<<<<;<<<<7<<;2;<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:247:900:123	147	seq2	1123	99	35M	=	920	-238	AATTCAGCAAGAAGATATAACCATCCTACTAAATA	;;;;.<<4<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:3:307:113:346	83	seq2	1123	99	35M	=	938	-220	AATTCAGCAAGAAGATATAACCATCCTACTAAATA	<<<<9<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:168:69:249	83	seq2	1125	99	35M	=	936	-224	TTCAGCAAGAAGATATAACCATCCTACTAAATACA	;0;<;;<<<<<<<<<<<<<;<<<8<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:54:1886:719	147	seq2	1125	99	35M	=	941	-219	TTCAGCAAGAAGATATAACCATCCTACTAAATACA	883777;;:;;;;;;;;;;;;;;;;;;;;;;;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:94:273:165	147	seq2	1128	99	35M	=	945	-218	AGAAAGAAGATATAACCATCCTACTAAATACATAT	;3&;;:<<:<-<-<<8:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_95:7:155:530:532	147	seq2	1128	99	35M	=	1319	226	AGCAAGAAGATATAACCATCCTACTAAATACATAT	===================================	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:61:1885:163	147	seq2	1128	99	40M	=	1281	193	AGCAAGAAGATATAACCATCCTACTAAATACATATGCACC	<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<9::::4	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:193:661:771	83	seq2	1129	99	35M	=	952	-212	GCAAGAAGATATAACCATCCTACTAAATACATATG	:&<<<<<<<<<<<<<;<<<;<<;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:75:1503:1399	83	seq2	1130	99	40M	=	969	-201	CAAGAAGATATAACCATCCTACTAAATACATATGCACCTA	&;;8;<<<;<<<<,6<<70<<7<<<<<<9<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:42:28:552	147	seq2	1131	99	35M	=	1294	198	AAGAAGATATAACCATCCTACTAAATACATATGCA	<<<<<<<<<<<<<<<<<<<<<<<<;<;<3<:;9;8	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:61:631:567	147	seq2	1131	99	35M	=	957	-209	AAGAAGATATAACCATCCTACTAAATACATATGCA	<<7<<<<<<<<</<<;<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:257:288:731	147	seq2	1131	99	35M	=	939	-227	AAGAAGATATAACCATCCTACTAAATACATATGCA	<<:<<7<<<<<;<5<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:214:950:32	83	seq2	1132	99	35M	=	947	-220	AGAAGATATAACCATCCTACTAAATACATATGCAC	=&==4======:;==6<==:===============	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:1:12:88:200	83	seq2	1133	99	35M	=	968	-200	GAAGATATAACCATCCTACTAAATACATATGCACC	9<<;<<<;<;6;<;:<<<7<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:256:444:399	147	seq2	1133	99	35M	=	1289	191	GAAGATATAACCATCCTACTAAATACATATGCACC	<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<-;<<8	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:174:753:617	83	seq2	1136	75	35M	=	1299	198	GATATAACCATCCTACTAAATACATATGCACCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:115:226:443	83	seq2	1137	99	35M	=	1314	212	ATATAACCATCCTACTAAATACATATGCACCTAAC	<<<<<<<<<<<<<<<<;<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:26:1867:162	147	seq2	1137	70	35M	=	1299	197	ATATAACCATCCTACTAAATACATATGCACCTAAC	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78698	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:308:66:538	83	seq2	1138	99	35M	=	1321	218	TATAACCATCCTACTAAATACATATGCACCTAACA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:229:543:583	147	seq2	1139	99	35M	=	976	-198	ATAACCATCCTACTAAATACATATGCACCTAACAC	</<;+5<855;<6<<<<;<<<<<<9<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:17:595:863	147	seq2	1139	89	35M	=	1289	185	ATAACCATCCTACTAAATACACATGCACCTAACTC	:<4:<<1:<<<9<+<+1<%<7&&9-71<17)7</4	MF:i:18	Aq:i:33	NM:i:2	UQ:i:19	H0:i:0	H1:i:1
+EAS51_62:7:248:17:435	147	seq2	1139	99	35M	=	969	-205	ATAACCATCCTACTAAATACATATGCACCTAACAC	<1<<88++<:<<:;<;<<<:<<<;<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:35:186:412	83	seq2	1139	99	35M	=	1306	202	ATAACCATCCTACTAAATACATATGCACCTAACAC	<<<<<<<<4<<<<<:<<<<<<:<<<<<<<<<;;<:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:307:252:632	83	seq2	1142	99	35M	=	998	-179	ACCATCCTGCTAAATACATATGCACCTAACACAAG	<77<;,5<,9<<<<<<;<<<<<7<;<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:11	H0:i:0	H1:i:1
+EAS1_108:7:108:440:208	147	seq2	1142	99	35M	=	975	-202	CCCATCCTACTAAATACATATGCACCTAACACAAG	+35:486<<4<<<<<<<<<<<-<<<<<7<<)<<<-	MF:i:18	Aq:i:43	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS1_95:7:74:866:49	83	seq2	1143	99	35M	=	969	-209	CCAACCTACTAAATACATATGCACCTAACACAAGA	:8<&<<<<7<<<<:<<<<<<8<5<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_61:2:66:757:918	83	seq2	1143	99	35M	=	985	-193	CCATCCTACTAAATACATATGCACCTAACACAAGA	<9<45;<<7<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:220:733:736	147	seq2	1143	99	35M	=	959	-219	CCATCCTACTAAATACATATGCACCTAACACAAGA	:;<77;<<9<<<<<9;<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:175:289:351	83	seq2	1144	99	35M	=	1319	210	CATCCTACTAAATACATATGCACCTAACACAAGAC	<<<<<<<<<<;<<<<<<<<;<<<<<<<<<<<9<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:2:56:155:49	147	seq2	1145	99	35M	=	970	-210	ATCCTACTAAATACATATGCACCTAACACAAGACT	;:5;;<5<<<<<<<<<<<<<<<<<<<<<<<<<<<=	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:299:336:613	83	seq2	1145	99	35M	=	1293	183	ATCCTACTAAATACATATGCACCTAACACAAGACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:30:432:228	83	seq2	1145	99	35M	=	967	-213	ATCCTACTAAATACATATGCACCTAACACAAGACT	<76<<<:<<<<<<<;<:<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:93:312:331	83	seq2	1145	99	35M	=	953	-227	ATCCTACTAAATACATATGCACCTAACACAAGACT	<;;:;<6<<<<;<:<<<<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:133:707:886	147	seq2	1146	99	35M	=	978	-203	ACCTAATAAATACATATGCACCTAACACAAGACTA	%5-2;&6<<<<<;<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:9	H0:i:1	H1:i:0
+EAS51_62:3:50:312:219	147	seq2	1146	99	35M	=	1288	177	TCCTACTAAATACATATGCACCTAACACAAGACTA	<<<<<<<<<<<;<<<<<;<;<<<;<<<<<<;;;;;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:82:670:302	147	seq2	1146	99	35M	=	973	-208	TCCTACTAAATACATATGCACCTAACACAAGACTA	%448<7<<<<<<7<<<<<&<<7<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:47:591:698	83	seq2	1146	99	35M	=	1313	202	TCCTACTAAATACATATGCACCTAACACAAGACTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:8:122:430:882	83	seq2	1147	99	35M	=	1338	226	CCTACTAAATACATATGCACCTAACACAAGACTAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:46:1566:668	83	seq2	1148	99	35M	=	959	-224	CTACTAAATACATATGCACCTAACACAAGACTACC	5<<:<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:92:411:955	147	seq2	1149	99	36M	=	979	-206	TACTAAATACATATGCACCTAACACAAGACTACCCA	2<+<<<<9<<<<<<<;+<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:96:419:327	83	seq2	1149	99	35M	=	1331	217	TACTAAATACATATGCACCTAACACAAGACTACCC	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;;9<9	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:20:1444:328	147	seq2	1149	99	35M	=	993	-191	TACTAAATACATATGCACCTAACACAAGACTACCC	9<3<<==;=<===;=<=====<<===========<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:198:59:675	147	seq2	1150	99	35M	=	1315	200	ACTAAATACATATGCACCTAACACAAGACTATCCT	<.<<<<<<;<<<<<<<<<<<**<;<;2<;6;&*2&	MF:i:18	Aq:i:45	NM:i:2	UQ:i:10	H0:i:1	H1:i:0
+EAS54_61:7:114:506:971	83	seq2	1150	99	35M	=	986	-199	ACTAAATACATATGCACCTAACACAAGACTACCCA	;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:2:94:356:809	147	seq2	1151	99	35M	=	1334	218	CTAAATACATATGCACCTAACACAAGACTACCCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:155:541:234	147	seq2	1151	99	35M	=	1319	203	CTAAATACATATGCACCTAACACAAGACTACCCAG	<<7<<<<<<<<<<<<<<<4<<<<<<<<<<<;;;08	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:272:328:400	83	seq2	1151	99	35M	=	977	-209	CTAAATACATATGCACCTAACACAAGACTACCCAG	4;<<<<<7<;<<<-<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:283:186:707	147	seq2	1154	99	36M	=	1321	203	AATACATATGCACCTAACACAAGACTACCCAGATTC	<<<<<<<<<<<<<<<<<<<<<<;<<<<<;<;<<<<8	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:4:86:660:932	83	seq2	1154	99	35M	=	1338	219	AATACATATGCACCTAACACAAGACTACCCAGATT	================================9:=	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:264:705:89	147	seq2	1155	99	35M	=	983	-207	AAACATATGCACCTAACACAAGACTACCCAGATTC	<(<2<&<)<<<7<8<<<<<<<<<<.<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS114_32:4:5:396:292	83	seq2	1155	99	35M	=	981	-209	ATACATATGCACCTAACACAAGACTACCCAGATTC	<:<6<7<:<:;;;<<<;<7<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:178:342:866	147	seq2	1155	72	35M	=	1311	191	ATACATATGCACCTAACACAAGACTACCCAGATTC	;<<<<<;<<<8<<;<;<3<8/<<<<6<<</<8;<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:155:809:543	147	seq2	1156	99	35M	=	1352	231	TACATATGCACCTAACACAAGACTACCCAGATTCA	<<<<<<<<<<<<<<<<7<;<<<<<<<<<<<1<;<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:119:880:781	83	seq2	1157	99	35M	=	1312	190	ACATATGCACCTAACACAAGACTACCCAGATTCAT	<<<<<<<<<<<<<<<<<<<<<<<<+<<<<7<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:283:963:234	147	seq2	1157	99	35M	=	992	-200	ACATATGCACCTAACACAAGACTACCCAGATTCAT	<5<;<;97;;:;<<7<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:28:745:352	83	seq2	1159	99	35M	=	1329	205	ATATGCACCTAACACAAGACTACCCAGATTCATAA	<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:147:687:428	147	seq2	1159	99	35M	=	998	-196	ATATGCACCTAACACAAGACTACCCAGATTCATAA	;1<''48;4)<<:<<<<;<<6;<<<<<<<<<<<<<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:101:809:776	83	seq2	1160	99	35M	=	1326	201	TATGCACCTAACACAAGACTACCCAGATTCATAAA	<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:35:538:1882	147	seq2	1160	98	35M	=	1337	212	TATGCACCTAACACAAGACTACCCAGATTCATAAA	;);43.50;3;93;;4;3;;;9-7.;*;;966*75	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:41:34:211	83	seq2	1164	99	35M	=	980	-219	CACCTAACACAAGACTACCCAGATTCATAAAACAA	7</::<<7<<<<<<;<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:2:1422:1820	83	seq2	1164	99	35M	=	1004	-195	CACCTAACACAAGACTACCCAGATTCATAAAACAA	*4617;;4;1;;79;/7&,4;9;;;7<;;<<<;<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:194:998:663	83	seq2	1165	99	35M	=	1002	-198	ACCTAACACAAGACTACCCAGATTCATAAAACAAA	;</<<<7<<<<;<<8<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:10:975:766	83	seq2	1166	99	35M	=	959	-242	AATAACACAAGACTACCCAGATTCATAAAACAAAT	++4<<+<+<<<<8<<22;<<<<<2<<<<<<<<<<<	MF:i:18	Aq:i:64	NM:i:2	UQ:i:24	H0:i:1	H1:i:0
+EAS114_39:6:94:1273:1462	83	seq2	1166	99	35M	=	995	-206	CCTAACACAAGACTACCCAGATTCATAAAACAAAT	8.<<<;<:<<<<;<<;;;<<<;<;<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:8:64:350:174	83	seq2	1166	99	35M	=	1000	-201	CCTAACACAAGACTACCCAGATTCATAAAACAAAT	709<<;<;<<<<<<<;7<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:166:84:766	83	seq2	1167	99	35M	=	990	-212	ATAACACAAGACTACCCAGATTCATAAAACAAATA	%8<=+<-<<<</<<<<8<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_108:2:85:580:481	147	seq2	1167	99	35M	=	1359	227	CTAACACAAGACTACCCAGATTCATAAAACAAATA	<<<<<<<<<<<<<:<<<<<<<<<<<<;<<<<6:<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:191:40:536	83	seq2	1167	66	35M	=	977	-225	ATAAAAAAAGACTACCCAGATTCATAAAACAAATA	+1<<,<&<<:<.;<7/7<<<<;.<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:3	UQ:i:27	H0:i:1	H1:i:0
+EAS218_1:2:40:1291:1045	147	seq2	1167	99	35M	=	980	-222	CTAACACAAGACTACCCAGATTCATAAAACAAATA	*<<<9<<<<<<:0<9<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:221:881:916	83	seq2	1168	96	35M	=	1327	194	TAACACAAGACTACCCAGATTCATAAAACAAATAC	<<;<<8<<;<<<<<<<;<<<<28<:<8<:;<;;;<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:35:392:2042	147	seq2	1168	99	35M	=	1332	199	TAACACAAGACTACCCAGATTCATAAAACNAATAC	======;==========<<=======7=;!<7;;;	MF:i:18	Aq:i:72	NM:i:1	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:192:714:341	147	seq2	1170	99	35M	=	1346	211	ACACAAGACTACCCAGATTCATAAAACAAATACTA	<<9<<<<<<<<<<<8<<<<<;<<;8<<<88;;;;9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:189:876:833	147	seq2	1173	99	36M	=	1349	212	CAAGACTACCCAGATTCATAAAACAAATACTACTAG	<<<<<<<<<<<8<8<<<<<;<;;<<;<<<<<;<<<6	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:299:743:762	147	seq2	1173	99	36M	=	1345	208	CAAGACTACCCAGATTCATAAAACAAATACTACTAG	<<<;<<<<<<<<<:;<<<.<:<<<<<<<<<<;;;;;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:107:252:533	83	seq2	1173	60	35M	=	1025	-183	CAAGACTACCCAGATTCATAAAACAAATACTACTA	3<<<<+<<96<<<<<<;<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:1
+EAS1_97:5:154:952:558	147	seq2	1173	99	35M	=	1007	-201	AAAGACTACCCAGATTCATAAAACAAATACTACTA	%<<9;;<<;;;<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS56_63:4:184:659:377	147	seq2	1173	99	35M	=	992	-216	CAAAACTACCCAGATTCATAAAACAAATACTACTA	1;<+<;<6;66<<;<<<<;;<<<8<<<<8<<;<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+B7_595:6:137:811:130	147	seq2	1175	99	35M	=	1351	211	AGACTACCCAGATTCATAAAACAAATACTACTAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:4:124:367:72	147	seq2	1175	99	35M	=	1377	237	AGACTACCCAGATTCATAAAACAAATACTACTAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:8:60:358:494	147	seq2	1179	44	35M	=	979	-235	TACCCAGATTCATAAAACAAATACTACTAGACCTA	7<77;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:14	NM:i:0	UQ:i:0	H0:i:6	H1:i:36
+EAS114_30:7:319:11:255	147	seq2	1179	92	35M	=	1337	193	TACCCAGATTCATAAAACAAATACTACTAGACCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<:	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:10
+B7_610:7:26:749:174	83	seq2	1183	78	35M	=	1357	209	CAGATTCATAAAACAAATACTACTAGACCTAAGAG	<<<<<<<<<<<<<<<<<<<<<<;<9<8<<<9<;94	MF:i:18	Aq:i:11	NM:i:0	UQ:i:0	H0:i:6	H1:i:31
+EAS1_103:7:112:578:782	83	seq2	1183	89	35M	=	1366	218	CAGATTCATAAAACAAATACTACTAGACCTAAGAG	<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:5	H1:i:25
+EAS1_105:1:234:185:359	83	seq2	1183	46	35M	=	1029	-189	CAGATTCATAAAACAAATACTACTAGACCTAAGAG	<<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:9
+EAS112_34:4:92:412:435	147	seq2	1184	89	35M	=	1003	-216	AGATTCATAAAACAAATACTACTAGACCTAAGAGG	<;<52:=,====:=========<============	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:6:24:105:1046	83	seq2	1184	99	35M	=	1377	228	AGATTCATAAAACAAATACTACTAGACCTAAGAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:4	H1:i:2
+EAS1_97:2:128:629:484	147	seq2	1185	96	35M	=	1359	209	GATTCATAAAACAAATACTACTAGACCTAAGAGGG	<<49<<<<<9<<<<99<<<<<<<<<<<<+<-)7))	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:4	H1:i:45
+EAS219_FC30151:1:53:140:421	83	seq2	1185	99	35M	=	1016	-204	GATTCATAAAACAAATACTACTAGACCTAAGAGGG	<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:99:557:427	147	seq2	1186	99	35M	=	1342	191	ATTCATAAAACAAATACTACTAGACCTAAGAGGGA	<<<<<<<<<<<<<<<<<<<<<<:<<<<+;<7:8:;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:253:175:31	147	seq2	1187	72	35M	=	1008	-214	TTCATAAAACAAATACTACTAGACCTAAGAGGGAT	;+;<;<<<<<<<<9<<9<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:13:701:55	147	seq2	1187	99	36M	=	1015	-208	TTCATAAAACAAATACTACTAGACCTAAGAGGGATG	0:+<7<;9<;<<<<<<<3<<<<<;;<<<:<<3<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:220:809:850	147	seq2	1187	60	35M	=	986	-236	TTCATAAAACAAATACTACTAGACCTAAGAGGGAT	9+5<;*<<<2:0<<8:<*00<<<:<*<<<<<<<<&	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:30:599:589	147	seq2	1188	99	36M	=	1003	-221	TCATAAAACAAATACTACTAGACCTAAGAGGGATGA	90<;<<<<<<<<+<<<;;<;<;<<<<<<<<6<<8<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:35:118:589	83	seq2	1188	99	35M	=	999	-224	TCATAAAACAAATACTACTAGACCTAAGAGGGATG	67<<<<<;<<<<<<<:7<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:37:604:389	147	seq2	1188	99	35M	=	998	-225	TCATAAAACAAATACTACTAGACCTAAGAGGGATG	00;:;========9========<9========<==	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:2:168:61:867	83	seq2	1188	99	35M	=	997	-226	TCATAAAACAAATACTACTAGACCTAAGAGGGATG	;7<<<<<<<<<<<<<7<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:7:197:399:319	83	seq2	1189	99	35M	=	1012	-212	CAAAAAACAAATACTACTAGACCTAAGAGGGATGA	&<+==<<5<<<8<89;;<<<<<<8<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS114_32:5:267:170:250	147	seq2	1189	99	35M	=	1377	223	CATAAAACAAATACTACTAGACCTAAGAGGGATGA	<<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:174:157:573	83	seq2	1191	99	35M	=	1012	-214	TAAAACAAATACTACTAGACCTAAGAGGGATGAGA	8<<<<4<<<<<<<<;<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:39:956:676	83	seq2	1191	99	35M	=	1023	-203	TAAAACAAATACTACTAGACCTAAGAGGGATGAGA	899985;;<;:9;;:9<;:9:5;<;;;<;<;<<<<	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:37:763:1437	83	seq2	1191	99	35M	=	994	-232	TAAAACAAATACTACTAGACCTAAGAGGGATGAGA	79979;<;<;;;<;;;;;;6:;<:;<:8;<<<<;<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:50:513:882	83	seq2	1192	99	35M	=	1031	-196	AAAACAAATACTACTAGACCTAAGAGGGATGAGAA	<<<<:<<<<<:<<:<<<<::<<<<<<<<<<<<<<<	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:15:1763:1143	147	seq2	1193	99	35M	=	1023	-205	AAACAAATACTACTAGACCTAAGAGGGATGAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:189:571:366	83	seq2	1194	99	35M	=	1002	-227	AACAAATACTACTAGACCTAAGAGGGATGAGAAAT	<<;<<<<<:<<<;<<<;;;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:166:532:438	83	seq2	1194	99	35M	=	1386	227	AACAAATACTACTAGACCTAAGAGGGATGAGAAAT	<<<<<<<<<<<<<<<;<<;<<;<<<<;<;:;;<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:309:109:987	83	seq2	1194	99	35M	=	1024	-205	AACAAATACTACTAGACCTAAGAGGGATGAGAAAT	<<<<<<:<<;<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:171:527:247	83	seq2	1194	67	35M	=	1027	-202	AACAAATGCTACTAGACCTAAGAGGGATGAGAAAT	<547*9)&&7+;+<<7<<<;<<<;3<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_589:8:139:727:808	147	seq2	1195	99	35M	=	1363	203	ACAAATACTACTAGACCTAAGAGGGATGAGAAATT	<<<<<<<<<<<<<:<;<<<<<<<<9;<;9<6;<<9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:202:275:776	83	seq2	1196	99	36M	=	1002	-230	CAAATACTACTAGACCTAAGAGGGATGAGAAATTAC	;<<<<;;<<<<<<<;<<<<<<<;<<<<<<<<<<;<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:12:484:836	147	seq2	1197	99	35M	=	1372	210	AAATACTACTAGACCTAAGAGGGATGAGAAATTAC	<<<<<<<<<<<<<<<<<7<:<<<<<<9<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:21:553:57	83	seq2	1197	99	35M	=	1358	196	AAATACTACTAGACCTAAGAGGGATGAGAAATTAC	<<<<<<<<<<<;;<<<;<<;<<;<<<;;9<;<;<9	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:4:939:2021	83	seq2	1197	99	40M	=	1031	-206	AAATACTACTAGACCTAAGAGGGATGAGAAATTACCTAAT	;;;;:8;<5:<<<7/<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:194:378:230	83	seq2	1198	99	35M	=	1022	-211	AATACTACTAGACCTAAGAGGGATGAGAAATTACC	<<;<8<<:<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:68:242:834	147	seq2	1200	99	36M	=	1386	222	TACTACTAGACCTAAGAGGGATGAGAAATTACCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:2:22:471:500	147	seq2	1200	99	35M	=	1365	200	TACTACTAGACCTAAGAGGGATGAGAAATTACCTA	=======<=<====:<2===9==;=;9;;=;;;;5	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:139:989:144	147	seq2	1201	99	35M	=	1387	221	ACTACTAGACCTAAGAGGGATGAGAAATTACCTAA	<<<<<<<<<<<<6<<<<<<<<<;<<<<<<<;;<;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:188:20:592	83	seq2	1202	95	35M	=	1032	-205	CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT	2<<7;<<<<,;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:189:863:213	83	seq2	1202	99	35M	=	1039	-198	CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT	7:<7<<<<44;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:62:561:531	83	seq2	1203	99	35M	=	1036	-202	TACTAGACCTAAGAGGGATGAGAAATTACCTAATT	<<7<<<<:<8<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:70:1349:1788	83	seq2	1203	99	35M	=	1043	-195	TACTAGACCTAAGAGGGATGAGAAATTACCTAATT	<7;<<8<74;;<1<<71<;7<;;<;<7<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:197:914:256	147	seq2	1204	97	35M	=	1049	-190	ACTAGACCTAAGAGGGATGAGAAATTACCTAATTG	<5;<8<5/;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:35:896:1588	83	seq2	1205	91	35M	=	1032	-208	CTAGACCTAAGAGGGATGAGAAATTACCTAATTGG	77999:.:<<;<;;;<<;<;<<<<<;<;;<<<<;;	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:43:47:279	147	seq2	1206	99	35M	=	1405	234	TAGACCTAAGAGGGATGAGAAGTTACCTAATTGGT	<<<<<<<<<<<<<;:<-<<<<<<<<<<<<:;;+7;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_95:2:211:954:174	83	seq2	1207	99	35M	=	1393	221	AGACCTAAGAGGGATGAGAAATTACCTAATTGGTA	===============================777=	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:5:1219:137	83	seq2	1209	99	35M	=	1384	210	ACCTAAGAGGGATGAGAAATTACATAATTGGTACA	<<<<<<<<<<<<<<<<<<<<<<<(<<<<<<:9<;=	MF:i:18	Aq:i:45	NM:i:1	UQ:i:7	H0:i:0	H1:i:1
+EAS56_57:7:33:954:724	83	seq2	1210	97	35M	=	1049	-196	CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA	;<;<;<<-7;<<;<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:176:402:458	147	seq2	1210	99	36M	=	1376	202	CCTAAGAGGGATGAGAAATTACCTAATTGGTACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;;<;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:81:687:1379	147	seq2	1210	99	35M	=	1366	191	CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:45:239:851	83	seq2	1211	61	35M	=	1023	-223	CTAAGAGGGATGAGAAATTACCTAATTGGTACAAT	*2*0<<<<<<<<<<<<<<<<9<<3<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_65:5:312:985:871	147	seq2	1212	99	35M	=	1369	192	TAAGAGGGATGAGAAATTACCTAATTGGTACAATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<9<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:38:557:1441	147	seq2	1212	99	35M	=	1381	204	TAAGAGGGATGAGAAATTACCTAATTGGTACAATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:88:465:1877	147	seq2	1212	99	35M	=	1055	-192	TAAGAGGGATGAGAAATTACCTAATTGGTACAATG	<<<<<<<:<<<<<<<<:<<<<<<<<<<<<7;<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:149:123:265	147	seq2	1213	99	35M	=	1395	217	AAGAGGGATGAGAAATTACCTAATTGGTACAATGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:47:1791:444	83	seq2	1213	74	35M	=	1041	-207	AAGAGGGATGAGAAATTACCTAATTGGTACAATGT	978879;:;;<:;;<<;:<9<<<<;6;;;;<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:6
+EAS51_62:3:68:996:104	147	seq2	1214	70	35M	=	1041	-208	AGAGGGATGAGAAATTACCTAATTGGTACAATGTA	<1<8<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+B7_593:2:68:140:542	83	seq2	1217	95	36M	=	1398	217	GGGATGAGAAATTACCTAATTGGTACAATGTACAAT	<<<8;<<;<<<<<;<<;<<<<<8;<-<8<82;;;-8	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:6
+EAS188_7:7:67:719:786	147	seq2	1218	43	35M	=	1383	200	GGATGAGAAATTACCTAATTGGTACACTGTACAAT	;;<<<<<<&<<:13&<1<<<:<<<)/&/))<'6-<	MF:i:18	Aq:i:13	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS1_108:5:321:712:224	83	seq2	1220	58	35M	=	1051	-204	ATGAGAAATTACCTAATTGGTACAATGTACAATAT	=;===7;===7=========;=:;=========;=	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_26:4:100:238:596	147	seq2	1220	56	35M	=	1403	218	ATGAGAAATTACCTAATTGGTACAATGTACAATAT	======9=====;=======5===;====/=;===	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:13
+EAS51_62:7:312:236:655	147	seq2	1222	99	35M	=	1412	225	GAGAAATTACCTAATTGGTACAATGTACAATATTC	<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS56_63:6:102:816:260	147	seq2	1225	99	35M	=	1049	-211	AAATTACCTAATTGGTACAATGTACAATATTCTGA	<<<<<<::<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:34:144:868	147	seq2	1226	76	35M	=	1412	221	AATTACCTAATTGGTACAATGTACAATATTCTGAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:215:516:299	83	seq2	1226	99	35M	=	1406	215	AATTACCTAATTGGTACAATGTACAATATTCTGAT	<<<<<<;<<<<;;;;<;;<<<<;<<9<;<<1;7/;	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:81:12:1231	147	seq2	1228	99	35M	=	1391	198	TTACCTAATTGGTACAATGTACAATATTCTGATGA	<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<4<<6	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:2:30:644:942	147	seq2	1229	83	35M	=	1045	-219	TACCTAATTGGTACAATGTACAATATTCTGATGAT	85%+;<<9;<9<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:41:519:609	147	seq2	1229	99	35M	=	1401	207	TACCTAATTGGTACAATGGACAATATTCTGATGAT	1<<<<<<<<<<<<<<<4<-:<+6<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+B7_591:7:116:814:89	83	seq2	1231	99	36M	=	1408	213	CCTAATTGGTACAATGTACAATATTCTGATGATGGT	<<<<<<<<<<<<<<<<<<<<<<:<<<<;<<;<<66<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:169:714:644	147	seq2	1231	99	35M	=	1437	241	CCTAATTGGTACAATGTACAATATTCTGATGATGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:73:420:812	83	seq2	1232	66	35M	=	1414	217	CTAATTGGTACAATGTACAATATTCTGATGATGGT	<<<<<1<<<<::1<7<:<96<9<:<<:4<70:11<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:17:1179:393	83	seq2	1232	99	35M	=	1412	215	CTAATTGGTACAATGTACAATATTCTGATGATGGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<:4<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:118:829:36	83	seq2	1233	99	35M	=	1417	219	TAATTGGTACAATGTACAATATTCTGATGATGGTT	<<<<<<<<<:<2<<<<<<:<<<<<<<<<<<<71;<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:125:875:553	147	seq2	1233	99	36M	=	1075	-194	TAATTGGTACAATGTACAATATTCTGATGATGGTTA	-;<;:;<<;6<<<<<<6<;<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_32:4:7:282:424	83	seq2	1233	83	35M	=	1397	199	TAATTGGTACAATGTACAATATTCTGATGATGGTT	<<<3<<<9<<<<3<<<<<9<<<9,<;;9;&*;3,.	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:107:447:488	147	seq2	1233	99	35M	=	1412	214	TAATTGGTACAATGTACAATATTCTGATGATGGTT	<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:66:891:294	83	seq2	1233	99	35M	=	1057	-211	TAATTGGTACAATGTACAATATTCTGATGATGGTT	:<<5;;<<<4<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:8:72:44:435	83	seq2	1235	76	35M	=	1392	192	ATTGGTACAATGTACAATATTCTGATGATGGTTAA	<<<<<<<<<<<2;<;<<;<<<;<<8<82<;22<8&	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS139_19:4:18:1335:1514	147	seq2	1235	99	40M	=	1063	-212	ATTGGTACAATGTACAATATTCTGATGATGGTTACACTAA	::/::<<;<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:72:1288:1211	147	seq2	1235	84	35M	=	1052	-218	ATTGGTACAATGTACAATATTCTGATGATGGTTAC	<);<:<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:200:263:280	83	seq2	1236	99	35M	=	1078	-193	TTGGTACAATGTACAATATTCTGATGATGGTTACA	)<<<8<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:68:440:424	147	seq2	1237	99	35M	=	1060	-212	TGGTACAATGTACAATATTCTGATGATGGTTACAC	<<2<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:255:441:47	147	seq2	1237	99	35M	=	1072	-200	TGGTACAATGTACAATATTCTGATGATGGTTACAC	;;7<;:<<<<<<<<<<;<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:174:557:872	147	seq2	1237	99	35M	=	1423	221	TGGTACAATGTACAATATTCTGATGATGGTTACAC	<<<<<<<<<<<<<:<<<<<<<7<<;<<6:<<2117	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS51_64:3:255:45:399	147	seq2	1238	99	35M	=	1404	201	GGTACAATGTACAATATTCTGATGATGGTTACACT	<<3<8<<8<0<<;<<<0<<<</+8<611<<;71;7	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:2:264:157:150	147	seq2	1238	30	35M	=	1054	-219	GGAAAAATGGACAAGATTCTGATGAGGGTTACACT	.3%:+<<*;*<2<<1<1*,*<<7<<+<<<&<<<<<	MF:i:-126	Aq:i:30	NM:i:3	UQ:i:35	H0:i:0	H1:i:0
+EAS139_19:5:95:944:247	83	seq2	1238	99	40M	=	1424	226	GGTACAATGTACAATATTCTGATGATGGTTACACTAAAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:;:::	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:301:161:195	147	seq2	1239	75	35M	=	1076	-198	GTACAATGTACAATATTCTGATGATGGTTACACTA	''6%6<6<<<4<<<<<<<<)<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:141:7:963	83	seq2	1240	85	36M	=	1061	-215	TACAATGTACAATATTCTGATGATGGTTACACTAAA	95+<<9<<5<;;<<;<<;'<<<<<;<<<7<9<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_39:6:76:282:1668	83	seq2	1240	99	35M	=	1401	196	TACAATGTACAATATTCTGATGATGGTTACACTAA	<<<<<<<<<<<<<<<<<<;<<;<<<<<<;<;<<<8	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:64:199:1288	147	seq2	1240	77	35M	=	1079	-196	TACAATGTACAATATTCTGATGATGGTTACACTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:49:911:980	147	seq2	1241	99	35M	=	1434	228	ACAATGTACAATATTCTGATGATGGTTACACTAAA	<<<<<<<<<<;<<<<<<<8<<<<;<;<<88-<;33	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:66:1046:167	147	seq2	1241	99	35M	=	1060	-216	ACAATGTACAATATTCTGATGATGGTTACACTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:303:542:924	83	seq2	1242	76	35M	=	1083	-194	CAATGTACAATATTCTGATGATGGTTACACTAAAA	+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_45:2:79:554:354	147	seq2	1242	63	35M	=	1082	-195	CAATGTACAATATTCTGATGATGGTTACACTAAAA	98988;7;;;;:;;;;;;;;;;:;;;:;;;;;9;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:248:122:558	147	seq2	1243	99	35M	=	1436	228	AATGTACAATATTCTGATGATGGTTACACTAAAAG	<<<<:<<<<<<<<<<<<<;<<<<:<6:4<<::6:6	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:109:22:383	83	seq2	1244	99	35M	=	1071	-208	ATGTACAATATTCTGATGATGGTTACACTAAAAGC	<;9;<8<<<<<<;<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:43:1229:1855	83	seq2	1244	99	35M	=	1074	-205	ATGTACAATATTCTGATGATGGTTACACTAAAAGC	8<<<<;8<<<;;5<<28<<<<<<<<<<<<7;;<<;	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:74:656:272	83	seq2	1245	99	35M	=	1088	-192	TGTACAATATTCTGATGATGGTTACACTAAAAGCC	;;;</<<<<<5;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_65:7:118:775:467	83	seq2	1245	99	35M	=	1075	-205	TGTACAATATTCTGATGATGGTTACACTAAAAGCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_593:7:15:244:876	83	seq2	1246	43	36M	=	1440	230	GTACAATATTCTGATGATGGTTACACTAAAAGCCCA	<<<<<<;<<<<<<<<;<<;;;<<<<<:<<<9;<<<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:63:28:1549	147	seq2	1247	77	35M	=	1439	227	TACAATATTCTGATGATGGTTACACTAAAAGCCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;<<<<7	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:310:800:761	83	seq2	1249	99	35M	=	1055	-229	CAATATTCTGATGATGGTTACACTAAAAGCCCATA	1<<:<:<:<<<<:<<<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:14:978:1296	83	seq2	1249	90	35M	=	1104	-180	CAATATTCTGATGATGGTTACACTAAAAGCCCATA	77177;9;2:;;:;;(;;9;<;;;;:;;;:7;<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:8:26:242:35	147	seq2	1251	99	35M	=	1084	-202	ATATTTTGATGATGGTTACACTAAAAGCCCATACT	<<<77!!7<;<<<;;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:0	H0:i:1	H1:i:8
+EAS114_45:7:6:758:988	83	seq2	1253	99	35M	=	1087	-201	ATTCTGATGATGGTTACACTAAAAGCCCATACTTT	3-7*73;;399:9;9;7<-(<;;<;;:;9::;;7;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:315:412:921	83	seq2	1254	99	35M	=	1424	205	TTCTGATGATGGTTACACTACAAGCCCATACTGTA	<;<;<<<<<<<;<<<<<<<<8<<<;<<:<<;;+<8	MF:i:18	Aq:i:45	NM:i:2	UQ:i:33	H0:i:0	H1:i:1
+EAS114_30:3:215:840:760	147	seq2	1256	99	35M	=	1416	195	CTGATGATGGTTACACTAAAAGCCCATACTTTCCT	<<<<<<<<<<<<<<<;<<<88<+<<:<;3585,+:	MF:i:18	Aq:i:66	NM:i:1	UQ:i:11	H0:i:1	H1:i:0
+EAS1_95:5:284:212:932	147	seq2	1257	10	35M	=	1063	-229	TGATGATGGTTACGCTAAAAGTCCATGCTTTACTG	82%<8:<-:<<:**:<-<<8<)/2/<:/<<<<<<<	MF:i:18	Aq:i:0	NM:i:3	UQ:i:42	H0:i:0	H1:i:0
+EAS1_97:4:290:121:79	147	seq2	1257	99	35M	=	1420	198	TGATGATGGTTACACTAAAAGCCCATACTTTACTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<7;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:88:54:900	83	seq2	1257	68	35M	=	1069	-223	TGATGATGGTTACACTAAAAGCCCATACTTCACTG	============;=================;9===	MF:i:18	Aq:i:19	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS188_7:3:100:735:530	83	seq2	1257	99	35M	=	1058	-234	TGATGATGGTTACACTAAAAGCCCATACTTTACTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:32:562:1695	147	seq2	1258	76	35M	=	1085	-208	GATGATGGTTACACTAAAAGCCCATACTTTACTGC	:5:::<88/<:<<<<<<<<<7<9<<&<959<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:173:627:465	147	seq2	1260	99	36M	=	1444	220	TGATGGTTACACTAAAAGCCCATACTTTACTGCTAC	<<<<<<<<<<<<<<<<<<<<<<<;<<<<<2;;4;;7	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_95:1:77:589:741	83	seq2	1263	99	35M	=	1078	-220	TGGTTACACTAAAAGCCCATACTTTACTGCTACTC	8=;;==606;=========================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:27:228:31	147	seq2	1264	99	35M	=	1082	-217	GGTTACACTAAAAGCCCATACTTTACTGCTACTCA	99;;;<<<<<<:<<;<;<<;<<<<;<<;<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:54:695:952	147	seq2	1264	99	35M	=	1076	-223	GGTTACACTAAAAGCCCATACTTTACTGCTACTCA	277%<9<4)<<<<<<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:300:622:86	83	seq2	1264	99	35M	=	1102	-197	GGTTACACTAAAAGCCCATACTTTACTGCTACTCA	<:<<<:<6;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:71:62:254	147	seq2	1264	99	35M	=	1438	209	GGTTACACTAAAAGCCCATACTTTCCTGCTACTCA	<<<<<<7<<<<7<<<<<3<<<<<<&<<.<<::<:%	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS114_28:1:168:609:646	83	seq2	1264	99	36M	=	1436	208	GGTTACACTAAAAGCCCATACTTTACTGCTACTCAA	<<<<<<<<<<<;<<<<<:<8<<<<;<<<<<4<<<9<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:84:92:1246	147	seq2	1265	99	35M	=	1437	207	GTTACACTAAAAGCCCATACTTTACTGCTACTCAA	<<<<<<<<<<<<<<<<5<:<<5<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:310:193:629	83	seq2	1267	99	36M	=	1103	-200	TACACTAAAAGCCCATACTTTACTGCTACTCAATAT	9<9<6;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:111:379:700	73	seq2	1268	0	35M	=	1268	0	ACACTAAAAGCCCATACTTTACTGCTACTCAATAT	7<<:<<<<02<<6&<</<<</+9/98*<966/3/<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:111:379:700	133	seq2	1268	0	*	=	1268	0	CGCACTGGCAATATTTGTGTGTTTACTTTTTTGCA	:1+&;;6;:;918;);;):,19.9:).):::.&3(	MF:i:-64
+EAS114_30:6:137:741:866	147	seq2	1268	99	35M	=	1429	196	ACACTAAAAGCCCATACTTTACTGCTACTCAATAT	<<<<8<<;;;<<<<;<<<;;;<;4<<8;<<;%<8;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:23:1126:1886	147	seq2	1268	99	35M	=	1094	-209	ACACTAAAAGCCCATACTTTACTGCTACTCAATAT	5*.:.5<<::<<<<<<<<:5<<<<<<<<<<:2<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:21:423:169	83	seq2	1270	99	35M	=	1468	233	ACTAAAAGCCCATACTTTACTGCTACTCAATATAT	<<<<<;<<<<<<;<<<<<;;<<<<<<<<9+:5<;;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:110:984:98	147	seq2	1270	99	36M	=	1092	-214	ACTAAAACCCCATACTTTACTGCTACTCAATATATC	:81<<<<+;;8<+<8<<<<<;<<<8;<<<<<<<<8;	MF:i:18	Aq:i:70	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS219_FC30151:5:54:1351:910	83	seq2	1270	99	35M	=	1448	213	ACTAAAAGCCCATACTTTACTGCTACTCAATATAT	<<<<<<8<<<<<<<<<<<<<<<<<<<<<<18<<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:237:855:581	147	seq2	1271	87	35M	=	1105	-201	CTAAACGCCCATACTTTACTGCTACTCAATATATC	/+<<<&)2;66;/;;+<;;3133<3<3;9;<999<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_59:8:80:542:549	147	seq2	1271	99	35M	=	1443	207	CTAAAAGCCCATACTTTACTGCTACTCAATATATC	<<<<<<<<;<<<<<<<<:<<<<-<;;<;7<;3;9;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:7:1347:375	147	seq2	1271	99	35M	=	1436	200	CTAAAAGCCCATACTTTACTGCTACTCAATATATC	;;;;;;;;;;;;;;;;;;;;9;;;8;;;;;97777	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:191:540:493	83	seq2	1273	99	35M	=	1432	194	AAAAGCCCATACTTTACTGCTACTCAATATATCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:324:472:791	147	seq2	1274	89	35M	=	1110	-199	AAAGCCAATACTTTACTGCTACTCAATATATCCAT	<<.)5*&;;11<<<,5<33:-<<6<<<<:<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS220_1:8:83:1456:1854	83	seq2	1275	99	35M	=	1117	-193	AAGCCCATACTTTACTGCTACTCAATATATCCATG	<<67<:<8<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:290:247:509	147	seq2	1276	99	35M	=	1450	209	AGCCCATACTTTACTGCTACTCAATATATCCATGT	<<<<<<<<<<<<<<<4<<<<<<92<;;;<;96;19	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:90:629:652	83	seq2	1276	99	35M	=	1456	215	AGCCCATACTTTACTGCTACTCAATATATCCATGT	<<<<<<<<<<<<<<<<<<<<<<<:<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:39:1671:1928	147	seq2	1276	99	35M	=	1453	212	AGCCCATACTTTACTGCTACTCAATATATCCATGT	<<<<<<<;<<<<;<<<<<4<<<;3<<<;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:128:584:952	83	seq2	1277	99	35M	=	1101	-211	GCCCATACTTTACTGCTACTCAATATATCCATGTA	7<;9;0:<<<:<<:<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:28:979:519	147	seq2	1278	99	35M	=	1439	196	CCCATACTTTACTGCTACTCAATATATCCATGTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:219:40:833	83	seq2	1278	99	35M	=	1094	-219	CCCATACTTTACTGCTACTCAATATATCCATGTAA	<<*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:1:289:207:323	147	seq2	1279	99	35M	=	1462	218	CCATACTTTACTGCTACTCAATATATCCATGTAAC	<<<:<<<<<:<<<<<<<<<<;<<899<<13)939;	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:45:758:616	147	seq2	1280	99	35M	=	1473	228	CATACTTTACTGCTACTCAATATATCCATGTAACA	<<<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<;;<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:42:804:114	147	seq2	1281	99	35M	=	1452	206	ATACTTTACTGCTACTCAATATATCCATGTAACAA	<<<<<<<<<<<<<<<<<<<<<<<<<<:<:<;;<;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:61:1885:163	83	seq2	1281	99	40M	=	1128	-193	ATACTTTACTGCTACTCAATATATCCATGTAACAAATCTG	;:;;;;<<8<<:<<:<;<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:282:962:46	83	seq2	1282	99	35M	=	1437	190	TACTTTACTGCTACTCAATATATCCATGTAACAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:143:620:158	83	seq2	1283	99	35M	=	1107	-211	ACTTTACTGCTACTCAATATATCCATGTAACAAAT	<4;<;<;<;6<<7<;<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:50:312:219	83	seq2	1288	99	35M	=	1146	-177	ACTGCTACTCAATATATCCATGTAACAAATCTGCG	<,;83:<::6<<<<<<<;:<;<<<<;<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:256:444:399	83	seq2	1289	99	35M	=	1133	-191	CTGCTACTCAATATATCCATGTAACAAATCTGCGC	;+549<:<.<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:17:595:863	83	seq2	1289	89	35M	=	1139	-185	AAGCTACTCAATATATCCATGTAACAAATCTGCGC	))55))+2&<<,:5<,0657<<<<:<:<:<<<<<<	MF:i:18	Aq:i:33	NM:i:2	UQ:i:16	H0:i:1	H1:i:0
+EAS1_105:6:23:885:274	147	seq2	1289	99	35M	=	1089	-235	CTACTACTCAATATATCCATGTAACAAATCTGCGC	2+*27==;;==<<.;:<=<=<==============	MF:i:18	Aq:i:51	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+EAS54_61:8:4:173:814	83	seq2	1289	99	35M	=	1111	-213	CTGCTACTCAATATATCCATGTAACAAATCTGCGC	<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:263:557:988	147	seq2	1289	84	35M	=	1108	-216	CTGCTACTCAATATATCCATGTAACAAATCTGCGC	1-41:<15+<<<<<<599<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:2:326:153:231	147	seq2	1290	43	35M	=	1477	222	TGCTACTCAATATATCCATGTAACAAATCTGCGCT	<<<<<<<<<9<<<<<<<<<,<<<<<<8<<8.;.;4	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:98:862:154	83	seq2	1290	99	35M	=	1116	-209	TGCTACTCAATATATCCATGTAACAAATCTGCGCT	856:;7<:<<9<<<9<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:6:529:366	147	seq2	1291	99	35M	=	1103	-223	GCTACTCAATATATCCATGTAACAAATCTGCGCTT	9;8;8<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:299:336:613	147	seq2	1293	99	35M	=	1145	-183	TACTCAATATATCCATGTAACAAATCTGCGCTTGT	1;4(+<<5<4<1<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+B7_597:2:42:28:552	83	seq2	1294	99	35M	=	1131	-198	ACTCAATATATCCATGTAACAAATCTGCGCTTGTA	</8:<<:<<<;;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_39:3:55:464:146	147	seq2	1295	99	35M	=	1114	-216	CTCAATATATCCATGTAACAAATCTGCGCTTGTAC	;(;;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_67:6:109:953:668	83	seq2	1297	99	35M	=	1485	223	CAATATATCCATGTAACAAATCTGCGCTTGTACTT	;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<8<;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_19:1:82:946:392	147	seq2	1297	99	40M	=	1493	236	CAATATATCCATGTAACAAATCTGCGCTTGTACTTCAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<8<<<8<<8<<:4488	MF:i:18	Aq:i:74	NM:i:1	UQ:i:19	H0:i:1	H1:i:0
+EAS114_28:3:308:509:948	147	seq2	1298	99	36M	=	1123	-211	AATATATCCATGTAACAAATCTGCGCTTGTACTTCT	;;+;;;.8<<;;;<<<<<<<<<<<<<8<<<<<;<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:174:753:617	147	seq2	1299	75	35M	=	1136	-198	ATATATCCATGTAACAAATCTGCGCTTGTACTTCT	<;<;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:26:1867:162	83	seq2	1299	70	35M	=	1137	-197	ATATATCCATGTAACAAATCTGCGCTTGTACTTCT	97999:;<<9;;<:<<;;;<;;<<<<<<<;;<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:162:257:203	83	seq2	1301	99	35M	=	1114	-222	ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA	<;<;:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:62:841:1994	89	seq2	1301	70	35M	=	1301	-35	ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA	87878;;6:;;:<<<<:<:;;;<;<<<;<;;<;<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:62:841:1994	149	seq2	1301	0	*	=	1301	35	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	MF:i:-64
+EAS139_19:7:44:1807:833	83	seq2	1301	99	40M	=	1449	188	ATATCCATGTAACAAATCTGCGCTTGTACTTCTAAATCTA	<<<<<<<<<<<<<<<<<<<;<;<<<;<<9<<<<<89;;;:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:280:607:113	147	seq2	1303	99	35M	=	1468	200	ATCCATGTAACAAATCTGCGCTTGTACTTCTAAAT	===================;===;=====<=7=9:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:260:147:818	147	seq2	1303	82	35M	=	1497	229	ATCCATGTAACAAATCTGCGCTTTTACTTCTAAAT	<<<<<<3<<<<<;<<<<)<1<<<&<7<<<;<4/9<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS54_71:7:194:867:616	83	seq2	1303	99	34M	=	1481	213	ATCCATGTAACAAATCTGCGCTTGTACTTCTATT	<8<<<<<<<<<<<8<<4<<<<<<8<<3<<5<&(+	MF:i:18	Aq:i:67	NM:i:2	UQ:i:23	H0:i:1	H1:i:0
+EAS139_19:7:85:262:751	83	seq2	1305	99	40M	=	1105	-240	CCATGTAACAAATCTGCGCTTGTACTTCTAAATCTATAAC	22;99;<<8<<<<<<<;<;<<<<<;<<;<<<<<<<<<<<+	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_81:6:35:186:412	147	seq2	1306	99	35M	=	1139	-202	CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA	<<4:6<;<&<:4<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:46:1528:799	147	seq2	1306	96	35M	=	1109	-232	CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:124:978:501	147	seq2	1307	99	36M	=	1499	228	ATGTAACAAATCTGCGCTTGTACTTCTAAATCTATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:88:866:774	147	seq2	1307	99	35M	=	1478	206	ATGTAACAAATCTGCTCTTGTACTTCTAAATCTAT	<<<;<<<<<;<<<<<<<<<<<<<<<<<68<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS221_1:6:4:1131:104	147	seq2	1307	99	35M	=	1487	215	ATGTAACAAATCTGCGCTTGTACTTCTAAATCTAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<::	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:178:342:866	83	seq2	1311	72	35M	=	1155	-191	AACAAATCTGCGCTTGTACTTCTAAATCTATAAAA	<<9<<<&;;<<<<77<;<<<5;:<<<:<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:119:880:781	147	seq2	1312	99	35M	=	1157	-190	ACAAATCTGCGCTTGTACTTCTAAATCTATAACAA	;8<<;<<<<:<84<<<<:<<<<<<<<<<<<<5<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_591:2:46:220:58	83	seq2	1313	99	36M	=	1483	206	CAAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA	<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<:<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:47:591:698	147	seq2	1313	99	35M	=	1146	-202	CAAATCTGCGCTTGTACTTCTAAATCTATAACAAA	7;;;;:<<:<:<<<<<7<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_105:1:115:226:443	147	seq2	1314	99	35M	=	1137	-212	AAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA	<<;;<;<<<<<<<<<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:198:59:675	83	seq2	1315	99	35M	=	1150	-200	AATCTGCGCTTGTACTTCTAAATCTATAACAAAAT	<<<<<4<4<:<<<;7<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS221_3:2:76:1729:813	147	seq2	1317	99	35M	=	1506	224	TCTGCGCTTGTACTTCTAAATCTATAAAAAAATTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:147:360:141	83	seq2	1319	47	35M	=	1501	218	TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA	<<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<7	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_95:7:155:530:532	83	seq2	1319	99	35M	=	1128	-226	TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA	:<<<><<8<<<<<><<<<<><<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS51_62:4:308:614:911	83	seq2	1319	90	35M	=	1493	209	TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<8<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_65:3:155:541:234	83	seq2	1319	99	35M	=	1151	-203	TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA	78;<7<<<<<<<<<<<<<<;<<<<<<<<<<;<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:175:289:351	147	seq2	1319	99	35M	=	1144	-210	TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA	9;;:+<<<<<;<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:283:186:707	83	seq2	1321	99	36M	=	1154	-203	CGCTTGTACTTCTAAATCTATAACAAAATTAAAATT	889;<7;<7<<7<<<<<7<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_105:3:308:66:538	147	seq2	1321	99	35M	=	1138	-218	CGCTTGTACTTCTAAATCTATAACAAAATTAAAAT	996999;<9;<:<<<<<:<<7<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_108:5:11:555:330	147	seq2	1321	99	35M	=	1492	206	CGCTTGTACTTCTAAATCTATAAAAAAATTAAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<4<;<	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:84:411:336	73	seq2	1322	75	35M	*	0	0	GCTTGTACTTCTAAATCTATAAAAAAATTAAAATT	<<<;<<<;<<<<<<<<<<<<:<<;<<<<<<;8<;<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:52:1278:1478	147	seq2	1322	47	35M	=	1513	226	GCTTGTACTTCTAAATCTATAACAAAATTAAAATT	<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<9<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_53:3:101:809:776	147	seq2	1326	99	35M	=	1160	-201	GTACTTCTAAATCTATAAAAAAATTAAAATTTAAC	<<<-<;7;<<<<:;<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:221:881:916	147	seq2	1327	96	35M	=	1168	-194	TAATTCTAAATCTAGAACAAAATTAAAATTTAACA	44%-4(5<;9/,:<68:1<:8<:<<84;<<<<<;<	MF:i:18	Aq:i:24	NM:i:3	UQ:i:41	H0:i:0	H1:i:0
+EAS1_105:1:28:745:352	147	seq2	1329	99	35M	=	1159	-205	CTTCTAAATCTATAACAAAATTAAAATTTAACAAA	4;;*;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_45:2:23:1754:796	83	seq2	1329	99	35M	=	1488	194	CTTCTAAATCTATAAAAAAATTAAAATTTAACAAA	;<<;<;<;<;<;<<;;;;;<<<<;;<<<<<97999	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:96:419:327	147	seq2	1331	99	35M	=	1149	-217	TCTAAATCTATAACAAAATTAAAATTTAACAAAAG	;1<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_97:4:274:287:423	147	seq2	1332	75	35M	=	1515	218	CTAAATCTATAAAAAAATTAAAATTTAACAAAAGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:35:392:2042	83	seq2	1332	99	35M	=	1168	-199	ATAAATCTATAAAAAAATTAAAATTTAACAAAAGT	+<<<<</<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS54_65:2:94:356:809	83	seq2	1334	99	35M	=	1151	-218	AAATCTATAACAAAATTAAAATTTAACAAAAGTAA	<<<<3<<<<;;<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS114_30:7:319:11:255	83	seq2	1337	92	35M	=	1179	-193	TCTATAAAAAAATTAAAATTTAACAAAAGTAAATA	;8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:35:538:1882	83	seq2	1337	98	35M	=	1160	-212	TCTATAACAAAATTAAAATTTAACAAAAGTAAATA	73797;;3<;;<6;;<<<;8:;:;<;:<:;<<;;;	MF:i:18	Aq:i:43	NM:i:1	UQ:i:18	H0:i:0	H1:i:1
+EAS51_66:1:64:182:741	153	seq2	1338	10	35M	*	0	0	AAAAAAACAAATTAAACTCTAACAAAAGTAAATAA	(+;1&(9*%0<*(*&<*5,/+<,&<&<<6<<<<<<	MF:i:32	Aq:i:10	NM:i:6	UQ:i:63	H0:i:0	H1:i:0
+EAS54_61:4:86:660:932	147	seq2	1338	99	35M	=	1154	-219	ATATAAAAAAATTAAAATTTAACAAAAGTAAATAA	&<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_53:8:122:430:882	147	seq2	1338	99	35M	=	1147	-226	CTATAAAAAAATTAAAATTTAACAAAAGTAAATAA	0<<:<<<<<<<:3<<<<<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:99:557:427	83	seq2	1342	99	35M	=	1186	-191	AACAAAATTAAAATTTAACAAAAGTAAATAAAACA	<<-<<<<9<<<<<:<<<<9<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+B7_593:5:299:743:762	83	seq2	1345	99	36M	=	1173	-208	AAAATTAAAATTTAACAAAAGTAAATAAAACACATA	;<<<1<<<<<+<;<;7<<;<<<<<<<<<;<<;;<<7	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:303:428:326	83	seq2	1345	74	35M	=	1515	205	AAAATTAAAATTTAACAAAAGTAAATAAAACACAT	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:192:714:341	83	seq2	1346	99	35M	=	1170	-211	AAATTAAAATTTAACAAAAGTAAATAAAACACATA	<<<3;<<<<9:<<</<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:189:876:833	83	seq2	1349	99	36M	=	1173	-212	TTAAAATTTAACAAAAGTAAATAAAACACATAGCTA	7;<<<<:;;<</<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:37:79:581	147	seq2	1349	68	35M	=	1533	219	TTAAAATTTAAAAAAAGTAAATAAAACACATAGCT	<>4<>>>>;>>&>->9>9;4>->>>>,4>9>,<1>	MF:i:18	Aq:i:27	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS139_19:2:82:154:1333	83	seq2	1349	77	40M	=	1511	202	TTAAAATTTAACAAAAGTAAATAAAACACACAGCTAAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;:;:	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:1	H1:i:0
+EAS188_7:1:290:286:763	83	seq2	1349	75	35M	=	1515	201	TTAAAATTTAACAAAAGTAAATAAAACACATAGCT	<<<<<<<<<<<<<<<<7<<<<<<<<<<<<<<<8<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:3:248:1491	73	seq2	1349	99	35M	*	0	0	TTAAAATTTAACAAAAGTAAATAAAACACATAGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:8:<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:3:6:1064:1805	83	seq2	1350	99	35M	=	1502	187	TAAAATTTAACAAAAGTAAATAAAACACATAGCTA	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:137:811:130	83	seq2	1351	99	35M	=	1175	-211	AAAATTTAACAAAAGTAAATAAAACACATAGCTAA	<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:155:809:543	83	seq2	1352	99	35M	=	1156	-231	AAATTTAACAAAAGTAAATAAAACACATAGCTAAA	<<<+0<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:41:468:459	83	seq2	1352	75	35M	=	1513	196	AAATTTAACAAAAGTAAATAAAACACATAGCTAAA	<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<;;7	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:31:622:216	73	seq2	1354	99	35M	*	0	0	ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<96<7	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:105:854:975	147	seq2	1354	71	35M	=	1523	202	ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<7:<;;;;5	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:26:749:174	147	seq2	1357	78	35M	=	1183	-209	TAACAAAAGTAAATAAAACACATAGCTAAAACTAA	(<<)<<<<6<<<<<<<<<<&:<3<<<6<<<)<:<<	MF:i:18	Aq:i:11	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:21:553:57	147	seq2	1358	99	35M	=	1197	-196	AACAAAAGTAAATAAAACACATAGCTAAAACTAAA	<<+<<<<<<<<<;<<<<8<<<<<<8<<<<<;<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:128:629:484	83	seq2	1359	96	35M	=	1185	-209	AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA	:(::<</*;<<99<<<-<;<<<<4<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS1_108:2:85:580:481	83	seq2	1359	99	35M	=	1167	-227	AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA	=)====77========8=3====3===========	MF:i:18	Aq:i:71	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+B7_589:8:139:727:808	83	seq2	1363	99	35M	=	1195	-203	AAGTAAATAAAACACATAGCTAAAACTAAAAAAGC	<<;<<<<<<<<<;<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:2:22:471:500	83	seq2	1365	99	35M	=	1200	-200	GTAAATAAAACACATAGCTAAAACTAAAAAAGCAA	=9===0====;=77<==8;====;===========	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:112:578:782	147	seq2	1366	89	35M	=	1183	-218	AAAATAAAACACATAGCTAAAACTAAAAAAGCAAA	+<<<%<<<<6<;<<<<6:<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS221_3:4:81:687:1379	83	seq2	1366	99	35M	=	1210	-191	TAAATAAAACACATAGCTAAAACTAAAAAAGCAAA	<<<<<<<<<<<:<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:320:20:250	83	seq2	1367	77	35M	=	1532	200	AAATAAAACACATAGCTAAAACTAAAAAAGCAAAA	<<<<<<<<<<<<<<<<<;<<<<<<<<<;+:<;<<3	MF:i:18	Aq:i:6	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:312:985:871	83	seq2	1369	99	35M	=	1212	-192	ATAAAACACATAGCTAAAACTAAAAAAGCAAAAAC	<8<<<<.<.<<<<:<<<<<.<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:12:484:836	83	seq2	1372	99	35M	=	1197	-210	AAACACATAGCTAAAACTAAAAAAGCAAAAACAAA	<<<<</<4<<&7<<<<;<<<<<<<<<<<<<1<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:176:402:458	83	seq2	1376	99	36M	=	1210	-202	AAATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA	</<+<4&;<<<<7<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:14	H0:i:1	H1:i:0
+EAS139_11:7:50:1229:1313	147	seq2	1376	77	35M	=	1528	187	ACATAGCTAAAACTAAAAAAGCAAAAACAAAAACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:4:124:367:72	83	seq2	1377	99	35M	=	1175	-237	CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA	,<<<8,<<<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:267:170:250	83	seq2	1377	99	35M	=	1189	-223	CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA	-<;<5-:<<<<;<<<<<<<;;<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:6:24:105:1046	147	seq2	1377	99	35M	=	1184	-228	CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA	+<<<</<<<<<.<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:38:557:1441	83	seq2	1381	99	35M	=	1212	-204	GATAAAAATAAAAAAGCAAAAACAAAAACTATGCT	<&<<<<<,<<<<<<<<8<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:2	UQ:i:16	H0:i:0	H1:i:1
+EAS188_7:7:67:719:786	83	seq2	1383	43	35M	=	1218	-200	TAAAAAAAAAAAAGCAAAAACAAAAACTATGCTAA	$<<;<-1<<<8<<*&<;<;,<<3<<<<33<<<33<	MF:i:18	Aq:i:13	NM:i:2	UQ:i:28	H0:i:1	H1:i:0
+EAS114_39:2:5:1219:137	147	seq2	1384	99	35M	=	1209	-210	AAAACTAAAAAAGCAAAAACAAAAACTATGCTAAG	<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:68:242:834	83	seq2	1386	99	36M	=	1200	-222	AAATAAAAAAGCAAAAACAAAAACTATGCTAAGTAT	<<68<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:1	UQ:i:21	H0:i:1	H1:i:0
+EAS51_66:3:166:532:438	147	seq2	1386	99	35M	=	1194	-227	AACTAAAAAAGCAAAAACAAAAACTATGCTAAGTA	<<&7<<<<<<<+<<<<<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:139:989:144	83	seq2	1387	99	35M	=	1201	-221	ACTAAAAAAGCAAAAACAAAAACTATGCTAAGTAT	<&<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:81:12:1231	83	seq2	1391	99	35M	=	1228	-198	AAAAAGCAAAAACAAAAACTATGCTAAGTATTGGT	<<<<<<<7<<<<<<<5<'<6/<<<5<<<<<<2<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:8:72:44:435	147	seq2	1392	76	35M	=	1235	-192	AAAAGCAAAAACAAAAACTATGCTAAGTATTGGTA	<<<<;7;<<<<;<<<<<<<<<<;<<<;<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:211:954:174	147	seq2	1393	99	35M	=	1207	-221	AAAGAAAAAACAAAAACTATGCTAAGTATTGGTAA	====*=====6========================	MF:i:18	Aq:i:75	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+B7_595:7:149:123:265	83	seq2	1395	99	35M	=	1213	-217	AGCAAAAACAAAAACTATGCTAAGTATTGGTAAAG	<;&<<<<<:<<<<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:7:282:424	147	seq2	1397	83	35M	=	1233	-199	CAAAAACAAAAACTATGCTAAGTATTGTTAAAGAT	1<<<<<9<<<<<31<77;;;;7<3<<2+;<3<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+B7_593:2:68:140:542	147	seq2	1398	95	36M	=	1217	-217	AAAAACAAAAACTATGCTAAGTATTGGTAAAGATGT	;;<<;7<<<<<<:<<<:<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:76:282:1668	147	seq2	1401	99	35M	=	1240	-196	AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG	<<<<<:<<<8<8<<<<<::<<<<7<<<<<<2<<<8	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:41:519:609	83	seq2	1401	99	35M	=	1229	-207	AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG	<4;<;<<<<<<<<;4:<<;<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:100:238:596	83	seq2	1403	56	35M	=	1220	-218	CAAAAACTATTCTAAGTATTGGTAAAGATGTGGGG	4<<<<;<3<3&<3<1<5<31<<3<<<<<<2<<;<,	MF:i:18	Aq:i:17	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS51_64:3:255:45:399	83	seq2	1404	99	35M	=	1238	-201	AAAAACTATGCTAAGTATTGGTAAAGATGTGGGGA	<5<5<4$;;7/<<<177&7;<<<<<<;<<4<<<<<	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:43:47:279	83	seq2	1405	99	35M	=	1206	-234	AAAACTATGCTAAGTATTGGTAAAGATGTGGGGAA	<:<<79<<<19<<<1<<9<<+<<<<<3<3<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:215:516:299	147	seq2	1406	99	35M	=	1226	-215	AAGCTATGCTAAGTATTGGTAAAGATGTGGGGAAA	;;))7<8:855<<4<;:<<87<<<7<<;<<<*3<<	MF:i:18	Aq:i:64	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+B7_591:7:116:814:89	147	seq2	1408	99	36M	=	1231	-213	ACTATGCTAAGTATTGGTAAAGATGTGGGGAAAAAA	:38<;<;<<<<;<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:34:144:868	83	seq2	1412	76	35M	=	1226	-221	AGCTAAGGAATGGGAAAGGTGTGGGGAAAAAAGTA	&9+&7<&&0&<6<.0<<7<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:4	UQ:i:50	H0:i:0	H1:i:0
+EAS51_62:7:312:236:655	83	seq2	1412	99	35M	=	1222	-225	TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA	<<8;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:17:1179:393	147	seq2	1412	99	35M	=	1232	-215	TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:107:447:488	83	seq2	1412	99	35M	=	1233	-214	TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA	<<3<<<<<<6<<<<<<<<<<<<<<<<7<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:73:420:812	147	seq2	1414	66	35M	=	1232	-217	CTAAGTATTGGTAAAGATGTGGGGAAAAAAGTAAA	5'<<<,<&,<<,<<<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:215:840:760	83	seq2	1416	99	35M	=	1256	-195	AAGTATTGGTAAAGATGTGGGGAAAAAAGTAAACT	<<<8<::<;;<<<:<7<7<;;;<<<<<<<<<<;<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:118:829:36	147	seq2	1417	99	35M	=	1233	-219	AGTATTGGTAAAGATGTGGGGAAAAAAGTAAACTC	<8<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:290:121:79	83	seq2	1420	99	35M	=	1257	-198	ATTGGTAAAGATGTGGGGAAAAAAGTAAACTCTCA	<1<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:174:557:872	83	seq2	1423	99	35M	=	1237	-221	GGTAAAGATGTGGGGAAAAAAGTAAACTCTCAAAT	.77<:<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:315:412:921	147	seq2	1424	99	35M	=	1254	-205	GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATA	4-<79;<<<4:;:<<<<<<<<4<<<38<<;<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:95:944:247	147	seq2	1424	99	40M	=	1238	-226	GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATATTGCT	:7::;<<<<<;;<<<<<<<<<<<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:137:741:866	83	seq2	1429	99	35M	=	1268	-196	GATGAGGGGAAAAAAGTAAACTCTCAAATATTGCT	<;0:%<:9<<<:<<<<;<<:<<;0;<<<<<::<<6	MF:i:18	Aq:i:70	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS188_7:6:191:540:493	147	seq2	1432	99	35M	=	1273	-194	GTGGGGAAAAAAGTAAACTCTCAAATATTGCTAGT	<<9<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:49:911:980	83	seq2	1434	99	35M	=	1241	-228	GGGGAAAAAAGTAAACTCTCAAATATTGCTAGTGG	44:7<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:248:122:558	83	seq2	1436	99	35M	=	1243	-228	GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA	<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:168:609:646	147	seq2	1436	99	36M	=	1264	-208	GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG	;;<<<<=======;;:;======;==<=========	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:7:1347:375	83	seq2	1436	99	35M	=	1271	-200	GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA	47999<<<;;;;;;:5;:;<;;<;;;;;<;;;;;<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:282:962:46	147	seq2	1437	99	35M	=	1282	-190	GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG	69<<<<<:<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:169:714:644	83	seq2	1437	99	35M	=	1231	-241	GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG	;<<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:84:92:1246	83	seq2	1437	99	35M	=	1265	-207	GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG	<<<<<<<<<<<<<<<8<<<<<<5<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:71:62:254	83	seq2	1438	99	35M	=	1264	-209	AAAAAAGTAAACTCTCAAATATTGCTAGTGGGAGT	<<<<<<;8<<<<;<:<<<<<<<;<<;<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:28:979:519	83	seq2	1439	99	35M	=	1278	-196	AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA	<<<<<6<<<<<<<<<<<<<<<8<<<<<<<<6<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:63:28:1549	83	seq2	1439	77	35M	=	1247	-227	AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA	<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:15:244:876	147	seq2	1440	43	36M	=	1246	-230	AAAAGTAAACTCTCAAATATTGCTAGTGTGAGTATA	;<<<7<<<<<.2<-<<<<<<<<<:<<<<<<<<<2<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_59:8:80:542:549	83	seq2	1443	99	35M	=	1271	-207	AGTAAACTCTCAAATATTGCTAGTGGGAGTATAAA	=9====7=;=======;;==;========<=====	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:173:627:465	83	seq2	1444	99	36M	=	1260	-220	GTAAACTCTCAAATATTGCTAGTGGGAGTATAAATT	:<<<<;<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:54:1351:910	147	seq2	1448	99	35M	=	1270	-213	ACTCTCAAATATTGCTAGTGGGAGTATAAATTGTT	<7<7;;<<<<<;<<;;<<;<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:7:44:1807:833	147	seq2	1449	99	40M	=	1301	-188	CTCTCAAATATTGCTAGTGGGAGTATAAATTGTTTTCCAC	:6:9:<<<6<88<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:290:247:509	83	seq2	1450	99	35M	=	1276	-209	TCTCAAATATTGCTAGTGGGAGTATAAATTGTTTT	49';<<<<<8;<;;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:42:804:114	83	seq2	1452	99	35M	=	1281	-206	TCAAATATTGCTAGTGGGAGTATAAATTGTTTTCC	;9<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:39:1671:1928	83	seq2	1453	99	35M	=	1276	-212	CAAATATTGCTAGTGGGAGTATAAATTGTTTTCCA	<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:90:629:652	147	seq2	1456	99	35M	=	1276	-215	ATATTGCTAGTGGGAGTATAAATTGTTTTCCACTT	<:<7::<:<<<<<8<<<<<<<<<<<<<<<<<<<7<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:1:289:207:323	83	seq2	1462	99	35M	=	1279	-218	CTAGTGGGAGTATAAATTGATTTCCACTTTGGAAA	&</<7<<:<7::<<<<+3<-7<<:<7<<<<<<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS1_95:7:280:607:113	83	seq2	1468	99	35M	=	1303	-200	GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT	18<-<<<<<<<<<<<<<8<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:21:423:169	147	seq2	1468	99	35M	=	1270	-233	GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT	;376;0<<<<99<<<<<<-;<4<<<<<<<<<;<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:45:758:616	83	seq2	1473	99	35M	=	1280	-228	ATAAATTGTTTTCCACTTTGGAAAACAATTTGGTA	<<;<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:2:326:153:231	83	seq2	1477	43	35M	=	1290	-222	ATTGTTTTCAACTTTGGAAAACAATTTGGTAATTT	::6=68=<*$;*=========6=============	MF:i:18	Aq:i:0	NM:i:1	UQ:i:3	H0:i:0	H1:i:1
+EAS192_3:3:88:866:774	83	seq2	1478	99	35M	=	1307	-206	TTGTTTTCCACTTTGGAAAACAATTTGGTAATTTC	<<<;<<<<:<<<<<:<8<<<<<<<<<<8<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:194:867:616	147	seq2	1481	99	35M	=	1303	-213	TTTTCCACTTTGGAAAACAATTTGGTAATTTCGTT	38:;;:<:<<<<;<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:46:220:58	147	seq2	1483	99	36M	=	1313	-206	TTCCACTTTGGAAAACAATTTGGTAATTTCGTTTTT	98<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:109:953:668	147	seq2	1485	99	35M	=	1297	-223	CCACTTTGGAAAACAATTTGGTAATTTCGTTTTTT	<:)9<<<<<<<<8:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:4:1131:104	83	seq2	1487	99	35M	=	1307	-215	ACTTTGGAAAACAATTTGGTAATTTCGTTTTTTTT	61;;;<<<<<<<<<;:<<<:<<;<<<<;<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:23:1754:796	147	seq2	1488	99	35M	=	1329	-194	CTTTGGAAAACAATTTGGTAATTTCGTTTTTTTTT	88897;;;;:;:;;;;;;;;;;;;;;;;;;;;;;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:11:555:330	83	seq2	1492	99	35M	=	1321	-206	GGAAAACAATTTGGTAATTTCGTTTTTTTTTTTTT	6;6;9766+<<<<9:2=<===6=============	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:308:614:911	147	seq2	1493	90	35M	=	1319	-209	AAAAACAATTTGGTAATTTAGTTTTTTTTTTTTTC	%<<<;:<::<6,<<<<<<:<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:2	UQ:i:31	H0:i:0	H1:i:1
+EAS139_19:1:82:946:392	83	seq2	1493	99	40M	=	1297	-236	GAAAACAATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTC	:;:;:,::<:;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:260:147:818	83	seq2	1497	82	35M	=	1303	-229	AAAATTTGGTAATTTAGTTTTTTTTTTTTTCTTTT	6.=..++==6=76==&===========99======	MF:i:18	Aq:i:41	NM:i:2	UQ:i:18	H0:i:0	H1:i:1
+B7_591:5:124:978:501	83	seq2	1499	99	36M	=	1307	-228	AATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTC	<9<;<<::<;<<;<4<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:147:360:141	147	seq2	1501	47	13M1D22M	=	1319	-218	TTTGGTAATTTAGTTTTTTTTTTTTCTTTTCTCTT	<86<<<<73<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:0
+EAS114_39:3:6:1064:1805	147	seq2	1502	99	35M	=	1350	-187	TTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTCTT	;88<;<;;<<;;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:76:1729:813	83	seq2	1506	99	35M	=	1317	-224	TAATTTCGTTTTTTTTTTTTTCTTTTCTCTTTTTT	<+6<<<&1<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS54_65:6:326:71:741	153	seq2	1509	0	35M	*	0	0	TCTCGTTTTTTTTTCTTTCTTTTCTCTTTTTTTTT	!!<66<<<<<<<<<&<<7&<<<<:<*<<<<<<<<1	MF:i:32	Aq:i:0	NM:i:2	UQ:i:22	H0:i:1	H1:i:12
+EAS112_34:6:145:144:263	73	seq2	1509	0	35M	*	0	0	TTTCGTTTTTTTTTTTTTTTTTTCCCCTTTCTTTT	<<<<<<<<<<<<<<<<+4+4&+&(&&*2&8&&&)&	MF:i:32	Aq:i:0	NM:i:4	UQ:i:29	H0:i:0	H1:i:0
+EAS1_105:1:329:407:872	73	seq2	1510	0	35M	*	0	0	TTCGTTTTTTTTTTTTTTTTTTCCCTTTTTTTTTT	<<<<<<<<<<<<<<<<<<6;<<&4::<++<(&;<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:46	H0:i:0	H1:i:0
+EAS139_19:2:82:154:1333	147	seq2	1511	77	40M	=	1349	-202	TTTTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTTTTT	:5'::<<<;<<<<<<</3<<<&4&7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:85	H1:i:85
+EAS56_63:3:41:468:459	147	seq2	1513	0	35M	=	1352	-196	TTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTT	+;<<<<<<<<<<<;&<<;;88&<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:85	H1:i:85
+EAS114_28:6:11:151:750	153	seq2	1513	5	36M	*	0	0	GTTTTTATTTTTTTCCTCTCTCTTTTTTTTTTTTTT	:'1:%4;4<<<+;6;&9+6;/<<<<<<<<<<<<<<<	MF:i:32	Aq:i:5	NM:i:3	UQ:i:41	H0:i:0	H1:i:3
+EAS139_11:5:52:1278:1478	83	seq2	1513	47	35M	=	1322	-226	GTTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTT	.8::<<<<<<<;<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:9	H1:i:85
+B7_591:2:309:798:997	153	seq2	1514	0	36M	*	0	0	TTTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT	466;<<744077+&7097&%&4<9<<<9<<<::<<<	MF:i:32	Aq:i:0	NM:i:1	UQ:i:5	H0:i:12	H1:i:85
+EAS1_93:6:218:144:794	89	seq2	1514	0	35M	=	1514	-35	TTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT	;92/;5:<6)+<5)67</9<&<&<<<:<<<57<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:22	H1:i:85
+EAS1_93:6:218:144:794	149	seq2	1514	0	*	=	1514	35	GGGTGCATTGCTATGTTGCGGTCGCTTTGCCTCCT	++(3:&)5<9035<3):-<53<+&&-+)<<&)&<6	MF:i:-64
+EAS1_97:6:222:305:337	153	seq2	1514	0	35M	*	0	0	TTTTTTTTTTTTTTTTTTCCCTTTTTTTTTTTTTT	;;;;;<<';<<<<*;<<<78;7<7<;<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:32	H0:i:0	H1:i:37
+EAS1_105:3:7:35:528	89	seq2	1514	0	35M	*	0	0	TTTTTTTTTTGTTCTTTACTCTTTTTTTTTTTTTT	<<<<<<<<<<5<<<(<<%<<-8<<<<<<<<<8<<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:24	H0:i:0	H1:i:0
+EAS54_65:2:182:924:833	137	seq2	1514	0	35M	*	0	0	TTTTTTTTTTTTTATTTGCGCTTTTTTTTTTTTTT	<<<<<<<<<<<<<)7<<)3/:07<<9<9<<==<7<	MF:i:32	Aq:i:0	NM:i:3	UQ:i:30	H0:i:0	H1:i:0
+EAS54_81:8:78:735:536	153	seq2	1514	0	35M	*	0	0	TTTTTTTTTTTTTCATTTCTCTTTTTTTTTTTTTT	;9<<<<<<<.7<9'%1<<)2::<<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:1	UQ:i:4	H0:i:0	H1:i:15
+EAS56_59:5:232:336:46	137	seq2	1514	0	35M	*	0	0	ATTTTTTTTTTTTCTTTTCTCTTGTTTCTTTTTTT	+<<<<<<<<<<<<6<<<<;<6<<&&<,3<<<<3,,	MF:i:32	Aq:i:0	NM:i:3	UQ:i:50	H0:i:0	H1:i:0
+EAS188_4:5:308:552:77	89	seq2	1514	0	35M	*	0	0	TTTTCTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT	1;-<%<;8<<<<<&<5-<58:5:<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:1	UQ:i:4	H0:i:30	H1:i:85
+B7_597:5:125:957:753	137	seq2	1515	0	35M	*	0	0	TTTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTT	<8<<<;<8;8//++(,(+++&++(/+008880;;/	MF:i:32	Aq:i:0	NM:i:2	UQ:i:14	H0:i:0	H1:i:1
+EAS1_97:4:274:287:423	83	seq2	1515	0	35M	=	1332	-218	TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT	7<<<<9<<9<<<.<<<<90-<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:12	H1:i:85
+EAS54_71:8:234:21:950	89	seq2	1515	0	33M	*	0	0	TTTTTTTTTTTTCTCCTCTCTTTTTTTTTTTTT	<<<<<<<<<&<;2;&-<,<+;<<<7<<<;<;<;	MF:i:32	Aq:i:0	NM:i:2	UQ:i:17	H0:i:0	H1:i:7
+EAS56_61:6:256:67:461	85	seq2	1515	0	*	=	1515	35	TCATGTTTGTGTCTTTCTATGCATTTTTTTTTTTT	!!7181!63:6-:!-163(-1%-18<<4<<<<<<<	MF:i:-64
+EAS56_61:6:256:67:461	153	seq2	1515	0	35M	=	1515	-35	TTGTTTTTTCTTCTTTTCTCTTTTTTTTTTTTTTT	*.%53.:)1+9;3397;1795507+335;.&51)5	MF:i:64	Aq:i:0	NM:i:2	UQ:i:14	H0:i:2	H1:i:85
+EAS56_65:8:317:83:500	153	seq2	1515	0	35M	*	0	0	TTTTTTTTTTTTCTTTTCTCCTTTTTTTTTTGTTT	;;;;;<<<<<<<3<<<)-;31<<)97<;9<<:<<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:41	H0:i:0	H1:i:0
+EAS114_30:2:303:428:326	147	seq2	1515	0	35M	=	1345	-205	TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT	4<;<<;<;<4<<8;;;;.8+;<<;<8<;<;<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:11	H1:i:85
+EAS188_7:1:290:286:763	147	seq2	1515	75	35M	=	1349	-201	TTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTTT	<<<<;<<<<<<<&<<<<&77<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:29	H1:i:85
+B7_591:7:89:67:709	89	seq2	1516	0	36M	*	0	0	TTTTTTTTTTTGTCTTCTCTTTTTTTTTTTTTTTTT	:7:::9:7:<<7<'<<477<<<<<<<<<:<<<<<:<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:28	H0:i:0	H1:i:17
+EAS56_65:3:47:64:359	89	seq2	1516	0	35M	*	0	0	TTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTTT	<<<6<<<<<<<4<4</9<4@<<;<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:33	H0:i:0	H1:i:6
+EAS56_65:4:296:78:421	89	seq2	1518	0	35M	=	1518	-35	TCTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTT	!!<<<:<<<<..<::<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:1	UQ:i:4	H0:i:85	H1:i:85
+EAS56_65:4:296:78:421	149	seq2	1518	0	*	=	1518	35	TGTTGGTGTTCGTTTTTTCTCCTGTTTCTTTTTCT	<<*<4<<<;:<0<<<<<<<<+;<9<<1<<;<<<+:	MF:i:-64
+EAS1_95:4:238:124:196	89	seq2	1519	0	35M	*	0	0	TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT	<0<9.<5.5<<<<9<1<<5<<85<5<<<9<:<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:85	H1:i:85
+EAS54_65:7:56:57:985	85	seq2	1519	0	*	=	1519	35	TTCTGTCTTCTCTCCTGTCTTCTTTTCTCTTCTTT	<9'<.<7<<2<<;77<7<<<<7<7<<<<7<<<2<<	MF:i:-64
+EAS54_65:7:56:57:985	153	seq2	1519	0	35M	=	1519	-35	TTTTTTCTCTTTTCTCTTTTTTTTTTTTTTTTTTT	666666*6&1666+64666666666&266666666	MF:i:64	Aq:i:0	NM:i:1	UQ:i:9	H0:i:85	H1:i:85
+EAS56_61:3:5:45:441	89	seq2	1519	0	35M	*	0	0	TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT	;;58:<:<(:<<11<&<1<<;<<<<><<<<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:82	H1:i:85
+B7_589:6:33:356:636	73	seq2	1520	0	35M	*	0	0	TTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTTT	<<<<<<<8;<<<<<<<<<<<<<7<<<<<<<;;3&3	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:14	H1:i:85
+EAS114_45:6:86:859:1779	137	seq2	1520	0	35M	*	0	0	TTTTTTTCATTTCTCTTTTTTTTTTTTTTTTTTTT	;;;;;;;;;;;;;;;;;;;;;;;;;;;8;;)7699	MF:i:32	Aq:i:0	NM:i:1	UQ:i:26	H0:i:0	H1:i:15
+EAS54_71:8:105:854:975	83	seq2	1523	71	33M	=	1354	-202	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTG	<<<<;<:<<;<&<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:85	H1:i:85
+EAS51_62:4:187:907:145	153	seq2	1524	28	35M	*	0	0	TTTCTTCTCTCTCTTTTTTTTTTTTTTTATTGCAT	<<<+;;,6<<<<6<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:28	NM:i:3	UQ:i:59	H0:i:0	H1:i:0
+EAS54_71:4:284:269:882	73	seq2	1524	0	34M	*	0	0	TTTCTTTTCTCTTTTTTTTTTTTTTGTTTTTGCA	<;<<<<<8<7<8;<<<;<7<<<<<;272;73&&)	MF:i:32	Aq:i:0	NM:i:1	UQ:i:17	H0:i:0	H1:i:85
+EAS56_63:4:141:9:811	137	seq2	1524	10	35M	*	0	0	TTTCTTTTCTCCTTTTTTTTTTTTTTTTTCTACAT	<<<;<<<<<<<;<;<:<<<;<<<<<<<<..));;.	MF:i:32	Aq:i:0	NM:i:3	UQ:i:47	H0:i:2	H1:i:27
+EAS114_30:6:277:397:932	73	seq2	1524	0	35M	*	0	0	TTTCTTTTCACTTTTTTTTTTTTTTTTTTTTACTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:8(,0%(	MF:i:32	Aq:i:0	NM:i:3	UQ:i:42	H0:i:2	H1:i:85
+EAS139_11:7:50:1229:1313	83	seq2	1528	77	35M	=	1376	-187	TTTTTTCTTTTTTTTTTTTTTTTTTTTGCATGCCA	<<<<,<&<7<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:11	H0:i:3	H1:i:7
+EAS54_65:3:320:20:250	147	seq2	1532	77	35M	=	1367	-200	TTTTTTTTTTTTTTTTTTTTTTTGCATGCCAGAAA	+'''/<<<<7:;+<;::<<<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:6	NM:i:2	UQ:i:24	H0:i:1	H1:i:2
+EAS114_26:7:37:79:581	83	seq2	1533	68	35M	=	1349	-219	TTTTTTTTTTTTTTTTTTTTTTTCATGCCAGAAAA	3,,,===6===<===<;=====-============	MF:i:18	Aq:i:27	NM:i:2	UQ:i:23	H0:i:0	H1:i:1
diff --git a/tests/data/lambdaNEB.fa b/tests/data/lambdaNEB.fa
new file mode 100644
index 0000000..33011e5
--- /dev/null
+++ b/tests/data/lambdaNEB.fa
@@ -0,0 +1,608 @@
+>lambda_NEB3011
+GGGCGGCGACCTCGCGGGTTTTCGCTATTTATGAAAATTTTCCGGTTTAAGGCGTTTCCGTTCTTCTTCGTCATAACTTA
+ATGTTTTTATTTAAAATACCCTCTGAAAAGAAAGGAAACGACAGGTGCTGAAAGCGAGCTTTTTGGCCTCTGTCGTTTCC
+TTTCTCTGTTTTTGTCCGTGGAATGAACAATGGAAGTCAACAAAAAGCAGCTGGCTGACATTTTCGGTGCGAGTATCCGT
+ACCATTCAGAACTGGCAGGAACAGGGAATGCCCGTTCTGCGAGGCGGTGGCAAGGGTAATGAGGTGCTTTATGACTCTGC
+CGCCGTCATAAAATGGTATGCCGAAAGGGATGCTGAAATTGAGAACGAAAAGCTGCGCCGGGAGGTTGAAGAACTGCGGC
+AGGCCAGCGAGGCAGATCTCCAGCCAGGAACTATTGAGTACGAACGCCATCGACTTACGCGTGCGCAGGCCGACGCACAG
+GAACTGAAGAATGCCAGAGACTCCGCTGAAGTGGTGGAAACCGCATTCTGTACTTTCGTGCTGTCGCGGATCGCAGGTGA
+AATTGCCAGTATTCTCGACGGGCTCCCCCTGTCGGTGCAGCGGCGTTTTCCGGAACTGGAAAACCGACATGTTGATTTCC
+TGAAACGGGATATCATCAAAGCCATGAACAAAGCAGCCGCGCTGGATGAACTGATACCGGGGTTGCTGAGTGAATATATC
+GAACAGTCAGGTTAACAGGCTGCGGCATTTTGTCCGCGCCGGGCTTCGCTCACTGTTCAGGCCGGAGCCACAGACCGCCG
+TTGAATGGGCGGATGCTAATTACTATCTCCCGAAAGAATCCGCATACCAGGAAGGGCGCTGGGAAACACTGCCCTTTCAG
+CGGGCCATCATGAATGCGATGGGCAGCGACTACATCCGTGAGGTGAATGTGGTGAAGTCTGCCCGTGTCGGTTATTCCAA
+AATGCTGCTGGGTGTTTATGCCTACTTTATAGAGCATAAGCAGCGCAACACCCTTATCTGGTTGCCGACGGATGGTGATG
+CCGAGAACTTTATGAAAACCCACGTTGAGCCGACTATTCGTGATATTCCGTCGCTGCTGGCGCTGGCCCCGTGGTATGGC
+AAAAAGCACCGGGATAACACGCTCACCATGAAGCGTTTCACTAATGGGCGTGGCTTCTGGTGCCTGGGCGGTAAAGCGGC
+AAAAAACTACCGTGAAAAGTCGGTGGATGTGGCGGGTTATGATGAACTTGCTGCTTTTGATGATGATATTGAACAGGAAG
+GCTCTCCGACGTTCCTGGGTGACAAGCGTATTGAAGGCTCGGTCTGGCCAAAGTCCATCCGTGGCTCCACGCCAAAAGTG
+AGAGGCACCTGTCAGATTGAGCGTGCAGCCAGTGAATCCCCGCATTTTATGCGTTTTCATGTTGCCTGCCCGCATTGCGG
+GGAGGAGCAGTATCTTAAATTTGGCGACAAAGAGACGCCGTTTGGCCTCAAATGGACGCCGGATGACCCCTCCAGCGTGT
+TTTATCTCTGCGAGCATAATGCCTGCGTCATCCGCCAGCAGGAGCTGGACTTTACTGATGCCCGTTATATCTGCGAAAAG
+ACCGGGATCTGGACCCGTGATGGCATTCTCTGGTTTTCGTCATCCGGTGAAGAGATTGAGCCACCTGACAGTGTGACCTT
+TCACATCTGGACAGCGTACAGCCCGTTCACCACCTGGGTGCAGATTGTCAAAGACTGGATGAAAACGAAAGGGGATACGG
+GAAAACGTAAAACCTTCGTAAACACCACGCTCGGTGAGACGTGGGAGGCGAAAATTGGCGAACGTCCGGATGCTGAAGTG
+ATGGCAGAGCGGAAAGAGCATTATTCAGCGCCCGTTCCTGACCGTGTGGCTTACCTGACCGCCGGTATCGACTCCCAGCT
+GGACCGCTACGAAATGCGCGTATGGGGATGGGGGCCGGGTGAGGAAAGCTGGCTGATTGACCGGCAGATTATTATGGGCC
+GCCACGACGATGAACAGACGCTGCTGCGTGTGGATGAGGCCATCAATAAAACCTATACCCGCCGGAATGGTGCAGAAATG
+TCGATATCCCGTATCTGCTGGGATACTGGCGGGATTGACCCGACCATTGTGTATGAACGCTCGAAAAAACATGGGCTGTT
+CCGGGTGATCCCCATTAAAGGGGCATCCGTCTACGGAAAGCCGGTGGCCAGCATGCCACGTAAGCGAAACAAAAACGGGG
+TTTACCTTACCGAAATCGGTACGGATACCGCGAAAGAGCAGATTTATAACCGCTTCACACTGACGCCGGAAGGGGATGAA
+CCGCTTCCCGGTGCCGTTCACTTCCCGAATAACCCGGATATTTTTGATCTGACCGAAGCGCAGCAGCTGACTGCTGAAGA
+GCAGGTCGAAAAATGGGTGGATGGCAGGAAAAAAATACTGTGGGACAGCAAAAAGCGACGCAATGAGGCACTCGACTGCT
+TCGTTTATGCGCTGGCGGCGCTGCGCATCAGTATTTCCCGCTGGCAGCTGGATCTCAGTGCGCTGCTGGCGAGCCTGCAG
+GAAGAGGATGGTGCAGCAACCAACAAGAAAACACTGGCAGATTACGCCCGTGCCTTATCCGGAGAGGATGAATGACGCGA
+CAGGAAGAACTTGCCGCTGCCCGTGCGGCACTGCATGACCTGATGACAGGTAAACGGGTGGCAACAGTACAGAAAGACGG
+ACGAAGGGTGGAGTTTACGGCCACTTCCGTGTCTGACCTGAAAAAATATATTGCAGAGCTGGAAGTGCAGACCGGCATGA
+CACAGCGACGCAGGGGACCTGCAGGATTTTATGTATGAAAACGCCCACCATTCCCACCCTTCTGGGGCCGGACGGCATGA
+CATCGCTGCGCGAATATGCCGGTTATCACGGCGGTGGCAGCGGATTTGGAGGGCAGTTGCGGTCGTGGAACCCACCGAGT
+GAAAGTGTGGATGCAGCCCTGTTGCCCAACTTTACCCGTGGCAATGCCCGCGCAGACGATCTGGTACGCAATAACGGCTA
+TGCCGCCAACGCCATCCAGCTGCATCAGGATCATATCGTCGGGTCTTTTTTCCGGCTCAGTCATCGCCCAAGCTGGCGCT
+ATCTGGGCATCGGGGAGGAAGAAGCCCGTGCCTTTTCCCGCGAGGTTGAAGCGGCATGGAAAGAGTTTGCCGAGGATGAC
+TGCTGCTGCATTGACGTTGAGCGAAAACGCACGTTTACCATGATGATTCGGGAAGGTGTGGCCATGCACGCCTTTAACGG
+TGAACTGTTCGTTCAGGCCACCTGGGATACCAGTTCGTCGCGGCTTTTCCGGACACAGTTCCGGATGGTCAGCCCGAAGC
+GCATCAGCAACCCGAACAATACCGGCGACAGCCGGAACTGCCGTGCCGGTGTGCAGATTAATGACAGCGGTGCGGCGCTG
+GGATATTACGTCAGCGAGGACGGGTATCCTGGCTGGATGCCGCAGAAATGGACATGGATACCCCGTGAGTTACCCGGCGG
+GCGCGCCTCGTTCATTCACGTTTTTGAACCCGTGGAGGACGGGCAGACTCGCGGTGCAAATGTGTTTTACAGCGTGATGG
+AGCAGATGAAGATGCTCGACACGCTGCAGAACACGCAGCTGCAGAGCGCCATTGTGAAGGCGATGTATGCCGCCACCATT
+GAGAGTGAGCTGGATACGCAGTCAGCGATGGATTTTATTCTGGGCGCGAACAGTCAGGAGCAGCGGGAAAGGCTGACCGG
+CTGGATTGGTGAAATTGCCGCGTATTACGCCGCAGCGCCGGTCCGGCTGGGAGGCGCAAAAGTACCGCACCTGATGCCGG
+GTGACTCACTGAACCTGCAGACGGCTCAGGATACGGATAACGGCTACTCCGTGTTTGAGCAGTCACTGCTGCGGTATATC
+GCTGCCGGGCTGGGTGTCTCGTATGAGCAGCTTTCCCGGAATTACGCCCAGATGAGCTACTCCACGGCACGGGCCAGTGC
+GAACGAGTCGTGGGCGTACTTTATGGGGCGGCGAAAATTCGTCGCATCCCGTCAGGCGAGCCAGATGTTTCTGTGCTGGC
+TGGAAGAGGCCATCGTTCGCCGCGTGGTGACGTTACCTTCAAAAGCGCGCTTCAGTTTTCAGGAAGCCCGCAGTGCCTGG
+GGGAACTGCGACTGGATAGGCTCCGGTCGTATGGCCATCGATGGTCTGAAAGAAGTTCAGGAAGCGGTGATGCTGATAGA
+AGCCGGACTGAGTACCTACGAGAAAGAGTGCGCAAAACGCGGTGACGACTATCAGGAAATTTTTGCCCAGCAGGTCCGTG
+AAACGATGGAGCGCCGTGCAGCCGGTCTTAAACCGCCCGCCTGGGCGGCTGCAGCATTTGAATCCGGGCTGCGACAATCA
+ACAGAGGAGGAGAAGAGTGACAGCAGAGCTGCGTAATCTCCCGCATATTGCCAGCATGGCCTTTAATGAGCCGCTGATGC
+TTGAACCCGCCTATGCGCGGGTTTTCTTTTGTGCGCTTGCAGGCCAGCTTGGGATCAGCAGCCTGACGGATGCGGTGTCC
+GGCGACAGCCTGACTGCCCAGGAGGCACTCGCGACGCTGGCATTATCCGGTGATGATGACGGACCACGACAGGCCCGCAG
+TTATCAGGTCATGAACGGCATCGCCGTGCTGCCGGTGTCCGGCACGCTGGTCAGCCGGACGCGGGCGCTGCAGCCGTACT
+CGGGGATGACCGGTTACAACGGCATTATCGCCCGTCTGCAACAGGCTGCCAGCGATCCGATGGTGGACGGCATTCTGCTC
+GATATGGACACGCCCGGCGGGATGGTGGCGGGGGCATTTGACTGCGCTGACATCATCGCCCGTGTGCGTGACATAAAACC
+GGTATGGGCGCTTGCCAACGACATGAACTGCAGTGCAGGTCAGTTGCTTGCCAGTGCCGCCTCCCGGCGTCTGGTCACGC
+AGACCGCCCGGACAGGCTCCATCGGCGTCATGATGGCTCACAGTAATTACGGTGCTGCGCTGGAGAAACAGGGTGTGGAA
+ATCACGCTGATTTACAGCGGCAGCCATAAGGTGGATGGCAACCCCTACAGCCATCTTCCGGATGACGTCCGGGAGACACT
+GCAGTCCCGGATGGACGCAACCCGCCAGATGTTTGCGCAGAAGGTGTCGGCATATACCGGCCTGTCCGTGCAGGTTGTGC
+TGGATACCGAGGCTGCAGTGTACAGCGGTCAGGAGGCCATTGATGCCGGACTGGCTGATGAACTTGTTAACAGCACCGAT
+GCGATCACCGTCATGCGTGATGCACTGGATGCACGTAAATCCCGTCTCTCAGGAGGGCGAATGACCAAAGAGACTCAATC
+AACAACTGTTTCAGCCACTGCTTCGCAGGCTGACGTTACTGACGTGGTGCCAGCGACGGAGGGCGAGAACGCCAGCGCGG
+CGCAGCCGGACGTGAACGCGCAGATCACCGCAGCGGTTGCGGCAGAAAACAGCCGCATTATGGGGATCCTCAACTGTGAG
+GAGGCTCACGGACGCGAAGAACAGGCACGCGTGCTGGCAGAAACCCCCGGTATGACCGTGAAAACGGCCCGCCGCATTCT
+GGCCGCAGCACCACAGAGTGCACAGGCGCGCAGTGACACTGCGCTGGATCGTCTGATGCAGGGGGCACCGGCACCGCTGG
+CTGCAGGTAACCCGGCATCTGATGCCGTTAACGATTTGCTGAACACACCAGTGTAAGGGATGTTTATGACGAGCAAAGAA
+ACCTTTACCCATTACCAGCCGCAGGGCAACAGTGACCCGGCTCATACCGCAACCGCGCCCGGCGGATTGAGTGCGAAAGC
+GCCTGCAATGACCCCGCTGATGCTGGACACCTCCAGCCGTAAGCTGGTTGCGTGGGATGGCACCACCGACGGTGCTGCCG
+TTGGCATTCTTGCGGTTGCTGCTGACCAGACCAGCACCACGCTGACGTTCTACAAGTCCGGCACGTTCCGTTATGAGGAT
+GTGCTCTGGCCGGAGGCTGCCAGCGACGAGACGAAAAAACGGACCGCGTTTGCCGGAACGGCAATCAGCATCGTTTAACT
+TTACCCTTCATCACTAAAGGCCGCCTGTGCGGCTTTTTTTACGGGATTTTTTTATGTCGATGTACACAACCGCCCAACTG
+CTGGCGGCAAATGAGCAGAAATTTAAGTTTGATCCGCTGTTTCTGCGTCTCTTTTTCCGTGAGAGCTATCCCTTCACCAC
+GGAGAAAGTCTATCTCTCACAAATTCCGGGACTGGTAAACATGGCGCTGTACGTTTCGCCGATTGTTTCCGGTGAGGTTA
+TCCGTTCCCGTGGCGGCTCCACCTCTGAATTTACGCCGGGATATGTCAAGCCGAAGCATGAAGTGAATCCGCAGATGACC
+CTGCGTCGCCTGCCGGATGAAGATCCGCAGAATCTGGCGGACCCGGCTTACCGCCGCCGTCGCATCATCATGCAGAACAT
+GCGTGACGAAGAGCTGGCCATTGCTCAGGTCGAAGAGATGCAGGCAGTTTCTGCCGTGCTTAAGGGCAAATACACCATGA
+CCGGTGAAGCCTTCGATCCGGTTGAGGTGGATATGGGCCGCAGTGAGGAGAATAACATCACGCAGTCCGGCGGCACGGAG
+TGGAGCAAGCGTGACAAGTCCACGTATGACCCGACCGACGATATCGAAGCCTACGCGCTGAACGCCAGCGGTGTGGTGAA
+TATCATCGTGTTCGATCCGAAAGGCTGGGCGCTGTTCCGTTCCTTCAAAGCCGTCAAGGAGAAGCTGGATACCCGTCGTG
+GCTCTAATTCCGAGCTGGAGACAGCGGTGAAAGACCTGGGCAAAGCGGTGTCCTATAAGGGGATGTATGGCGATGTGGCC
+ATCGTCGTGTATTCCGGACAGTACGTGGAAAACGGCGTCAAAAAGAACTTCCTGCCGGACAACACGATGGTGCTGGGGAA
+CACTCAGGCACGCGGTCTGCGCACCTATGGCTGCATTCAGGATGCGGACGCACAGCGCGAAGGCATTAACGCCTCTGCCC
+GTTACCCGAAAAACTGGGTGACCACCGGCGATCCGGCGCGTGAGTTCACCATGATTCAGTCAGCACCGCTGATGCTGCTG
+GCTGACCCTGATGAGTTCGTGTCCGTACAACTGGCGTAATCATGGCCCTTCGGGGCCATTGTTTCTCTGTGGAGGAGTCC
+ATGACGAAAGATGAACTGATTGCCCGTCTCCGCTCGCTGGGTGAACAACTGAACCGTGATGTCAGCCTGACGGGGACGAA
+AGAAGAACTGGCGCTCCGTGTGGCAGAGCTGAAAGAGGAGCTTGATGACACGGATGAAACTGCCGGTCAGGACACCCCTC
+TCAGCCGGGAAAATGTGCTGACCGGACATGAAAATGAGGTGGGATCAGCGCAGCCGGATACCGTGATTCTGGATACGTCT
+GAACTGGTCACGGTCGTGGCACTGGTGAAGCTGCATACTGATGCACTTCACGCCACGCGGGATGAACCTGTGGCATTTGT
+GCTGCCGGGAACGGCGTTTCGTGTCTCTGCCGGTGTGGCAGCCGAAATGACAGAGCGCGGCCTGGCCAGAATGCAATAAC
+GGGAGGCGCTGTGGCTGATTTCGATAACCTGTTCGATGCTGCCATTGCCCGCGCCGATGAAACGATACGCGGGTACATGG
+GAACGTCAGCCACCATTACATCCGGTGAGCAGTCAGGTGCGGTGATACGTGGTGTTTTTGATGACCCTGAAAATATCAGC
+TATGCCGGACAGGGCGTGCGCGTTGAAGGCTCCAGCCCGTCCCTGTTTGTCCGGACTGATGAGGTGCGGCAGCTGCGGCG
+TGGAGACACGCTGACCATCGGTGAGGAAAATTTCTGGGTAGATCGGGTTTCGCCGGATGATGGCGGAAGTTGTCATCTCT
+GGCTTGGACGGGGCGTACCGCCTGCCGTTAACCGTCGCCGCTGAAAGGGGGATGTATGGCCATAAAAGGTCTTGAGCAGG
+CCGTTGAAAACCTCAGCCGTATCAGCAAAACGGCGGTGCCTGGTGCCGCCGCAATGGCCATTAACCGCGTTGCTTCATCC
+GCGATATCGCAGTCGGCGTCACAGGTTGCCCGTGAGACAAAGGTACGCCGGAAACTGGTAAAGGAAAGGGCCAGGCTGAA
+AAGGGCCACGGTCAAAAATCCGCAGGCCAGAATCAAAGTTAACCGGGGGGATTTGCCCGTAATCAAGCTGGGTAATGCGC
+GGGTTGTCCTTTCGCGCCGCAGGCGTCGTAAAAAGGGGCAGCGTTCATCCCTGAAAGGTGGCGGCAGCGTGCTTGTGGTG
+GGTAACCGTCGTATTCCCGGCGCGTTTATTCAGCAACTGAAAAATGGCCGGTGGCATGTCATGCAGCGTGTGGCTGGGAA
+AAACCGTTACCCCATTGATGTGGTGAAAATCCCGATGGCGGTGCCGCTGACCACGGCGTTTAAACAAAATATTGAGCGGA
+TACGGCGTGAACGTCTTCCGAAAGAGCTGGGCTATGCGCTGCAGCATCAACTGAGGATGGTAATAAAGCGATGAAACATA
+CTGAACTCCGTGCAGCCGTACTGGATGCACTGGAGAAGCATGACACCGGGGCGACGTTTTTTGATGGTCGCCCCGCTGTT
+TTTGATGAGGCGGATTTTCCGGCAGTTGCCGTTTATCTCACCGGCGCTGAATACACGGGCGAAGAGCTGGACAGCGATAC
+CTGGCAGGCGGAGCTGCATATCGAAGTTTTCCTGCCTGCTCAGGTGCCGGATTCAGAGCTGGATGCGTGGATGGAGTCCC
+GGATTTATCCGGTGATGAGCGATATCCCGGCACTGTCAGATTTGATCACCAGTATGGTGGCCAGCGGCTATGACTACCGG
+CGCGACGATGATGCGGGCTTGTGGAGTTCAGCCGATCTGACTTATGTCATTACCTATGAAATGTGAGGACGCTATGCCTG
+TACCAAATCCTACAATGCCGGTGAAAGGTGCCGGGACCACCCTGTGGGTTTATAAGGGGAGCGGTGACCCTTACGCGAAT
+CCGCTTTCAGACGTTGACTGGTCGCGTCTGGCAAAAGTTAAAGACCTGACGCCCGGCGAACTGACCGCTGAGTCCTATGA
+CGACAGCTATCTCGATGATGAAGATGCAGACTGGACTGCGACCGGGCAGGGGCAGAAATCTGCCGGAGATACCAGCTTCA
+CGCTGGCGTGGATGCCCGGAGAGCAGGGGCAGCAGGCGCTGCTGGCGTGGTTTAATGAAGGCGATACCCGTGCCTATAAA
+ATCCGCTTCCCGAACGGCACGGTCGATGTGTTCCGTGGCTGGGTCAGCAGTATCGGTAAGGCGGTGACGGCGAAGGAAGT
+GATCACCCGCACGGTGAAAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGTAACAGCGGCAACCG
+GCATGACCGTGACGCCTGCCAGCACCTCGGTGGTGAAAGGGCAGAGCACCACGCTGACCGTGGCCTTCCAGCCGGAGGGC
+GTAACCGACAAGAGCTTTCGTGCGGTGTCTGCGGATAAAACAAAAGCCACCGTGTCGGTCAGTGGTATGACCATCACCGT
+GAACGGCGTTGCTGCAGGCAAGGTCAACATTCCGGTTGTATCCGGTAATGGTGAGTTTGCTGCGGTTGCAGAAATTACCG
+TCACCGCCAGTTAATCCGGAGAGTCAGCGATGTTCCTGAAAACCGAATCATTTGAACATAACGGTGTGACCGTCACGCTT
+TCTGAACTGTCAGCCCTGCAGCGCATTGAGCATCTCGCCCTGATGAAACGGCAGGCAGAACAGGCGGAGTCAGACAGCAA
+CCGGAAGTTTACTGTGGAAGACGCCATCAGAACCGGCGCGTTTCTGGTGGCGATGTCCCTGTGGCATAACCATCCGCAGA
+AGACGCAGATGCCGTCCATGAATGAAGCCGTTAAACAGATTGAGCAGGAAGTGCTTACCACCTGGCCCACGGAGGCAATT
+TCTCATGCTGAAAACGTGGTGTACCGGCTGTCTGGTATGTATGAGTTTGTGGTGAATAATGCCCCTGAACAGACAGAGGA
+CGCCGGGCCCGCAGAGCCTGTTTCTGCGGGAAAGTGTTCGACGGTGAGCTGAGTTTTGCCCTGAAACTGGCGCGTGAGAT
+GGGGCGACCCGACTGGCGTGCCATGCTTGCCGGGATGTCATCCACGGAGTATGCCGACTGGCACCGCTTTTACAGTACCC
+ATTATTTTCATGATGTTCTGCTGGATATGCACTTTTCCGGGCTGACGTACACCGTGCTCAGCCTGTTTTTCAGCGATCCG
+GATATGCATCCGCTGGATTTCAGTCTGCTGAACCGGCGCGAGGCTGACGAAGAGCCTGAAGATGATGTGCTGATGCAGAA
+AGCGGCAGGGCTTGCCGGAGGTGTCCGCTTTGGCCCGGACGGGAATGAAGTTATCCCCGCTTCCCCGGATGTGGCGGACA
+TGACGGAGGATGACGTAATGCTGATGACAGTATCAGAAGGGATCGCAGGAGGAGTCCGGTATGGCTGAACCGGTAGGCGA
+TCTGGTCGTTGATTTGAGTCTGGATGCGGCCAGATTTGACGAGCAGATGGCCAGAGTCAGGCGTCATTTTTCTGGTACGG
+AAAGTGATGCGAAAAAAACAGCGGCAGTCGTTGAACAGTCGCTGAGCCGACAGGCGCTGGCTGCACAGAAAGCGGGGATT
+TCCGTCGGGCAGTATAAAGCCGCCATGCGTATGCTGCCTGCACAGTTCACCGACGTGGCCACGCAGCTTGCAGGCGGGCA
+AAGTCCGTGGCTGATCCTGCTGCAACAGGGGGGGCAGGTGAAGGACTCCTTCGGCGGGATGATCCCCATGTTCAGGGGGC
+TTGCCGGTGCGATCACCCTGCCGATGGTGGGGGCCACCTCGCTGGCGGTGGCGACCGGTGCGCTGGCGTATGCCTGGTAT
+CAGGGCAACTCAACCCTGTCCGATTTCAACAAAACGCTGGTCCTTTCCGGCAATCAGGCGGGACTGACGGCAGATCGTAT
+GCTGGTCCTGTCCAGAGCCGGGCAGGCGGCAGGGCTGACGTTTAACCAGACCAGCGAGTCACTCAGCGCACTGGTTAAGG
+CGGGGGTAAGCGGTGAGGCTCAGATTGCGTCCATCAGCCAGAGTGTGGCGCGTTTCTCCTCTGCATCCGGCGTGGAGGTG
+GACAAGGTCGCTGAAGCCTTCGGGAAGCTGACCACAGACCCGACGTCGGGGCTGACGGCGATGGCTCGCCAGTTCCATAA
+CGTGTCGGCGGAGCAGATTGCGTATGTTGCTCAGTTGCAGCGTTCCGGCGATGAAGCCGGGGCATTGCAGGCGGCGAACG
+AGGCCGCAACGAAAGGGTTTGATGACCAGACCCGCCGCCTGAAAGAGAACATGGGCACGCTGGAGACCTGGGCAGACAGG
+ACTGCGCGGGCATTCAAATCCATGTGGGATGCGGTGCTGGATATTGGTCGTCCTGATACCGCGCAGGAGATGCTGATTAA
+GGCAGAGGCTGCGTATAAGAAAGCAGACGACATCTGGAATCTGCGCAAGGATGATTATTTTGTTAACGATGAAGCGCGGG
+CGCGTTACTGGGATGATCGTGAAAAGGCCCGTCTTGCGCTTGAAGCCGCCCGAAAGAAGGCTGAGCAGCAGACTCAACAG
+GACAAAAATGCGCAGCAGCAGAGCGATACCGAAGCGTCACGGCTGAAATATACCGAAGAGGCGCAGAAGGCTTACGAACG
+GCTGCAGACGCCGCTGGAGAAATATACCGCCCGTCAGGAAGAACTGAACAAGGCACTGAAAGACGGGAAAATCCTGCAGG
+CGGATTACAACACGCTGATGGCGGCGGCGAAAAAGGATTATGAAGCGACGCTGAAAAAGCCGAAACAGTCCAGCGTGAAG
+GTGTCTGCGGGCGATCGTCAGGAAGACAGTGCTCATGCTGCCCTGCTGACGCTTCAGGCAGAACTCCGGACGCTGGAGAA
+GCATGCCGGAGCAAATGAGAAAATCAGCCAGCAGCGCCGGGATTTGTGGAAGGCGGAGAGTCAGTTCGCGGTACTGGAGG
+AGGCGGCGCAACGTCGCCAGCTGTCTGCACAGGAGAAATCCCTGCTGGCGCATAAAGATGAGACGCTGGAGTACAAACGC
+CAGCTGGCTGCACTTGGCGACAAGGTTACGTATCAGGAGCGCCTGAACGCGCTGGCGCAGCAGGCGGATAAATTCGCACA
+GCAGCAACGGGCAAAACGGGCCGCCATTGATGCGAAAAGCCGGGGGCTGACTGACCGGCAGGCAGAACGGGAAGCCACGG
+AACAGCGCCTGAAGGAACAGTATGGCGATAATCCGCTGGCGCTGAATAACGTCATGTCAGAGCAGAAAAAGACCTGGGCG
+GCTGAAGACCAGCTTCGCGGGAACTGGATGGCAGGCCTGAAGTCCGGCTGGAGTGAGTGGGAAGAGAGCGCCACGGACAG
+TATGTCGCAGGTAAAAAGTGCAGCCACGCAGACCTTTGATGGTATTGCACAGAATATGGCGGCGATGCTGACCGGCAGTG
+AGCAGAACTGGCGCAGCTTCACCCGTTCCGTGCTGTCCATGATGACAGAAATTCTGCTTAAGCAGGCAATGGTGGGGATT
+GTCGGGAGTATCGGCAGCGCCATTGGCGGGGCTGTTGGTGGCGGCGCATCCGCGTCAGGCGGTACAGCCATTCAGGCCGC
+TGCGGCGAAATTCCATTTTGCAACCGGAGGATTTACGGGAACCGGCGGCAAATATGAGCCAGCGGGGATTGTTCACCGTG
+GTGAGTTTGTCTTCACGAAGGAGGCAACCAGCCGGATTGGCGTGGGGAATCTTTACCGGCTGATGCGCGGCTATGCCACC
+GGCGGTTATGTCGGTACACCGGGCAGCATGGCAGACAGCCGGTCGCAGGCGTCCGGGACGTTTGAGCAGAATAACCATGT
+GGTGATTAACAACGACGGCACGAACGGGCAGATAGGTCCGGCTGCTCTGAAGGCGGTGTATGACATGGCCCGCAAGGGTG
+CCCGTGATGAAATTCAGACACAGATGCGTGATGGTGGCCTGTTCTCCGGAGGTGGACGATGAAGACCTTCCGCTGGAAAG
+TGAAACCCGGTATGGATGTGGCTTCGGTCCCTTCTGTAAGAAAGGTGCGCTTTGGTGATGGCTATTCTCAGCGAGCGCCT
+GCCGGGCTGAATGCCAACCTGAAAACGTACAGCGTGACGCTTTCTGTCCCCCGTGAGGAGGCCACGGTACTGGAGTCGTT
+TCTGGAAGAGCACGGGGGCTGGAAATCCTTTCTGTGGACGCCGCCTTATGAGTGGCGGCAGATAAAGGTGACCTGCGCAA
+AATGGTCGTCGCGGGTCAGTATGCTGCGTGTTGAGTTCAGCGCAGAGTTTGAACAGGTGGTGAACTGATGCAGGATATCC
+GGCAGGAAACACTGAATGAATGCACCCGTGCGGAGCAGTCGGCCAGCGTGGTGCTCTGGGAAATCGACCTGACAGAGGTC
+GGTGGAGAACGTTATTTTTTCTGTAATGAGCAGAACGAAAAAGGTGAGCCGGTCACCTGGCAGGGGCGACAGTATCAGCC
+GTATCCCATTCAGGGGAGCGGTTTTGAACTGAATGGCAAAGGCACCAGTACGCGCCCCACGCTGACGGTTTCTAACCTGT
+ACGGTATGGTCACCGGGATGGCGGAAGATATGCAGAGTCTGGTCGGCGGAACGGTGGTCCGGCGTAAGGTTTACGCCCGT
+TTTCTGGATGCGGTGAACTTCGTCAACGGAAACAGTTACGCCGATCCGGAGCAGGAGGTGATCAGCCGCTGGCGCATTGA
+GCAGTGCAGCGAACTGAGCGCGGTGAGTGCCTCCTTTGTACTGTCCACGCCGACGGAAACGGATGGCGCTGTTTTTCCGG
+GACGTATCATGCTGGCCAACACCTGCACCTGGACCTATCGCGGTGACGAGTGCGGTTATAGCGGTCCGGCTGTCGCGGAT
+GAATATGACCAGCCAACGTCCGATATCACGAAGGATAAATGCAGCAAATGCCTGAGCGGTTGTAAGTTCCGCAATAACGT
+CGGCAACTTTGGCGGCTTCCTTTCCATTAACAAACTTTCGCAGTAAATCCCATGACACAGACAGAATCAGCGATTCTGGC
+GCACGCCCGGCGATGTGCGCCAGCGGAGTCGTGCGGCTTCGTGGTAAGCACGCCGGAGGGGGAAAGATATTTCCCCTGCG
+TGAATATCTCCGGTGAGCCGGAGGCGTATTTCCGTATGTCGCCGGAAGACTGGCTGCAGGCAGAAATGCAGGGTGAGATT
+GTGGCGCTGGTCCACAGCCACCCCGGTGGTCTGCCCTGGCTGAGTGAGGCCGACCGGCGGCTGCAGGTGCAGAGTGATTT
+GCCGTGGTGGCTGGTCTGCCGGGGGACGATTCATAAGTTCCGCTGTGTGCCGCATCTCACCGGGCGGCGCTTTGAGCACG
+GTGTGACGGACTGTTACACACTGTTCCGGGATGCTTATCATCTGGCGGGGATTGAGATGCCGGACTTTCATCGTGAGGAT
+GACTGGTGGCGTAACGGCCAGAATCTCTATCTGGATAATCTGGAGGCGACGGGGCTGTATCAGGTGCCGTTGTCAGCGGC
+ACAGCCGGGCGATGTGCTGCTGTGCTGTTTTGGTTCATCAGTGCCGAATCACGCCGCAATTTACTGCGGCGACGGCGAGC
+TGCTGCACCATATTCCTGAACAACTGAGCAAACGAGAGAGGTACACCGACAAATGGCAGCGACGCACACACTCCCTCTGG
+CGTCACCGGGCATGGCGCGCATCTGCCTTTACGGGGATTTACAACGATTTGGTCGCCGCATCGACCTTCGTGTGAAAACG
+GGGGCTGAAGCCATCCGGGCACTGGCCACACAGCTCCCGGCGTTTCGTCAGAAACTGAGCGACGGCTGGTATCAGGTACG
+GATTGCCGGGCGGGACGTCAGCACGTCCGGGTTAACGGCGCAGTTACATGAGACTCTGCCTGATGGCGCTGTAATTCATA
+TTGTTCCCAGAGTCGCCGGGGCCAAGTCAGGTGGCGTATTCCAGATTGTCCTGGGGGCTGCCGCCATTGCCGGATCATTC
+TTTACCGCCGGAGCCACCCTTGCAGCATGGGGGGCAGCCATTGGGGCCGGTGGTATGACCGGCATCCTGTTTTCTCTCGG
+TGCCAGTATGGTGCTCGGTGGTGTGGCGCAGATGCTGGCACCGAAAGCCAGAACTCCCCGTATACAGACAACGGATAACG
+GTAAGCAGAACACCTATTTCTCCTCACTGGATAACATGGTTGCCCAGGGCAATGTTCTGCCTGTTCTGTACGGGGAAATG
+CGCGTGGGGTCACGCGTGGTTTCTCAGGAGATCAGCACGGCAGACGAAGGGGACGGTGGTCAGGTTGTGGTGATTGGTCG
+CTGATGCAAAATGTTTTATGTGAAACCGCCTGCGGGCGGTTTTGTCATTTATGGAGCGTGAGGAATGGGTAAAGGAAGCA
+GTAAGGGGCATACCCCGCGCGAAGCGAAGGACAACCTGAAGTCCACGCAGTTGCTGAGTGTGATCGATGCCATCAGCGAA
+GGGCCGATTGAAGGTCCGGTGGATGGCTTAAAAAGCGTGCTGCTGAACAGTACGCCGGTGCTGGACACTGAGGGGAATAC
+CAACATATCCGGTGTCACGGTGGTGTTCCGGGCTGGTGAGCAGGAGCAGACTCCGCCGGAGGGATTTGAATCCTCCGGCT
+CCGAGACGGTGCTGGGTACGGAAGTGAAATATGACACGCCGATCACCCGCACCATTACGTCTGCAAACATCGACCGTCTG
+CGCTTTACCTTCGGTGTACAGGCACTGGTGGAAACCACCTCAAAGGGTGACAGGAATCCGTCGGAAGTCCGCCTGCTGGT
+TCAGATACAACGTAACGGTGGCTGGGTGACGGAAAAAGACATCACCATTAAGGGCAAAACCACCTCGCAGTATCTGGCCT
+CGGTGGTGATGGGTAACCTGCCGCCGCGCCCGTTTAATATCCGGATGCGCAGGATGACGCCGGACAGCACCACAGACCAG
+CTGCAGAACAAAACGCTCTGGTCGTCATACACTGAAATCATCGATGTGAAACAGTGCTACCCGAACACGGCACTGGTCGG
+CGTGCAGGTGGACTCGGAGCAGTTCGGCAGCCAGCAGGTGAGCCGTAATTATCATCTGCGCGGGCGTATTCTGCAGGTGC
+CGTCGAACTATAACCCGCAGACGCGGCAATACAGCGGTATCTGGGACGGAACGTTTAAACCGGCATACAGCAACAACATG
+GCCTGGTGTCTGTGGGATATGCTGACCCATCCGCGCTACGGCATGGGGAAACGTCTTGGTGCGGCGGATGTGGATAAATG
+GGCGCTGTATGTCATCGGCCAGTACTGCGACCAGTCAGTGCCGGACGGCTTTGGCGGCACGGAGCCGCGCATCACCTGTA
+ATGCGTACCTGACCACACAGCGTAAGGCGTGGGATGTGCTCAGCGATTTCTGCTCGGCGATGCGCTGTATGCCGGTATGG
+AACGGGCAGACGCTGACGTTCGTGCAGGACCGACCGTCGGATAAGACGTGGACCTATAACCGCAGTAATGTGGTGATGCC
+GGATGATGGCGCGCCGTTCCGCTACAGCTTCAGCGCCCTGAAGGACCGCCATAATGCCGTTGAGGTGAACTGGATTGACC
+CGAACAACGGCTGGGAGACGGCGACAGAGCTTGTTGAAGATACGCAGGCCATTGCCCGTTACGGTCGTAATGTTACGAAG
+ATGGATGCCTTTGGCTGTACCAGCCGGGGGCAGGCACACCGCGCCGGGCTGTGGCTGATTAAAACAGAACTGCTGGAAAC
+GCAGACCGTGGATTTCAGCGTCGGCGCAGAAGGGCTTCGCCATGTACCGGGCGATGTTATTGAAATCTGCGATGATGACT
+ATGCCGGTATCAGCACCGGTGGTCGTGTGCTGGCGGTGAACAGCCAGACCCGGACGCTGACGCTCGACCGTGAAATCACG
+CTGCCATCCTCCGGTACCGCGCTGATAAGCCTGGTTGACGGAAGTGGCAATCCGGTCAGCGTGGAGGTTCAGTCCGTCAC
+CGACGGCGTGAAGGTAAAAGTGAGCCGTGTTCCTGACGGTGTTGCTGAATACAGCGTATGGGAGCTGAAGCTGCCGACGC
+TGCGCCAGCGACTGTTCCGCTGCGTGAGTATCCGTGAGAACGACGACGGCACGTATGCCATCACCGCCGTGCAGCATGTG
+CCGGAAAAAGAGGCCATCGTGGATAACGGGGCGCACTTTGACGGCGAACAGAGTGGCACGGTGAATGGTGTCACGCCGCC
+AGCGGTGCAGCACCTGACCGCAGAAGTCACTGCAGACAGCGGGGAATATCAGGTGCTGGCGCGATGGGACACACCGAAGG
+TGGTGAAGGGCGTGAGTTTCCTGCTCCGTCTGACCGTAACAGCGGACGACGGCAGTGAGCGGCTGGTCAGCACGGCCCGG
+ACGACGGAAACCACATACCGCTTCACGCAACTGGCGCTGGGGAACTACAGGCTGACAGTCCGGGCGGTAAATGCGTGGGG
+GCAGCAGGGCGATCCGGCGTCGGTATCGTTCCGGATTGCCGCACCGGCAGCACCGTCGAGGATTGAGCTGACGCCGGGCT
+ATTTTCAGATAACCGCCACGCCGCATCTTGCCGTTTATGACCCGACGGTACAGTTTGAGTTCTGGTTCTCGGAAAAGCAG
+ATTGCGGATATCAGACAGGTTGAAACCAGCACGCGTTATCTTGGTACGGCGCTGTACTGGATAGCCGCCAGTATCAATAT
+CAAACCGGGCCATGATTATTACTTTTATATCCGCAGTGTGAACACCGTTGGCAAATCGGCATTCGTGGAGGCCGTCGGTC
+GGGCGAGCGATGATGCGGAAGGTTACCTGGATTTTTTCAAAGGCAAGATAACCGAATCCCATCTCGGCAAGGAGCTGCTG
+GAAAAAGTCGAGCTGACGGAGGATAACGCCAGCAGACTGGAGGAGTTTTCGAAAGAGTGGAAGGATGCCAGTGATAAGTG
+GAATGCCATGTGGGCTGTCAAAATTGAGCAGACCAAAGACGGCAAACATTATGTCGCGGGTATTGGCCTCAGCATGGAGG
+ACACGGAGGAAGGCAAACTGAGCCAGTTTCTGGTTGCCGCCAATCGTATCGCATTTATTGACCCGGCAAACGGGAATGAA
+ACGCCGATGTTTGTGGCGCAGGGCAACCAGATATTCATGAACGACGTGTTCCTGAAGCGCCTGACGGCCCCCACCATTAC
+CAGCGGCGGCAATCCTCCGGCCTTTTCCCTGACACCGGACGGAAAGCTGACCGCTAAAAATGCGGATATCAGTGGCAGTG
+TGAATGCGAACTCCGGGACGCTCAGTAATGTGACGATAGCTGAAAACTGTACGATAAACGGTACGCTGAGGGCGGAAAAA
+ATCGTCGGGGACATTGTAAAGGCGGCGAGCGCGGCTTTTCCGCGCCAGCGTGAAAGCAGTGTGGACTGGCCGTCAGGTAC
+CCGTACTGTCACCGTGACCGATGACCATCCTTTTGATCGCCAGATAGTGGTGCTTCCGCTGACGTTTCGCGGAAGTAAGC
+GTACTGTCAGCGGCAGGACAACGTATTCGATGTGTTATCTGAAAGTACTGATGAACGGTGCGGTGATTTATGATGGCGCG
+GCGAACGAGGCGGTACAGGTGTTCTCCCGTATTGTTGACATGCCAGCGGGTCGGGGAAACGTGATCCTGACGTTCACGCT
+TACGTCCACACGGCATTCGGCAGATATTCCGCCGTATACGTTTGCCAGCGATGTGCAGGTTATGGTGATTAAGAAACAGG
+CGCTGGGCATCAGCGTGGTCTGAGTGTGTTACAGAGGTTCGTCCGGGAACGGGCGTTTTATTATAAAACAGTGAGAGGTG
+AACGATGCGTAATGTGTGTATTGCCGTTGCTGTCTTTGCCGCACTTGCGGTGACAGTCACTCCGGCCCGTGCGGAAGGTG
+GACATGGTACGTTTACGGTGGGCTATTTTCAAGTGAAACCGGGTACATTGCCGTCGTTGTCGGGCGGGGATACCGGTGTG
+AGTCATCTGAAAGGGATTAACGTGAAGTACCGTTATGAGCTGACGGACAGTGTGGGGGTGATGGCTTCCCTGGGGTTCGC
+CGCGTCGAAAAAGAGCAGCACAGTGATGACCGGGGAGGATACGTTTCACTATGAGAGCCTGCGTGGACGTTATGTGAGCG
+TGATGGCCGGACCGGTTTTACAAATCAGTAAGCAGGTCAGTGCGTACGCCATGGCCGGAGTGGCTCACAGTCGGTGGTCC
+GGCAGTACAATGGATTACCGTAAGACGGAAATCACTCCCGGGTATATGAAAGAGACGACCACTGCCAGGGACGAAAGTGC
+AATGCGGCATACCTCAGTGGCGTGGAGTGCAGGTATACAGATTAATCCGGCAGCGTCCGTCGTTGTTGATATTGCTTATG
+AAGGCTCCGGCAGTGGCGACTGGCGTACTGACGGATTCATCGTTGGGGTCGGTTATAAATTCTGATTAGCCAGGTAACAC
+AGTGTTATGACAGCCCGCCGGAACCGGTGGGCTTTTTTGTGGGGTGAATATGGCAGTAAAGATTTCAGGAGTCCTGAAAG
+ACGGCACAGGAAAACCGGTACAGAACTGCACCATTCAGCTGAAAGCCAGACGTAACAGCACCACGGTGGTGGTGAACACG
+GTGGGCTCAGAGAATCCGGATGAAGCCGGGCGTTACAGCATGGATGTGGAGTACGGTCAGTACAGTGTCATCCTGCAGGT
+TGACGGTTTTCCACCATCGCACGCCGGGACCATCACCGTGTATGAAGATTCACAACCGGGGACGCTGAATGATTTTCTCT
+GTGCCATGACGGAGGATGATGCCCGGCCGGAGGTGCTGCGTCGTCTTGAACTGATGGTGGAAGAGGTGGCGCGTAACGCG
+TCCGTGGTGGCACAGAGTACGGCAGACGCGAAGAAATCAGCCGGCGATGCCAGTGCATCAGCTGCTCAGGTCGCGGCCCT
+TGTGACTGATGCAACTGACTCAGCACGCGCCGCCAGCACGTCCGCCGGACAGGCTGCATCGTCAGCTCAGGAAGCGTCCT
+CCGGCGCAGAAGCGGCATCAGCAAAGGCCACTGAAGCGGAAAAAAGTGCCGCAGCCGCAGAGTCCTCAAAAAACGCGGCG
+GCCACCAGTGCCGGTGCGGCGAAAACGTCAGAAACGAATGCTGCAGCGTCACAACAATCAGCCGCCACGTCTGCCTCCAC
+CGCGGCCACGAAAGCGTCAGAGGCCGCCACTTCAGCACGAGATGCGGTGGCCTCAAAAGAGGCAGCAAAATCATCAGAAA
+CGAACGCATCATCAAGTGCCGGTCGTGCAGCTTCCTCGGCAACGGCGGCAGAAAATTCTGCCAGGGCGGCAAAAACGTCC
+GAGACGAATGCCAGGTCATCTGAAACAGCAGCGGAACGGAGCGCCTCTGCCGCGGCAGACGCAAAAACAGCGGCGGCGGG
+GAGTGCGTCAACGGCATCCACGAAGGCGACAGAGGCTGCGGGAAGTGCGGTATCAGCATCGCAGAGCAAAAGTGCGGCAG
+AAGCGGCGGCAATACGTGCAAAAAATTCGGCAAAACGTGCAGAAGATATAGCTTCAGCTGTCGCGCTTGAGGATGCGGAC
+ACAACGAGAAAGGGGATAGTGCAGCTCAGCAGTGCAACCAACAGCACGTCTGAAACGCTTGCTGCAACGCCAAAGGCGGT
+TAAGGTGGTAATGGATGAAACGAACAGAAAAGCCCACTGGACAGTCCGGCACTGACCGGAACGCCAACAGCACCAACCGC
+GCTCAGGGGAACAAACAATACCCAGATTGCGAACACCGCTTTTGTACTGGCCGCGATTGCAGATGTTATCGACGCGTCAC
+CTGACGCACTGAATACGCTGAATGAACTGGCCGCAGCGCTCGGGAATGATCCAGATTTTGCTACCACCATGACTAACGCG
+CTTGCGGGTAAACAACCGAAGAATGCGACACTGACGGCGCTGGCAGGGCTTTCCACGGCGAAAAATAAATTACCGTATTT
+TGCGGAAAATGATGCCGCCAGCCTGACTGAACTGACTCAGGTTGGCAGGGATATTCTGGCAAAAAATTCCGTTGCAGATG
+TTCTTGAATACCTTGGGGCCGGTGAGAATTCGGCCTTTCCGGCAGGTGCGCCGATCCCGTGGCCATCAGATATCGTTCCG
+TCTGGCTACGTCCTGATGCAGGGGCAGGCGTTTGACAAATCAGCCTACCCAAAACTTGCTGTCGCGTATCCATCGGGTGT
+GCTTCCTGATATGCGAGGCTGGACAATCAAGGGGAAACCCGCCAGCGGTCGTGCTGTATTGTCTCAGGAACAGGATGGAA
+TTAAGTCGCACACCCACAGTGCCAGTGCATCCGGTACGGATTTGGGGACGAAAACCACATCGTCGTTTGATTACGGGACG
+AAAACAACAGGCAGTTTCGATTACGGCACCAAATCGACGAATAACACGGGGGCTCATGCTCACAGTCTGAGCGGTTCAAC
+AGGGGCCGCGGGTGCTCATGCCCACACAAGTGGTTTAAGGATGAACAGTTCTGGCTGGAGTCAGTATGGAACAGCAACCA
+TTACAGGAAGTTTATCCACAGTTAAAGGAACCAGCACACAGGGTATTGCTTATTTATCGAAAACGGACAGTCAGGGCAGC
+CACAGTCACTCATTGTCCGGTACAGCCGTGAGTGCCGGTGCACATGCGCATACAGTTGGTATTGGTGCGCACCAGCATCC
+GGTTGTTATCGGTGCTCATGCCCATTCTTTCAGTATTGGTTCACACGGACACACCATCACCGTTAACGCTGCGGGTAACG
+CGGAAAACACCGTCAAAAACATTGCATTTAACTATATTGTGAGGCTTGCATAATGGCATTCAGAATGAGTGAACAACCAC
+GGACCATAAAAATTTATAATCTGCTGGCCGGAACTAATGAATTTATTGGTGAAGGTGACGCATATATTCCGCCTCATACC
+GGTCTGCCTGCAAACAGTACCGATATTGCACCGCCAGATATTCCGGCTGGCTTTGTGGCTGTTTTCAACAGTGATGAGGC
+ATCGTGGCATCTCGTTGAAGACCATCGGGGTAAAACCGTCTATGACGTGGCTTCCGGCGACGCGTTATTTATTTCTGAAC
+TCGGTCCGTTACCGGAAAATTTTACCTGGTTATCGCCGGGAGGGGAATATCAGAAGTGGAACGGCACAGCCTGGGTGAAG
+GATACGGAAGCAGAAAAACTGTTCCGGATCCGGGAGGCGGAAGAAACAAAAAAAAGCCTGATGCAGGTAGCCAGTGAGCA
+TATTGCGCCGCTTCAGGATGCTGCAGATCTGGAAATTGCAACGAAGGAAGAAACCTCGTTGCTGGAAGCCTGGAAGAAGT
+ATCGGGTGTTGCTGAACCGTGTTGATACATCAACTGCACCTGATATTGAGTGGCCTGCTGTCCCTGTTATGGAGTAATCG
+TTTTGTGATATGCCGCAGAAACGTTGTATGAAATAACGTTCTGCGGTTAGTTAGTATATTGTAAAGCTGAGTATTGGTTT
+ATTTGGCGATTATTATCTTCAGGAGAATAATGGAAGTTCTATGACTCAATTGTTCATAGTGTTTACATCACCGCCAATTG
+CTTTTAAGACTGAACGCATGAAATATGGTTTTTCGTCATGTTTTGAGTCTGCTGTTGATATTTCTAAAGTCGGTTTTTTT
+TCTTCGTTTTCTCTAACTATTTTCCATGAAATACATTTTTGATTATTATTTGAATCAATTCCAATTACCTGAAGTCTTTC
+ATCTATAATTGGCATTGTATGTATTGGTTTATTGGAGTAGATGCTTGCTTTTCTGAGCCATAGCTCTGATATCCAAATGA
+AGCCATAGGCATTTGTTATTTTGGCTCTGTCAGCTGCATAACGCCAAAAAATATATTTATCTGCTTGATCTTCAAATGTT
+GTATTGATTAAATCAATTGGATGGAATTGTTTATCATAAAAAATTAATGTTTGAATGTGATAACCGTCCTTTAAAAAAGT
+CGTTTCTGCAAGCTTGGCTGTATAGTCAACTAACTCTTCTGTCGAAGTGATATTTTTAGGCTTATCTACCAGTTTTAGAC
+GCTCTTTAATATCTTCAGGAATTATTTTATTGTCATATTGTATCATGCTAAATGACAATTTGCTTATGGAGTAATCTTTT
+AATTTTAAATAAGTTATTCTCCTGGCTTCATCAAATAAAGAGTCGAATGATGTTGGCGAAATCACATCGTCACCCATTGG
+ATTGTTTATTTGTATGCCAAGAGAGTTACAGCAGTTATACATTCTGCCATAGATTATAGCTAAGGCATGTAATAATTCGT
+AATCTTTTAGCGTATTAGCGACCCATCGTCTTTCTGATTTAATAATAGATGATTCAGTTAAATATGAAGGTAATTTCTTT
+TGTGCAAGTCTGACTAACTTTTTTATACCAATGTTTAACATACTTTCATTTGTAATAAACTCAATGTCATTTTCTTCAAT
+GTAAGATGAAATAAGAGTAGCCTTTGCCTCGCTATACATTTCTAAATCGCCTTGTTTTTCTATCGTATTGCGAGAATTTT
+TAGCCCAAGCCATTAATGGATCATTTTTCCATTTTTCAATAACATTATTGTTATACCAAATGTCATATCCTATAATCTGG
+TTTTTGTTTTTTTGAATAATAAATGTTACTGTTCTTGCGGTTTGGAGGAATTGATTCAAATTCAAGCGAAATAATTCAGG
+GTCAAAATATGTATCAATGCAGCATTTGAGCAAGTGCGATAAATCTTTAAGTCTTCTTTCCCATGGTTTTTTAGTCATAA
+AACTCTCCATTTTGATAGGTTGCATGCTAGATGCTGATATATTTTAGAGGTGATAAAATTAACTGCTTAACTGTCAATGT
+AATACAAGTTGTTTGATCTTTGCAATGATTCTTATCAGAAACCATATAGTAAATTAGTTACACAGGAAATTTTTAATATT
+ATTATTATCATTCATTATGTATTAAAATTAGAGTTGTGGCTTGGCTCTGCTAACACGTTGCTCATAGGAGATATGGTAGA
+GCCGCAGACACGTCGTATGCAGGAACGTGCTGCGGCTGGCTGGTGAACTTCCGATAGTGCGGGTGTTGAATGATTTCCAG
+TTGCTACCGATTTTACATATTTTTTGCATGAGAGAATTTGTACCACCTCCCACCGACCATCTATGACTGTACGCCACTGT
+CCCTAGGACTGCTATGTGCCGGAGCGGACATTACAAACGTCCTTCTCGGTGCATGCCACTGTTGCCAATGACCTGCCTAG
+GAATTGGTTAGCAAGTTACTACCGGATTTTGTAAAAACAGCCCTCCTCATATAAAAAGTATTCGTTCACTTCCGATAAGC
+GTCGTAATTTTCTATCTTTCATCATATTCTAGATCCCTCTGAAAAAATCTTCCGAGTTTGCTAGGCACTGATACATAACT
+CTTTTCCAATAATTGGGGAAGTCATTCAAATCTATAATAGGTTTCAGATTTGCTTCAATAAATTCTGACTGTAGCTGCTG
+AAACGTTGCGGTTGAACTATATTTCCTTATAACTTTTACGAAAGAGTTTCTTTGAGTAATCACTTCACTCAAGTGCTTCC
+CTGCCTCCAAACGATACCTGTTAGCAATATTTAATAGCTTGAAATGATGAAGAGCTCTGTGTTTGTCTTCCTGCCTCCAG
+TTCGCCGGGCATTCAACATAAAAACTGATAGCACCCGGAGTTCCGGAAACGAAATTTGCATATACCCATTGCTCACGAAA
+AAAAATGTCCTTGTCGATATAGGGATGAATCGCTTGGTGTACCTCATCTACTGCGAAAACTTGACCTTTCTCTCCCATAT
+TGCAGTCGCGGCACGATGGAACTAAATTAATAGGCATCACCGAAAATTCAGGATAATGTGCAATAGGAAGAAAATGATCT
+ATATTTTTTGTCTGTCCTATATCACCACAAAATGGACATTTTTCACCTGATGAAACAAGCATGTCATCGTAATATGTTCT
+AGCGGGTTTGTTTTTATCTCGGAGATTATTTTCATAAAGCTTTTCTAATTTAACCTTTGTCAGGTTACCAACTACTAAGG
+TTGTAGGCTCAAGAGGGTGTGTCCTGTCGTAGGTAAATAACTGACCTGTCGAGCTTAATATTCTATATTGTTGTTCTTTC
+TGCAAAAAAGTGGGGAAGTGAGTAATGAAATTATTTCTAACATTTATCTGCATCATACCTTCCGAGCATTTATTAAGCAT
+TTCGCTATAAGTTCTCGCTGGAAGAGGTAGTTTTTTCATTGTACTTTACCTTCATCTCTGTTCATTATCATCGCTTTTAA
+AACGGTTCGACCTTCTAATCCTATCTGACCATTATAATTTTTTAGAATGGTTTCATAAGAAAGCTCTGAATCAACGGACT
+GCGATAATAAGTGGTGGTATCCAGAATTTGTCACTTCAAGTAAAAACACCTCACGAGTTAAAACACCTAAGTTCTCACCG
+AATGTCTCAATATCCGGACGGATAATATTTATTGCTTCTCTTGACCGTAGGACTTTCCACATGCAGGATTTTGGAACCTC
+TTGCAGTACTACTGGGGAATGAGTTGCAATTATTGCTACACCATTGCGTGCATCGAGTAAGTCGCTTAATGTTCGTAAAA
+AAGCAGAGAGCAAAGGTGGATGCAGATGAACCTCTGGTTCATCGAATAAAACTAATGACTTTTCGCCAACGACATCTACT
+AATCTTGTGATAGTAAATAAAACAATTGCATGTCCAGAGCTCATTCGAAGCAGATATTTCTGGATATTGTCATAAAACAA
+TTTAGTGAATTTATCATCGTCCACTTGAATCTGTGGTTCATTACGTCTTAACTCTTCATATTTAGAAATGAGGCTGATGA
+GTTCCATATTTGAAAAGTTTTCATCACTACTTAGTTTTTTGATAGCTTCAAGCCAGAGTTGTCTTTTTCTATCTACTCTC
+ATACAACCAATAAATGCTGAAATGAATTCTAAGCGGAGATCGCCTAGTGATTTTAAACTATTGCTGGCAGCATTCTTGAG
+TCCAATATAAAAGTATTGTGTACCTTTTGCTGGGTCAGGTTGTTCTTTAGGAGGAGTAAAAGGATCAAATGCACTAAACG
+AAACTGAAACAAGCGATCGAAAATATCCCTTTGGGATTCTTGACTCGATAAGTCTATTATTTTCAGAGAAAAAATATTCA
+TTGTTTTCTGGGTTGGTGATTGCACCAATCATTCCATTCAAAATTGTTGTTTTACCACACCCATTCCGCCCGATAAAAGC
+ATGAATGTTCGTGCTGGGCATAGAATTAACCGTCACCTCAAAAGGTATAGTTAAATCACTGAATCCGGGAGCACTTTTTC
+TATTAAATGAAAAGTGGAAATCTGACAATTCTGGCAAACCATTTAACACACGTGCGAACTGTCCATGAATTTCTGAAAGA
+GTTACCCCTCTAAGTAATGAGGTGTTAAGGACGCTTTCATTTTCAATGTCGGCTAATCGATTTGGCCATACTACTAAATC
+CTGAATAGCTTTAAGAAGGTTATGTTTAAAACCATCGCTTAATTTGCTGAGATTAACATAGTAGTCAATGCTTTCACCTA
+AGGAAAAAAACATTTCAGGGAGTTGACTGAATTTTTTATCTATTAATGAATAAGTGCTTACTTCTTCTTTTTGACCTACA
+AAACCAATTTTAACATTTCCGATATCGCATTTTTCACCATGCTCATCAAAGACAGTAAGATAAAACATTGTAACAAAGGA
+ATAGTCATTCCAACCATCTGCTCGTAGGAATGCCTTATTTTTTTCTACTGCAGGAATATACCCGCCTCTTTCAATAACAC
+TAAACTCCAACATATAGTAACCCTTAATTTTATTAAAATAACCGCAATTTATTTGGCGGCAACACAGGATCTCTCTTTTA
+AGTTACTCTCTATTACATACGTTTTCCATCTAAAAATTAGTAGTATTGAACTTAACGGGGCATCGTATTGTAGTTTTCCA
+TATTTAGCTTTCTGCTTCCTTTTGGATAACCCACTGTTATTCATGTTGCATGGTGCACTGTTTATACCAACGATATAGTC
+TATTAATGCATATATAGTATCGCCGAACGATTAGCTCTTCAGGCTTCTGAAGAAGCGTTTCAAGTACTAATAAGCCGATA
+GATAGCCACGGACTTCGTAGCCATTTTTCATAAGTGTTAACTTCCGCTCCTCGCTCATAACAGACATTCACTACAGTTAT
+GGCGGAAAGGTATGCATGCTGGGTGTGGGGAAGTCGTGAAAGAAAAGAAGTCAGCTGCGTCGTTTGACATCACTGCTATC
+TTCTTACTGGTTATGCAGGTCGTAGTGGGTGGCACACAAAGCTTTGCACTGGATTGCGAGGCTTTGTGCTTCTCTGGAGT
+GCGACAGGTTTGATGACAAAAAATTAGCGCAAGAAGACAAAAATCACCTTGCGCTAATGCTCTGTTACAGGTCACTAATA
+CCATCTAAGTAGTTGATTCATAGTGACTGCATATGTTGTGTTTTACAGTATTATGTAGTCTGTTTTTTATGCAAAATCTA
+ATTTAATATATTGATATTTATATCATTTTACGTTTCTCGTTCAGCTTTTTTATACTAAGTTGGCATTATAAAAAAGCATT
+GCTTATCAATTTGTTGCAACGAACAGGTCACTATCAGTCAAAATAAAATCATTATTTGATTTCAATTTTGTCCCACTCCC
+TGCCTCTGTCATCACGATACTGTGATGCCATGGTGTCCGACTTATGCCCGAGAAGATGTTGAGCAAACTTATCGCTTATC
+TGCTTCTCATAGAGTCTTGCAGACAAACTGCGCAACTCGTGAAAGGTAGGCGGATCCCCTTCGAAGGAAAGACCTGATGC
+TTTTCGTGCGCGCATAAAATACCTTGATACTGTGCCGGATGAAAGCGGTTCGCGACGAGTAGATGCAATTATGGTTTCTC
+CGCCAAGAATCTCTTTGCATTTATCAAGTGTTTCCTTCATTGATATTCCGAGAGCATCAATATGCAATGCTGTTGGGATG
+GCAATTTTTACGCCTGTTTTGCTTTGCTCGACATAAAGATATCCATCTACGATATCAGACCACTTCATTTCGCATAAATC
+ACCAACTCGTTGCCCGGTAACAACAGCCAGTTCCATTGCAAGTCTGAGCCAACATGGTGATGATTCTGCTGCTTGATAAA
+TTTTCAGGTATTCGTCAGCCGTAAGTCTTGATCTCCTTACCTCTGATTTTGCTGCGCGAGTGGCAGCGACATGGTTTGTT
+GTTATATGGCCTTCAGCTATTGCCTCTCGGAATGCATCGCTCAGTGTTGATCTGATTAACTTGGCTGACGCCGCCTTGCC
+CTCGTCTATGTATCCATTGAGCATTGCCGCAATTTCTTTTGTGGTGATGTCTTCAAGTGGAGCATCAGGCAGACCCCTCC
+TTATTGCTTTAATTTTGCTCATGTAATTTATGAGTGTCTTCTGCTTGATTCCTCTGCTGGCCAGGATTTTTTCGTAGCGA
+TCAAGCCATGAATGTAACGTAACGGAATTATCACTGTTGATTCTCGCTGTCAGAGGCTTGTGTTTGTGTCCTGAAAATAA
+CTCAATGTTGGCCTGTATAGCTTCAGTGATTGCGATTCGCCTGTCTCTGCCTAATCCAAACTCTTTACCCGTCCTTGGGT
+CCCTGTAGCAGTAATATCCATTGTTTCTTATATAAAGGTTAGGGGGTAAATCCCGGCGCTCATGACTTCGCCTTCTTCCC
+ATTTCTGATCCTCTTCAAAAGGCCACCTGTTACTGGTCGATTTAAGTCAACCTTTACCGCTGATTCGTGGAACAGATACT
+CTCTTCCATCCTTAACCGGAGGTGGGAATATCCTGCATTCCCGAACCCATCGACGAACTGTTTCAAGGCTTCTTGGACGT
+CGCTGGCGTGCGTTCCACTCCTGAAGTGTCAAGTACATCGCAAAGTCTCCGCAATTACACGCAAGAAAAAACCGCCATCA
+GGCGGCTTGGTGTTCTTTCAGTTCTTCAATTCGAATATTGGTTACGTCTGCATGTGCTATCTGCGCCCATATCATCCAGT
+GGTCGTAGCAGTCGTTGATGTTCTCCGCTTCGATAACTCTGTTGAATGGCTCTCCATTCCATTCTCCTGTGACTCGGAAG
+TGCATTTATCATCTCCATAAAACAAAACCCGCCGTAGCGAGTTCAGATAAAATAAATCCCCGCGAGTGCGAGGATTGTTA
+TGTAATATTGGGTTTAATCATCTATATGTTTTGTACAGAGAGGGCAAGTATCGTTTCCACCGTACTCGTGATAATAATTT
+TGCACGGTATCAGTCATTTCTCGCACATTGCAGAATGGGGATTTGTCTTCATTAGACTTATAAACCTTCATGGAATATTT
+GTATGCCGACTCTATATCTATACCTTCATCTACATAAACACCTTCGTGATGTCTGCATGGAGACAAGACACCGGATCTGC
+ACAACATTGATAACGCCCAATCTTTTTGCTCAGACTCTAACTCATTGATACTCATTTATAAACTCCTTGCAATGTATGTC
+GTTTCAGCTAAACGGTATCAGCAATGTTTATGTAAAGAAACAGTAAGATAATACTCAACCCGATGTTTGAGTACGGTCAT
+CATCTGACACTACAGACTCTGGCATCGCTGTGAAGACGACGCGAAATTCAGCATTTTCACAAGCGTTATCTTTTACAAAA
+CCGATCTCACTCTCCTTTGATGCGAATGCCAGCGTCAGACATCATATGCAGATACTCACCTGCATCCTGAACCCATTGAC
+CTCCAACCCCGTAATAGCGATGCGTAATGATGTCGATAGTTACTAACGGGTCTTGTTCGATTAACTGCCGCAGAAACTCT
+TCCAGGTCACCAGTGCAGTGCTTGATAACAGGAGTCTTCCCAGGATGGCGAACAACAAGAAACTGGTTTCCGTCTTCACG
+GACTTCGTTGCTTTCCAGTTTAGCAATACGCTTACTCCCATCCGAGATAACACCTTCGTAATACTCACGCTGCTCGTTGA
+GTTTTGATTTTGCTGTTTCAAGCTCAACACGCAGTTTCCCTACTGTTAGCGCAATATCCTCGTTCTCCTGGTCGCGGCGT
+TTGATGTATTGCTGGTTTCTTTCCCGTTCATCCAGCAGTTCCAGCACAATCGATGGTGTTACCAATTCATGGAAAAGGTC
+TGCGTCAAATCCCCAGTCGTCATGCATTGCCTGCTCTGCCGCTTCACGCAGTGCCTGAGAGTTAATTTCGCTCACTTCGA
+ACCTCTCTGTTTACTGATAAGTTCCAGATCCTCCTGGCAACTTGCACAAGTCCGACAACCCTGAACGACCAGGCGTCTTC
+GTTCATCTATCGGATCGCCACACTCACAACAATGAGTGGCAGATATAGCCTGGTGGTTCAGGCGGCGCATTTTTATTGCT
+GTGTTGCGCTGTAATTCTTCTATTTCTGATGCTGAATCAATGATGTCTGCCATCTTTCATTAATCCCTGAACTGTTGGTT
+AATACGCTTGAGGGTGAATGCGAATAATAAAAAAGGAGCCTGTAGCTCCCTGATGATTTTGCTTTTCATGTTCATCGTTC
+CTTAAAGACGCCGTTTAACATGCCGATTGCCAGGCTTAAATGAGTCGGTGTGAATCCCATCAGCGTTACCGTTTCGCGGT
+GCTTCTTCAGTACGCTACGGCAAATGTCATCGACGTTTTTATCCGGAAACTGCTGTCTGGCTTTTTTTGATTTCAGAATT
+AGCCTGACGGGCAATGCTGCGAAGGGCGTTTTCCTGCTGAGGTGTCATTGAACAAGTCCCATGTCGGCAAGCATAAGCAC
+ACAGAATATGAAGCCCGCTGCCAGAAAAATGCATTCCGTGGTTGTCATACCTGGTTTCTCTCATCTGCTTCTGCTTTCGC
+CACCATCATTTCCAGCTTTTGTGAAAGGGATGCGGCTAACGTATGAAATTCTTCGTCTGTTTCTACTGGTATTGGCACAA
+ACCTGATTCCAATTTGAGCAAGGCTATGTGCCATCTCGATACTCGTTCTTAACTCAACAGAAGATGCTTTGTGCATACAG
+CCCCTCGTTTATTATTTATCTCCTCAGCCAGCCGCTGTGCTTTCAGTGGATTTCGGATAACAGAAAGGCCGGGAAATACC
+CAGCCTCGCTTTGTAACGGAGTAGACGAAAGTGATTGCGCCTACCCGGATATTATCGTGAGGATGCGTCATCGCCATTGC
+TCCCCAAATACAAAACCAATTTCAGCCAGTGCCTCGTCCATTTTTTCGATGAACTCCGGCACGATCTCGTCAAAACTCGC
+CATGTACTTTTCATCCCGCTCAATCACGACATAATGCAGGCCTTCACGCTTCATACGCGGGTCATAGTTGGCAAAGTACC
+AGGCATTTTTTCGCGTCACCCACATGCTGTACTGCACCTGGGCCATGTAAGCTGACTTTATGGCCTCGAAACCACCGAGC
+CGGAACTTCATGAAATCCCGGGAGGTAAACGGGCATTTCAGTTCAAGGCCGTTGCCGTCACTGCATAAACCATCGGGAGA
+GCAGGCGGTACGCATACTTTCGTCGCGATAGATGATCGGGGATTCAGTAACATTCACGCCGGAAGTGAATTCAAACAGGG
+TTCTGGCGTCGTTCTCGTACTGTTTTCCCCAGGCCAGTGCTTTAGCGTTAACTTCCGGAGCCACACCGGTGCAAACCTCA
+GCAAGCAGGGTGTGGAAGTAGGACATTTTCATGTCAGGCCACTTCTTTCCGGAGCGGGGTTTTGCTATCACGTTGTGAAC
+TTCTGAAGCGGTGATGACGCCGAGCCGTAATTTGTGCCACGCATCATCCCCCTGTTCGACAGCTCTCACATCGATCCCGG
+TACGCTGCAGGATAATGTCCGGTGTCATGCTGCCACCTTCTGCTCTGCGGCTTTCTGTTTCAGGAATCCAAGAGCTTTTA
+CTGCTTCGGCCTGTGTCAGTTCTGACGATGCACGAATGTCGCGGCGAAATATCTGGGAACAGAGCGGCAATAAGTCGTCA
+TCCCATGTTTTATCCAGGGCGATCAGCAGAGTGTTAATCTCCTGCATGGTTTCATCGTTAACCGGAGTGATGTCGCGTTC
+CGGCTGACGTTCTGCAGTGTATGCAGTATTTTCGACAATGCGCTCGGCTTCATCCTTGTCATAGATACCAGCAAATCCGA
+AGGCCAGACGGGCACACTGAATCATGGCTTTATGACGTAACATCCGTTTGGGATGCGACTGCCACGGCCCCGTGATTTCT
+CTGCCTTCGCGAGTTTTGAATGGTTCGCGGCGGCATTCATCCATCCATTCGGTAACGCAGATCGGATGATTACGGTCCTT
+GCGGTAAATCCGGCATGTACAGGATTCATTGTCCTGCTCAAAGTCCATGCCATCAAACTGCTGGTTTTCATTGATGATGC
+GGGACCAGCCATCAACGCCCACCACCGGAACGATGCCATTCTGCTTATCAGGAAAGGCGTAAATTTCTTTCGTCCACGGA
+TTAAGGCCGTACTGGTTGGCAACGATCAGTAATGCGATGAACTGCGCATCGCTGGCATCACCTTTAAATGCCGTCTGGCG
+AAGAGTGGTGATCAGTTCCTGTGGGTCGACAGAATCCATGCCGACACGTTCAGCCAGCTTCCCAGCCAGCGTTGCGAGTG
+CAGTACTCATTCGTTTTATACCTCTGAATCAATATCAACCTGGTGGTGAGCAATGGTTTCAACCATGTACCGGATGTGTT
+CTGCCATGCGCTCCTGAAACTCAACATCGTCATCAAACGCACGGGTAATGGATTTTTTGCTGGCCCCGTGGCGTTGCAAA
+TGATCGATGCATAGCGATTCAAACAGGTGCTGGGGCAGGCCTTTTTCCATGTCGTCTGCCAGTTCTGCCTCTTTCTCTTC
+ACGGGCGAGCTGCTGGTAGTGACGCGCCCAGCTCTGAGCCTCAAGACGATCCTGAATGTAATAAGCGTTCATGGCTGAAC
+TCCTGAAATAGCTGTGAAAATATCGCCCGCGAAATGCCGGGCTGATTAGGAAAACAGGAAAGGGGGTTAGTGAATGCTTT
+TGCTTGATCTCAGTTTCAGTATTAATATCCATTTTTTATAAGCGTCGACGGCTTCACGAAACATCTTTTCATCGCCAATA
+AAAGTGGCGATAGTGAATTTAGTCTGGATAGCCATAAGTGTTTGATCCATTCTTTGGGACTCCTGGCTGATTAAGTATGT
+CGATAAGGCGTTTCCATCCGTCACGTAATTTACGGGTGATTCGTTCAAGTAAAGATTCGGAAGGGCAGCCAGCAACAGGC
+CACCCTGCAATGGCATATTGCATGGTGTGCTCCTTATTTATACATAACGAAAAACGCCTCGAGTGAAGCGTTATTGGTAT
+GCGGTAAAACCGCACTCAGGCGGCCTTGATAGTCATATCATCTGAATCAAATATTCCTGATGTATCGATATCGGTAATTC
+TTATTCCTTCGCTACCATCCATTGGAGGCCATCCTTCCTGACCATTTCCATCATTCCAGTCGAACTCACACACAACACCA
+TATGCATTTAAGTCGCTTGAAATTGCTATAAGCAGAGCATGTTGCGCCAGCATGATTAATACAGCATTTAATACAGAGCC
+GTGTTTATTGAGTCGGTATTCAGAGTCTGACCAGAAATTATTAATCTGGTGAAGTTTTTCCTCTGTCATTACGTCATGGT
+CGATTTCAATTTCTATTGATGCTTTCCAGTCGTAATCAATGATGTATTTTTTGATGTTTGACATCTGTTCATATCCTCAC
+AGATAAAAAATCGCCCTCACACTGGAGGGCAAAGAAGATTTCCAATAATCAGAACAAGTCGGCTCCTGTTTAGTTACGAG
+CGACATTGCTCCGTGTATTCACTCGTTGGAATGAATACACAGTGCAGTGTTTATTCTGTTATTTATGCCAAAAATAAAGG
+CCACTATCAGGCAGCTTTGTTGTTCTGTTTACCAAGTTCTCTGGCAATCATTGCCGTCGTTCGTATTGCCCATTTATCGA
+CATATTTCCCATCTTCCATTACAGGAAACATTTCTTCAGGCTTAACCATGCATTCCGATTGCAGCTTGCATCCATTGCAT
+CGCTTGAATTGTCCACACCATTGATTTTTATCAATAGTCGTAGTCATACGGATAGTCCTGGTATTGTTCCATCACATCCT
+GAGGATGCTCTTCGAACTCTTCAAATTCTTCTTCCATATATCACCTTAAATAGTGGATTGCGGTAGTAAAGATTGTGCCT
+GTCTTTTAACCACATCAGGCTCGGTGGTTCTCGTGTACCCCTACAGCGAGAAATCGGATAAACTATTACAACCCCTACAG
+TTTGATGAGTATAGAAATGGATCCACTCGTTATTCTCGGACGAGTGTTCAGTAATGAACCTCTGGAGAGAACCATGTATA
+TGATCGTTATCTGGGTTGGACTTCTGCTTTTAAGCCCAGATAACTGGCCTGAATATGTTAATGAGAGAATCGGTATTCCT
+CATGTGTGGCATGTTTTCGTCTTTGCTCTTGCATTTTCGCTAGCAATTAATGTGCATCGATTATCAGCTATTGCCAGCGC
+CAGATATAAGCGATTTAAGCTAAGAAAACGCATTAAGATGCAAAACGATAAAGTGCGATCAGTAATTCAAAACCTTACAG
+AAGAGCAATCTATGGTTTTGTGCGCAGCCCTTAATGAAGGCAGGAAGTATGTGGTTACATCAAAACAATTCCCATACATT
+AGTGAGTTGATTGAGCTTGGTGTGTTGAACAAAACTTTTTCCCGATGGAATGGAAAGCATATATTATTCCCTATTGAGGA
+TATTTACTGGACTGAATTAGTTGCCAGCTATGATCCATATAATATTGAGATAAAGCCAAGGCCAATATCTAAGTAACTAG
+ATAAGAGGAATCGATTTTCCCTTAATTTTCTGGCGTCCACTGCATGTTATGCCGCGTTCGCCAGGCTTGCTGTACCATGT
+GCGCTGATTCTTGCGCTCAATACGTTGCAGGTTGCTTTCAATCTGTTTGTGGTATTCAGCCAGCACTGTAAGGTCTATCG
+GATTTAGTGCGCTTTCTACTCGTGATTTCGGTTTGCGATTCAGCGAGAGAATAGGGCGGTTAACTGGTTTTGCGCTTACC
+CCAACCAACAGGGGATTTGCTGCTTTCCATTGAGCCTGTTTCTCTGCGCGACGTTCGCGGCGGCGTGTTTGTGCATCCAT
+CTGGATTCTCCTGTCAGTTAGCTTTGGTGGTGTGTGGCAGTTGTAGTCCTGAACGAAAACCCCCCGCGATTGGCACATTG
+GCAGCTAATCCGGAATCGCACTTACGGCCAATGCTTCGTTTCGTATCACACACCCCAAAGCCTTCTGCTTTGAATGCTGC
+CCTTCTTCAGGGCTTAATTTTTAAGAGCGTCACCTTCATGGTGGTCAGTGCGTCCTGCTGATGTGCTCAGTATCACCGCC
+AGTGGTATTTATGTCAACACCGCCAGAGATAATTTATCACCGCAGATGGTTATCTGTATGTTTTTTATATGAATTTATTT
+TTTGCAGGGGGGCATTGTTTGGTAGGTGAGAGATCTGAATTGCTATGTTTAGTGAGTTGTATCTATTTATTTTTCAATAA
+ATACAATTGGTTATGTGTTTTGGGGGCGATCGTGAGGCAAAGAAAACCCGGCGCTGAGGCCGGGTTATTCTTGTTCTCTG
+GTCAAATTATATAGTTGGAAAACAAGGATGCATATATGAATGAACGATGCAGAGGCAATGCCGATGGCGATAGTGGGTAT
+CATGTAGCCGCTTATGCTGGAAAGAAGCAATAACCCGCAGAAAAACAAAGCTCCAAGCTCAACAAAACTAAGGGCATAGA
+CAATAACTACCGATGTCATATACCCATACTCTCTAATCTTGGCCAGTCGGCGCGTTCTGCTTCCGATTAGAAACGTCAAG
+GCAGCAATCAGGATTGCAATCATGGTTCCTGCATATGATGACAATGTCGCCCCAAGACCATCTCTATGAGCTGAAAAAGA
+AACACCAGGAATGTAGTGGCGGAAAAGGAGATAGCAAATGCTTACGATAACGTAAGGAATTATTACTATGTAAACACCAG
+GCATGATTCTGTTCCGCATAATTACTCCTGATAATTAATCCTTAACTTTGCCCACCTGCCTTTTAAAACATTCCAGTATA
+TCACTTTTCATTCTTGCGTAGCAATATGCCATCTCTTCAGCTATCTCAGCATTGGTGACCTTGTTCAGAGGCGCTGAGAG
+ATGGCCTTTTTCTGATAGATAATGTTCTGTTAAAATATCTCCGGCCTCATCTTTTGCCCGCAGGCTAATGTCTGAAAATT
+GAGGTGACGGGTTAAAAATAATATCCTTGGCAACCTTTTTTATATCCCTTTTAAATTTTGGCTTAATGACTATATCCAAT
+GAGTCAAAAAGCTCCCCTTCAATATCTGTTGCCCCTAAGACCTTTAATATATCGCCAAATACAGGTAGCTTGGCTTCTAC
+CTTCACCGTTGTTCGGCCGATGAAATGCATATGCATAACATCGTCTTTGGTGGTTCCCCTCATCAGTGGCTCTATCTGAA
+CGCGCTCTCCACTGCTTAATGACATTCCTTTCCCGATTAAAAAATCTGTCAGATCGGATGTGGTCGGCCCGAAAACAGTT
+CTGGCAAAACCAATGGTGTCGCCTTCAACAAACAAAAAAGATGGGAATCCCAATGATTCGTCATCTGCGAGGCTGTTCTT
+AATATCTTCAACTGAAGCTTTAGAGCGATTTATCTTCTGAACCAGACTCTTGTCATTTGTTTTGGTAAAGAGAAAAGTTT
+TTCCATCGATTTTATGAATATACAAATAATTGGAGCCAACCTGCAGGTGATGATTATCAGCCAGCAGAGAATTAAGGAAA
+ACAGACAGGTTTATTGAGCGCTTATCTTTCCCTTTATTTTTGCTGCGGTAAGTCGCATAAAAACCATTCTTCATAATTCA
+ATCCATTTACTATGTTATGTTCTGAGGGGAGTGAAAATTCCCCTAATTCGATGAAGATTCTTGCTCAATTGTTATCAGCT
+ATGCGCCGACCAGAACACCTTGCCGATCAGCCAAACGTCTCTTCAGGCCACTGACTAGCGATAACTTTCCCCACAACGGA
+ACAACTCTCATTGCATGGGATCATTGGGTACTGTGGGTTTAGTGGTTGTAAAAACACCTGACCGCTATCCCTGATCAGTT
+TCTTGAAGGTAAACTCATCACCCCCAAGTCTGGCTATGCAGAAATCACCTGGCTCAACAGCCTGCTCAGGGTCAACGAGA
+ATTAACATTCCGTCAGGAAAGCTTGGCTTGGAGCCTGTTGGTGCGGTCATGGAATTACCTTCAACCTCAAGCCAGAATGC
+AGAATCACTGGCTTTTTTGGTTGTGCTTACCCATCTCTCCGCATCACCTTTGGTAAAGGTTCTAAGCTTAGGTGAGAACA
+TCCCTGCCTGAACATGAGAAAAAACAGGGTACTCATACTCACTTCTAAGTGACGGCTGCATACTAACCGCTTCATACATC
+TCGTAGATTTCTCTGGCGATTGAAGGGCTAAATTCTTCAACGCTAACTTTGAGAATTTTTGTAAGCAATGCGGCGTTATA
+AGCATTTAATGCATTGATGCCATTAAATAAAGCACCAACGCCTGACTGCCCCATCCCCATCTTGTCTGCGACAGATTCCT
+GGGATAAGCCAAGTTCATTTTTCTTTTTTTCATAAATTGCTTTAAGGCGACGTGCGTCCTCAAGCTGCTCTTGTGTTAAT
+GGTTTCTTTTTTGTGCTCATACGTTAAATCTATCACCGCAAGGGATAAATATCTAACACCGTGCGTGTTGACTATTTTAC
+CTCTGGCGGTGATAATGGTTGCATGTACTAAGGAGGTTGTATGGAACAACGCATAACCCTGAAAGATTATGCAATGCGCT
+TTGGGCAAACCAAGACAGCTAAAGATCTCGGCGTATATCAAAGCGCGATCAACAAGGCCATTCATGCAGGCCGAAAGATT
+TTTTTAACTATAAACGCTGATGGAAGCGTTTATGCGGAAGAGGTAAAGCCCTTCCCGAGTAACAAAAAAACAACAGCATA
+AATAACCCCGCTCTTACACATTCCAGCCCTGAAAAAGGGCATCAAATTAAACCACACCTATGGTGTATGCATTTATTTGC
+ATACATTCAATCAATTGTTATCTAAGGAAATACTTACATATGGTTCGTGCAAACAAACGCAACGAGGCTCTACGAATCGA
+GAGTGCGTTGCTTAACAAAATCGCAATGCTTGGAACTGAGAAGACAGCGGAAGCTGTGGGCGTTGATAAGTCGCAGATCA
+GCAGGTGGAAGAGGGACTGGATTCCAAAGTTCTCAATGCTGCTTGCTGTTCTTGAATGGGGGGTCGTTGACGACGACATG
+GCTCGATTGGCGCGACAAGTTGCTGCGATTCTCACCAATAAAAAACGCCCGGCGGCAACCGAGCGTTCTGAACAAATCCA
+GATGGAGTTCTGAGGTCATTACTGGATCTATCAACAGGAGTCATTATGACAAATACAGCAAAAATACTCAACTTCGGCAG
+AGGTAACTTTGCCGGACAGGAGCGTAATGTGGCAGATCTCGATGATGGTTACGCCAGACTATCAAATATGCTGCTTGAGG
+CTTATTCGGGCGCAGATCTGACCAAGCGACAGTTTAAAGTGCTGCTTGCCATTCTGCGTAAAACCTATGGGTGGAATAAA
+CCAATGGACAGAATCACCGATTCTCAACTTAGCGAGATTACAAAGTTACCTGTCAAACGGTGCAATGAAGCCAAGTTAGA
+ACTCGTCAGAATGAATATTATCAAGCAGCAAGGCGGCATGTTTGGACCAAATAAAAACATCTCAGAATGGTGCATCCCTC
+AAAACGAGGGAAAATCCCCTAAAACGAGGGATAAAACATCCCTCAAATTGGGGGATTGCTATCCCTCAAAACAGGGGGAC
+ACAAAAGACACTATTACAAAAGAAAAAAGAAAAGATTATTCGTCAGAGAATTCTGGCGAATCCTCTGACCAGCCAGAAAA
+CGACCTTTCTGTGGTGAAACCGGATGCTGCAATTCAGAGCGGCAGCAAGTGGGGGACAGCAGAAGACCTGACCGCCGCAG
+AGTGGATGTTTGACATGGTGAAGACTATCGCACCATCAGCCAGAAAACCGAATTTTGCTGGGTGGGCTAACGATATCCGC
+CTGATGCGTGAACGTGACGGACGTAACCACCGCGACATGTGTGTGCTGTTCCGCTGGGCATGCCAGGACAACTTCTGGTC
+CGGTAACGTGCTGAGCCCGGCCAAACTCCGCGATAAGTGGACCCAACTCGAAATCAACCGTAACAAGCAACAGGCAGGCG
+TGACAGCCAGCAAACCAAAACTCGACCTGACAAACACAGACTGGATTTACGGGGTGGATCTATGAAAAACATCGCCGCAC
+AGATGGTTAACTTTGACCGTGAGCAGATGCGTCGGATCGCCAACAACATGCCGGAACAGTACGACGAAAAGCCGCAGGTA
+CAGCAGGTAGCGCAGATCATCAACGGTGTGTTCAGCCAGTTACTGGCAACTTTCCCGGCGAGCCTGGCTAACCGTGACCA
+GAACGAAGTGAACGAAATCCGTCGCCAGTGGGTTCTGGCTTTTCGGGAAAACGGGATCACCACGATGGAACAGGTTAACG
+CAGGAATGCGCGTAGCCCGTCGGCAGAATCGACCATTTCTGCCATCACCCGGGCAGTTTGTTGCATGGTGCCGGGAAGAA
+GCATCCGTTACCGCCGGACTGCCAAACGTCAGCGAGCTGGTTGATATGGTTTACGAGTATTGCCGGAAGCGAGGCCTGTA
+TCCGGATGCGGAGTCTTATCCGTGGAAATCAAACGCGCACTACTGGCTGGTTACCAACCTGTATCAGAACATGCGGGCCA
+ATGCGCTTACTGATGCGGAATTACGCCGTAAGGCCGCAGATGAGCTTGTCCATATGACTGCGAGAATTAACCGTGGTGAG
+GCGATCCCTGAACCAGTAAAACAACTTCCTGTCATGGGCGGTAGACCTCTAAATCGTGCACAGGCTCTGGCGAAGATCGC
+AGAAATCAAAGCTAAGTTCGGACTGAAAGGAGCAAGTGTATGACGGGCAAAGAGGCAATTATTCATTACCTGGGGACGCA
+TAATAGCTTCTGTGCGCCGGACGTTGCCGCGCTAACAGGCGCAACAGTAACCAGCATAAATCAGGCCGCGGCTAAAATGG
+CACGGGCAGGTCTTCTGGTTATCGAAGGTAAGGTCTGGCGAACGGTGTATTACCGGTTTGCTACCAGGGAAGAACGGGAA
+GGAAAGATGAGCACGAACCTGGTTTTTAAGGAGTGTCGCCAGAGTGCCGCGATGAAACGGGTATTGGCGGTATATGGAGT
+TAAAAGATGACCATCTACATTACTGAGCTAATAACAGGCCTGCTGGTAATCGCAGGCCTTTTTATTTGGGGGAGAGGGAA
+GTCATGAAAAAACTAACCTTTGAAATTCGATCTCCAGCACATCAGCAAAACGCTATTCACGCAGTACAGCAAATCCTTCC
+AGACCCAACCAAACCAATCGTAGTAACCATTCAGGAACGCAACCGCAGCTTAGACCAAAACAGGAAGCTATGGGCCTGCT
+TAGGTGACGTCTCTCGTCAGGTTGAATGGCATGGTCGCTGGCTGGATGCAGAAAGCTGGAAGTGTGTGTTTACCGCAGCA
+TTAAAGCAGCAGGATGTTGTTCCTAACCTTGCCGGGAATGGCTTTGTGGTAATAGGCCAGTCAACCAGCAGGATGCGTGT
+AGGCGAATTTGCGGAGCTATTAGAGCTTATACAGGCATTCGGTACAGAGCGTGGCGTTAAGTGGTCAGACGAAGCGAGAC
+TGGCTCTGGAGTGGAAAGCGAGATGGGGAGACAGGGCTGCATGATAAATGTCGTTAGTTTCTCCGGTGGCAGGACGTCAG
+CATATTTGCTCTGGCTAATGGAGCAAAAGCGACGGGCAGGTAAAGACGTGCATTACGTTTTCATGGATACAGGTTGTGAA
+CATCCAATGACATATCGGTTTGTCAGGGAAGTTGTGAAGTTCTGGGATATACCGCTCACCGTATTGCAGGTTGATATCAA
+CCCGGAGCTTGGACAGCCAAATGGTTATACGGTATGGGAACCAAAGGATATTCAGACGCGAATGCCTGTTCTGAAGCCAT
+TTATCGATATGGTAAAGAAATATGGCACTCCATACGTCGGCGGCGCGTTCTGCACTGACAGATTAAAACTCGTTCCCTTC
+ACCAAATACTGTGATGACCATTTCGGGCGAGGGAATTACACCACGTGGATTGGCATCAGAGCTGATGAACCGAAGCGGCT
+AAAGCCAAAGCCTGGAATCAGATATCTTGCTGAACTGTCAGACTTTGAGAAGGAAGATATCCTCGCATGGTGGAAGCAAC
+AACCATTCGATTTGCAAATACCGGAACATCTCGGTAACTGCATATTCTGCATTAAAAAATCAACGCAAAAAATCGGACTT
+GCCTGCAAAGATGAGGAGGGATTGCAGCGTGTTTTTAATGAGGTCATCACGGGATCCCATGTGCGTGACGGACATCGGGA
+AACGCCAAAGGAGATTATGTACCGAGGAAGAATGTCGCTGGACGGTATCGCGAAAATGTATTCAGAAAATGATTATCAAG
+CCCTGTATCAGGACATGGTACGAGCTAAAAGATTCGATACCGGCTCTTGTTCTGAGTCATGCGAAATATTTGGAGGGCAG
+CTTGATTTCGACTTCGGGAGGGAAGCTGCATGATGCGATGTTATCGGTGCGGTGAATGCAAAGAAGATAACCGCTTCCGA
+CCAAATCAACCTTACTGGAATCGATGGTGTCTCCGGTGTGAAAGAACACCAACAGGGGTGTTACCACTACCGCAGGAAAA
+GGAGGACGTGTGGCGAGACAGCGACGAAGTATCACCGACATAATCTGCGAAAACTGCAAATACCTTCCAACGAAACGCAC
+CAGAAATAAACCCAAGCCAATCCCAAAAGAATCTGACGTAAAAACCTTCAACTACACGGCTCACCTGTGGGATATCCGGT
+GGCTAAGACGTCGTGCGAGGAAAACAAGGTGATTGACCAAAATCGAAGTTACGAACAAGAAAGCGTCGAGCGAGCTTTAA
+CGTGCGCTAACTGCGGTCAGAAGCTGCATGTGCTGGAAGTTCACGTGTGTGAGCACTGCTGCGCAGAACTGATGAGCGAT
+CCGAATAGCTCGATGCACGAGGAAGAAGATGATGGCTAAACCAGCGCGAAGACGATGTAAAAACGATGAATGCCGGGAAT
+GGTTTCACCCTGCATTCGCTAATCAGTGGTGGTGCTCTCCAGAGTGTGGAACCAAGATAGCACTCGAACGACGAAGTAAA
+GAACGCGAAAAAGCGGAAAAAGCAGCAGAGAAGAAACGACGACGAGAGGAGCAGAAACAGAAAGATAAACTTAAGATTCG
+AAAACTCGCCTTAAAGCCCCGCAGTTACTGGATTAAACAAGCCCAACAAGCCGTAAACGCCTTCATCAGAGAAAGAGACC
+GCGACTTACCATGTATCTCGTGCGGAACGCTCACGTCTGCTCAGTGGGATGCCGGACATTACCGGACAACTGCTGCGGCA
+CCTCAACTCCGATTTAATGAACGCAATATTCACAAGCAATGCGTGGTGTGCAACCAGCACAAAAGCGGAAATCTCGTTCC
+GTATCGCGTCGAACTGATTAGCCGCATCGGGCAGGAAGCAGTAGACGAAATCGAATCAAACCATAACCGCCATCGCTGGA
+CTATCGAAGAGTGCAAGGCGATCAAGGCAGAGTACCAACAGAAACTCAAAGACCTGCGAAATAGCAGAAGTGAGGCCGCA
+TGACGTTCTCAGTAAAAACCATTCCAGACATGCTCGTTGAAACATACGGAAATCAGACAGAAGTAGCACGCAGACTGAAA
+TGTAGTCGCGGTACGGTCAGAAAATACGTTGATGATAAAGACGGGAAAATGCACGCCATCGTCAACGACGTTCTCATGGT
+TCATCGCGGATGGAGTGAAAGAGATGCGCTATTACGAAAAAATTGATGGCAGCAAATACCGAAATATTTGGGTAGTTGGC
+GATCTGCACGGATGCTACACGAACCTGATGAACAAACTGGATACGATTGGATTCGACAACAAAAAAGACCTGCTTATCTC
+GGTGGGCGATTTGGTTGATCGTGGTGCAGAGAACGTTGAATGCCTGGAATTAATCACATTCCCCTGGTTCAGAGCTGTAC
+GTGGAAACCATGAGCAAATGATGATTGATGGCTTATCAGAGCGTGGAAACGTTAATCACTGGCTGCTTAATGGCGGTGGC
+TGGTTCTTTAATCTCGATTACGACAAAGAAATTCTGGCTAAAGCTCTTGCCCATAAAGCAGATGAACTTCCGTTAATCAT
+CGAACTGGTGAGCAAAGATAAAAAATATGTTATCTGCCACGCCGATTATCCCTTTGACGAATACGAGTTTGGAAAGCCAG
+TTGATCATCAGCAGGTAATCTGGAACCGCGAACGAATCAGCAACTCACAAAACGGGATCGTGAAAGAAATCAAAGGCGCG
+GACACGTTCATCTTTGGTCATACGCCAGCAGTGAAACCACTCAAGTTTGCCAACCAAATGTATATCGATACCGGCGCAGT
+GTTCTGCGGAAACCTAACATTGATTCAGGTACAGGGAGAAGGCGCATGAGACTCGAAAGCGTAGCTAAATTTCATTCGCC
+AAAAAGCCCGATGATGAGCGACTCACCACGGGCCACGGCTTCTGACTCTCTTTCCGGTACTGATGTGATGGCTGCTATGG
+GGATGGCGCAATCACAAGCCGGATTCGGTATGGCTGCATTCTGCGGTAAGCACGAACTCAGCCAGAACGACAAACAAAAG
+GCTATCAACTATCTGATGCAATTTGCACACAAGGTATCGGGGAAATACCGTGGTGTGGCAAAGCTTGAAGGAAATACTAA
+GGCAAAGGTACTGCAAGTGCTCGCAACATTCGCTTATGCGGATTATTGCCGTAGTGCCGCGACGCCGGGGGCAAGATGCA
+GAGATTGCCATGGTACAGGCCGTGCGGTTGATATTGCCAAAACAGAGCTGTGGGGGAGAGTTGTCGAGAAAGAGTGCGGA
+AGATGCAAAGGCGTCGGCTATTCAAGGATGCCAGCAAGCGCAGCATATCGCGCTGTGACGATGCTAATCCCAAACCTTAC
+CCAACCCACCTGGTCACGCACTGTTAAGCCGCTGTATGACGCTCTGGTGGTGCAATGCCACAAAGAAGAGTCAATCGCAG
+ACAACATTTTGAATGCGGTCACACGTTAGCAGCATGATTGCCACGGATGGCAACATATTAACGGCATGATATTGACTTAT
+TGAATAAAATTGGGTAAATTTGACTCAACGATGGGTTAATTCGCTCGTTGTGGTAGTGAGATGAAAAGAGGCGGCGCTTA
+CTACCGATTCCGCCTAGTTGGTCACTTCGACGTATCGTCTGGAACTCCAACCATCGCAGGCAGAGAGGTCTGCAAAATGC
+AATCCCGAAACAGTTCGCAGGTAATAGTTAGAGCCTGCATAACGGTTTCGGGATTTTTTATATCTGCACAACAGGTAAGA
+GCATTGAGTCGATAATCGTGAAGAGTCGGCGAGCCTGGTTAGCCAGTGCTCTTTCCGTTGTGCTGAATTAAGCGAATACC
+GGAAGCAGAACCGGATCACCAAATGCGTACAGGCGTCATCGCCGCCCAGCAACAGCACAACCCAAACTGAGCCGTAGCCA
+CTGTCTGTCCTGAATTCATTAGTAATAGTTACGCTGCGGCCTTTTACACATGACCTTCGTGAAAGCGGGTGGCAGGAGGT
+CGCGCTAACAACCTCCTGCCGTTTTGCCCGTGCATATCGGTCACGAACAAATCTGATTACTAAACACAGTAGCCTGGATT
+TGTTCTATCAGTAATCGACCTTATTCCTAATTAAATAGAGCAAATCCCCTTATTGGGGGTAAGACATGAAGATGCCAGAA
+AAACATGACCTGTTGGCCGCCATTCTCGCGGCAAAGGAACAAGGCATCGGGGCAATCCTTGCGTTTGCAATGGCGTACCT
+TCGCGGCAGATATAATGGCGGTGCGTTTACAAAAACAGTAATCGACGCAACGATGTGCGCCATTATCGCCTAGTTCATTC
+GTGACCTTCTCGACTTCGCCGGACTAAGTAGCAATCTCGCTTATATAACGAGCGTGTTTATCGGCTACATCGGTACTGAC
+TCGATTGGTTCGCTTATCAAACGCTTCGCTGCTAAAAAAGCCGGAGTAGAAGATGGTAGAAATCAATAATCAACGTAAGG
+CGTTCCTCGATATGCTGGCGTGGTCGGAGGGAACTGATAACGGACGTCAGAAAACCAGAAATCATGGTTATGACGTCATT
+GTAGGCGGAGAGCTATTTACTGATTACTCCGATCACCCTCGCAAACTTGTCACGCTAAACCCAAAACTCAAATCAACAGG
+CGCCGGACGCTACCAGCTTCTTTCCCGTTGGTGGGATGCCTACCGCAAGCAGCTTGGCCTGAAAGACTTCTCTCCGAAAA
+GTCAGGACGCTGTGGCATTGCAGCAGATTAAGGAGCGTGGCGCTTTACCTATGATTGATCGTGGTGATATCCGTCAGGCA
+ATCGACCGTTGCAGCAATATCTGGGCTTCACTGCCGGGCGCTGGTTATGGTCAGTTCGAGCATAAGGCTGACAGCCTGAT
+TGCAAAATTCAAAGAAGCGGGCGGAACGGTCAGAGAGATTGATGTATGAGCAGAGTCACCGCGATTATCTCCGCTCTGGT
+TATCTGCATCATCGTCTGCCTGTCATGGGCTGTTAATCATTACCGTGATAACGCCATTACCTACAAAGCCCAGCGCGACA
+AAAATGCCAGAGAACTGAAGCTGGCGAACGCGGCAATTACTGACATGCAGATGCGTCAGCGTGATGTTGCTGCGCTCGAT
+GCAAAATACACGAAGGAGTTAGCTGATGCTAAAGCTGAAAATGATGCTCTGCGTGATGATGTTGCCGCTGGTCGTCGTCG
+GTTGCACATCAAAGCAGTCTGTCAGTCAGTGCGTGAAGCCACCACCGCCTCCGGCGTGGATAATGCAGCCTCCCCCCGAC
+TGGCAGACACCGCTGAACGGGATTATTTCACCCTCAGAGAGAGGCTGATCACTATGCAAAAACAACTGGAAGGAACCCAG
+AAGTATATTAATGAGCAGTGCAGATAGAGTTGCCCATATCGATGGGCAACTCATGCAATTATTGTGAGCAATACACACGC
+GCTTCCAGCGGAGTATAAATGCCTAAAGTAATAAAACCGAGCAATCCATTTACGAATGTTTGCTGGGTTTCTGTTTTAAC
+AACATTTTCTGCGCCGCCACAAATTTTGGCTGCATCGACAGTTTTCTTCTGCCCAATTCCAGAAACGAAGAAATGATGGG
+TGATGGTTTCCTTTGGTGCTACTGCTGCCGGTTTGTTTTGAACAGTAAACGTCTGTTGAGCACATCCTGTAATAAGCAGG
+GCCAGCGCAGTAGCGAGTAGCATTTTTTTCATGGTGTTATTCCCGATGCTTTTTGAAGTTCGCAGAATCGTATGTGTAGA
+AAATTAAACAAACCCTAAACAATGAGTTGAAATTTCATATTGTTAATATTTATTAATGTATGTCAGGTGCGATGAATCGT
+CATTGTATTCCCGGATTAACTATGTCCACAGCCCTGACGGGGAACTTCTCTGCGGGAGTGTCCGGGAATAATTAAAACGA
+TGCACACAGGGTTTAGCGCGTACACGTATTGCATTATGCCAACGCCCCGGTGCTGACACGGAAGAAACCGGACGTTATGA
+TTTAGCGTGGAAAGATTTGTGTAGTGTTCTGAATGCTCTCAGTAAATAGTAATGAATTATCAAAGGTATAGTAATATCTT
+TTATGTTCATGGATATTTGTAACCCATCGGAAAACTCCTGCTTTAGCAAGATTTTCCCTGTATTGCTGAAATGTGATTTC
+TCTTGATTTCAACCTATCATAGGACGTTTCTATAAGATGCGTGTTTCTTGAGAATTTAACATTTACAACCTTTTTAAGTC
+CTTTTATTAACACGGTGTTATCGTTTTCTAACACGATGTGAATATTATCTGTGGCTAGATAGTAAATATAATGTGAGACG
+TTGTGACGTTTTAGTTCAGAATAAAACAATTCACAGTCTAAATCTTTTCGCACTTGATCGAATATTTCTTTAAAAATGGC
+AACCTGAGCCATTGGTAAAACCTTCCATGTGATACGAGGGCGCGTAGTTTGCATTATCGTTTTTATCGTTTCAATCTGGT
+CTGACCTCCTTGTGTTTTGTTGATGATTTATGTCAAATATTAGGAATGTTTTCACTTAATAGTATTGGTTGCGTAACAAA
+GTGCGGTCCTGCTGGCATTCTGGAGGGAAATACAACCGACAGATGTATGTAAGGCCAACGTGCTCAAATCTTCATACAGA
+AAGATTTGAAGTAATATTTTAACCGCTAGATGAAGAGCAAGCGCATGGAGCGACAAAATGAATAAAGAACAATCTGCTGA
+TGATCCCTCCGTGGATCTGATTCGTGTAAAAAATATGCTTAATAGCACCATTTCTATGAGTTACCCTGATGTTGTAATTG
+CATGTATAGAACATAAGGTGTCTCTGGAAGCATTCAGAGCAATTGAGGCAGCGTTGGTGAAGCACGATAATAATATGAAG
+GATTATTCCCTGGTGGTTGACTGATCACCATAACTGCTAATCATTCAAACTATTTAGTCTGTGACAGAGCCAACACGCAG
+TCTGTCACTGTCAGGAAAGTGGTAAAACTGCAACTCAATTACTGCAATGCCCTCGTAATTAAGTGAATTTACAATATCGT
+CCTGTTCGGAGGGAAGAACGCGGGATGTTCATTCTTCATCACTTTTAATTGATGTATATGCTCTCTTTTCTGACGTTAGT
+CTCCGACGGCAGGCTTCAATGACCCAGGCTGAGAAATTCCCGGACCCTTTTTGCTCAAGAGCGATGTTAATTTGTTCAAT
+CATTTGGTTAGGAAAGCGGATGTTGCGGGTTGTTGTTCTGCGGGTTCTGTTCTTCGTTGACATGAGGTTGCCCCGTATTC
+AGTGTCGCTGATTTGTATTGTCTGAAGTTGTTTTTACGTTAAGTTGATGCAGATCAATTAATACGATACCTGCGTCATAA
+TTGATTATTTGACGTGGTTTGATGGCCTCCACGCACGTTGTGATATGTAGATGATAATCATTATCACTTTACGGGTCCTT
+TCCGGTGATCCGACAGGTTACG
diff --git a/tests/data/lambdaNEB.fa.fai b/tests/data/lambdaNEB.fa.fai
new file mode 100644
index 0000000..064af36
--- /dev/null
+++ b/tests/data/lambdaNEB.fa.fai
@@ -0,0 +1 @@
+lambda_NEB3011	48502	16	80	81
diff --git a/tests/data/polymerase/internal.polymerase.bam b/tests/data/polymerase/internal.polymerase.bam
new file mode 100644
index 0000000..5a9a3c2
Binary files /dev/null and b/tests/data/polymerase/internal.polymerase.bam differ
diff --git a/tests/data/polymerase/internal.scraps.bam b/tests/data/polymerase/internal.scraps.bam
new file mode 100644
index 0000000..ee501d3
Binary files /dev/null and b/tests/data/polymerase/internal.scraps.bam differ
diff --git a/tests/data/polymerase/internal.subreads.bam b/tests/data/polymerase/internal.subreads.bam
new file mode 100644
index 0000000..a352448
Binary files /dev/null and b/tests/data/polymerase/internal.subreads.bam differ
diff --git a/tests/data/polymerase/internal_hq.hqregion.bam b/tests/data/polymerase/internal_hq.hqregion.bam
new file mode 100644
index 0000000..e59134a
Binary files /dev/null and b/tests/data/polymerase/internal_hq.hqregion.bam differ
diff --git a/tests/data/polymerase/internal_hq.scraps.bam b/tests/data/polymerase/internal_hq.scraps.bam
new file mode 100644
index 0000000..154d2a1
Binary files /dev/null and b/tests/data/polymerase/internal_hq.scraps.bam differ
diff --git a/tests/data/polymerase/internal_polymerase.fasta b/tests/data/polymerase/internal_polymerase.fasta
new file mode 100644
index 0000000..9fb8832
--- /dev/null
+++ b/tests/data/polymerase/internal_polymerase.fasta
@@ -0,0 +1,2 @@
+>m130615_051803_richard_c100541252550000001823084511241346_s1_p0/66617/2659_7034
+CCAGTTTCTCTCTCACGTCACACCCATGAAAAGCAATGGATCTCTCTCTACACAACACAGAGCAAAGCGGAGGTTGGAGCTGTGAAAAAAAGAGATTGAGAATCCAATCCTTAGACCTCTATTAAGTCGACAACACCGCAGAGAACAAGCATCCTATCTGTGTCATTATCCGGTGGTGTTGGAGAGTTTGATATTATACAACAATAAAATACATATAATAGTAGAAATTCATCCCACAACAAAATCTTTATTAGGGTAAGTAGAAGCTTATCTATGAAACTGGGTTCATAAAAAGTTAAGAAAGAATAACAATAGATATAAAGAGGAACACACAAGTTGAATTTTATCGCATATAGCAATTAATCAAGAGGAATTGCAGGTTTTAATCTCATGGCTTTGAGCCTACTATTCTATGAGCTTGGGCTTACACACAGTGTCTTGACCGTAGATGCAGATCTTCTCCTCCAAACACACTAAACACCACCTTCACAA [...]
diff --git a/tests/data/polymerase/production.polymerase.bam b/tests/data/polymerase/production.polymerase.bam
new file mode 100644
index 0000000..9c192da
Binary files /dev/null and b/tests/data/polymerase/production.polymerase.bam differ
diff --git a/tests/data/polymerase/production.scraps.bam b/tests/data/polymerase/production.scraps.bam
new file mode 100644
index 0000000..c8c20df
Binary files /dev/null and b/tests/data/polymerase/production.scraps.bam differ
diff --git a/tests/data/polymerase/production.subreads.bam b/tests/data/polymerase/production.subreads.bam
new file mode 100644
index 0000000..9c56583
Binary files /dev/null and b/tests/data/polymerase/production.subreads.bam differ
diff --git a/tests/data/polymerase/production_hq.hqregion.bam b/tests/data/polymerase/production_hq.hqregion.bam
new file mode 100644
index 0000000..2993089
Binary files /dev/null and b/tests/data/polymerase/production_hq.hqregion.bam differ
diff --git a/tests/data/polymerase/production_hq.scraps.bam b/tests/data/polymerase/production_hq.scraps.bam
new file mode 100644
index 0000000..1c392fc
Binary files /dev/null and b/tests/data/polymerase/production_hq.scraps.bam differ
diff --git a/tests/data/segfault.bam b/tests/data/segfault.bam
new file mode 100644
index 0000000..c091600
Binary files /dev/null and b/tests/data/segfault.bam differ
diff --git a/tests/data/temp.bam b/tests/data/temp.bam
new file mode 100644
index 0000000..efba168
Binary files /dev/null and b/tests/data/temp.bam differ
diff --git a/tests/data/temp.sam b/tests/data/temp.sam
new file mode 100644
index 0000000..85cb839
--- /dev/null
+++ b/tests/data/temp.sam
@@ -0,0 +1,3310 @@
+ at HD	VN:1.0	SO:coordinate
+ at SQ	SN:seq1	LN:1575
+ at SQ	SN:seq2	LN:1584
+B7_591:4:96:693:509	73	seq1	1	99	36M	*	0	0	CACTAGTGGCTCATTGTAAATGTGTGGTTTAACTCG	<<<<<<<<<<<<<<<;<<<<<<<<<5<<<<<;:<;7	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:7:152:368:113	73	seq1	3	99	35M	*	0	0	CTAGTGGCTCATTGTAAATGTGTGGTTTAACTCGT	<<<<<<<<<<0<<<<655<<7<<<:9<<3/:<6):	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:8:5:734:57	137	seq1	5	99	35M	*	0	0	AGTGGCTCATTGTAAATGTGTGGTTTAACTCGTCC	<<<<<<<<<<<7;71<<;<;;<7;<<3;);3*8/5	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:1:289:587:906	137	seq1	6	63	36M	*	0	0	GTGGCTCATTGTAATTTTTTGTTTTAACTCTTCTCT	(-&----,----)-)-),'--)---',+-,),''*,	MF:i:-126	Aq:i:63	NM:i:5	UQ:i:38	H0:i:0	H1:i:0
+EAS56_59:8:38:671:758	137	seq1	9	99	35M	*	0	0	GCTCATTGTAAATGTGTGGTTTAACTCGTCCATGG	<<<<<<<<<<<<<<<;<;7<<<<<<<<7<<;:<5%	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:18:467:281	73	seq1	13	99	35M	*	0	0	ATTGTAAATGTGTGGTTTAACTCGTCCCTGGCCCA	<<<<<<<<;<<<8<<<<<;8:;6/686&;(16666	MF:i:18	Aq:i:39	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS114_28:5:296:340:699	137	seq1	13	99	36M	*	0	0	ATTGTAAATGTGTGGTTTAACTCGTCCATGGCCCAG	<<<<<;<<<;<;<<<<<<<<<<<8<8<3<8;<;<0;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:194:894:408	73	seq1	15	99	35M	*	0	0	TGTAAATGTGTGGTTTAACTCGTCCATTGCCCAGC	<<<<<<<<<7<<;<<<<;<<<7;;<<<*,;;572<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+EAS188_4:8:12:628:973	89	seq1	18	75	35M	*	0	0	AAATGTGTGGTTTAACTCGTCCATGGCCCAGCATT	==;=:;:;;:====;=;===:=======;==;===	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:68:402:50	137	seq1	22	99	35M	*	0	0	GTGTGGTTTAACTCGTCCATGGCCCAGCATTTGGG	<<<<<<<<<<<<<<:<<<9<6;9;;&697;7&<55	MF:i:18	Aq:i:66	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_30:6:298:115:564	137	seq1	22	99	35M	*	0	0	GTGTGGTTTAACTCGTCCATGGCCCAGCATTAGGG	<<<<<<<<<<<<<;<<<;<<<;<<<;<:<<;;5;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:188:662:155	73	seq1	24	99	36M	*	0	0	GTGGTTTAACTCGTCCATGGCCCAGCATTAGGGAGC	<<<<<<<<<<<<<<<<<<:;<<<4<<+<<14991;4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:225:608:291	73	seq1	28	99	35M	*	0	0	TTTAACTCGTCCATGGCCCAGCATTAGGGATCTGT	<<<<<<<<<<<<<<8&<<<;6<9;;+2++(%59(<	MF:i:18	Aq:i:58	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_66:7:328:397:316	73	seq1	29	99	35M	*	0	0	TTAACTCGTCCATGGCCCAGCATTAGGGAGCTGTG	<<<<<<<<<<<<<6=<<<;<<5<<<+<15:'<;;4	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:257:960:682	73	seq1	31	75	35M	*	0	0	AACTCGTCCATGGCCCAGCATTAGGGAGCTGTGGA	<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<9;;9<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:4:143:69:578	83	seq1	36	98	35M	=	185	184	GTACATGGCCCAGCATTAGGGAGCTGTGGACCCCG	===;=====48=844;=;+=5==*57,2+5&,5+5	MF:i:18	Aq:i:35	NM:i:2	UQ:i:38	H0:i:0	H1:i:1
+EAS114_32:5:78:583:499	147	seq1	37	74	35M	=	229	227	TCCATGGCCCAGCATTAGGGCGCTGTGGACCCTGC	<<8;<<<<<<1<<-1<+8<<&;:555;5-*77/51	MF:i:18	Aq:i:37	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS1_93:7:252:171:323	147	seq1	43	99	35M	=	234	226	GCCCAGCATTAGGGAGCTGTGGACCCTGCAGCCTG	<<<):<<<<<<<<<:<<<&5<<2<562<<<<-7--	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:106:316:452	83	seq1	49	99	36M	=	224	211	CATTAGGGAGCTGTGGACCCTGCAGCCTGGCTGTTG	;<<;<<<<;<;;;;7;<;<<<;<<;<<;4:<<;+&+	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_589:8:113:968:19	147	seq1	50	99	35M	=	219	204	ATTAGGGAGCTGTGGACCCTGCAGCCTGGCTGGGG	<<<<;<;<<<<<<:;;;.;;<75;);;;<.2+(;5	MF:i:18	Aq:i:63	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS54_65:3:321:311:983	83	seq1	51	99	35M	=	228	212	TTAGGGAGCTGTGGACCCTGCAGCCTGGCTGTGGG	<<<;<<<<<<<<+;;<47;<9;94430499<88+6	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:155:12:674	147	seq1	52	99	36M	=	224	208	TAGGGAGCTGTGGACCCTGCAGCCTGGCTGTGGGGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<+:9-<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:51:1429:1043	147	seq1	59	99	35M	=	209	185	CTGTGGACCCTGCAGCCTGGCTGTGGGGGGCGCCG	<<<<<<<<<<<<<:<<<;<<<<:):;<;;-15)+1	MF:i:18	Aq:i:68	NM:i:2	UQ:i:22	H0:i:1	H1:i:0
+B7_591:5:42:540:501	83	seq1	60	99	36M	=	224	200	TGTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTG	<<<<<<<<<<<<<<<<<<<<<<.;<<<<,804,858	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:223:142:410	83	seq1	60	99	35M	=	235	210	TGTGGACCCTGCAGCCTGGCTGGGGGGGGCGCAGT	<<<<<<<<<<<<<<:<5<<2<<(<:<<<:5,((7(	MF:i:18	Aq:i:39	NM:i:2	UQ:i:32	H0:i:0	H1:i:1
+EAS1_108:1:65:787:74	147	seq1	61	88	35M	=	213	187	GTGGACCCTGCAGCCTGGCTGGGGGGGGCACGGGG	<<<<<8-82<2823;-<;822222888,*(2%2-2	MF:i:18	Aq:i:21	NM:i:5	UQ:i:51	H0:i:0	H1:i:0
+EAS56_61:6:227:259:597	83	seq1	61	99	35M	=	248	222	GTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTG	<<<<<<<<<<;;<<<6;8:68333;<8(8,1,$$+	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:243:10:911	147	seq1	63	99	35M	=	236	208	GGACCCTGCAGCCTGGCTGTGGGGGCCGCTGTGGG	<<;<<<<<<<<<<7<<<<<7<<<<<:4<((<%;<+	MF:i:18	Aq:i:64	NM:i:2	UQ:i:22	H0:i:1	H1:i:0
+EAS221_1:2:90:986:1224	147	seq1	67	99	35M	=	267	235	CCTGCAGCCTGGCTGTGGGGGCCGCAGCGGGTGGG	<<:<<<<<<<<<<<<0<<<<<)<<63<+<<2'<-<	MF:i:18	Aq:i:41	NM:i:3	UQ:i:39	H0:i:0	H1:i:1
+EAS54_67:3:175:730:949	147	seq1	70	99	35M	=	230	195	GCAGCCTGGCTGTGGGGGCCGCAGTGGCTGAGGGG	<<<<<<<<<<8<;<<<<<0(<<;;,<<7<4%7626	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:76:493:708	83	seq1	73	44	35M	=	229	191	GCCTGGCTGTGGGGGCACCAGCCGCTGCGGGGGGT	<<<<1<<1<;626<;<''+;-'';+2'+;;)6--+	MF:i:-126	Aq:i:44	NM:i:5	UQ:i:34	H0:i:0	H1:i:0
+EAS1_97:7:20:979:96	147	seq1	79	99	35M	=	254	210	CTGTGGGGGCCGCAGTGGCTGAGGGGGGGAGGGGC	<<<<<<;<<<<<7<<,<<,:;,<<<<17)++':.'	MF:i:18	Aq:i:37	NM:i:4	UQ:i:43	H0:i:0	H1:i:1
+EAS114_26:3:284:261:124	147	seq1	79	99	35M	=	263	219	CTGTGGGGGCCGCAGTGGGTGAGGGGTGGAGGGGG	============'8====':=+====,=8,8'=++	MF:i:18	Aq:i:39	NM:i:5	UQ:i:64	H0:i:0	H1:i:1
+EAS221_1:2:29:1486:672	83	seq1	79	99	35M	=	256	212	CTGTGGGGGCCGCAGTGGCTGAGGGGTGCAGAGCC	<<<<<<<<<<<<<;<;<<<<<;<<<<8;;;<8;-;	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:218:877:489	147	seq1	80	10	35M	=	250	205	TGTGGGGGCCGCAGTGGCTGGGGGGGGGCGGGCGG	<<<<<<<;<<<07640<2<9(<9<<&9%(<(6%%3	MF:i:18	Aq:i:10	NM:i:6	UQ:i:34	H0:i:0	H1:i:0
+EAS51_64:7:242:862:732	73	seq1	95	66	35M	=	95	0	GGCTGAGGGGTGCAGAGCCGAGTCACGGGGTTGCC	<<<<<<<<<<<<<<<;<<<:<;+<3<::3<';:';	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:242:862:732	133	seq1	95	0	*	=	95	0	GGGTCTATGTGAACAAAGGCACTAAACACAGCTGT	<<<<<<<<<<8<<<<<78<<<378<<<77755++2	MF:i:-64
+EAS56_57:6:190:289:82	69	seq1	100	0	*	=	100	0	CTCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA	<<<7<<<;<<<<<<<<8;;<7;4<;<;;;;;94<;	MF:i:-64
+EAS56_57:6:190:289:82	137	seq1	100	73	35M	=	100	0	AGGGGTGCAGAGCCGAGTCACGGGGTTGCCAGCAC	<<<<<<;<<<<<<<<<<;<<;<<<<;8<6;9;;2;	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:190:727:308	83	seq1	103	99	35M	=	263	195	GGTGCAGAGCCGAGTCACGGGGTTGCCAGCACAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<::<<<844	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:141:80:875	83	seq1	110	99	35M	=	265	190	AGCCGAGTCACGGGGTTGCCAGCACAGGGGCTTAA	<<<<<<<<<<<<<<<<<<<<<<:<<8;<<8+7;-7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:40:1128:1940	147	seq1	112	99	35M	=	291	214	CCGAGTCACGGGGTTGCCAGCACAGGGGCTTAACC	<<<<<<<<<<<<<<<<<<<;<<5;;<<<9;;;;7:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:290:319:736	69	seq1	113	0	*	=	113	0	GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC	<<<<<<:7:<.<<<<7<<.<.<<.9*<4<:<4%74	MF:i:-64
+EAS51_62:5:290:319:736	137	seq1	113	73	35M	=	113	0	CGAGTCACGGGGTTGCCAGCACAGGGGCTTAACCT	==;=======7====6=;==:;;====66=::27:	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:132:493:921	69	seq1	119	0	*	=	119	0	GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC	<<<<<<<<<<<<<<<<<<<;<<<<77;0<;;6777	MF:i:-64
+B7_597:2:132:493:921	137	seq1	119	75	35M	=	119	0	ACGGGGTTGCCAGCACAGGGGCTTAACCTCTGGTG	<<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;;88:	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:283:799:560	147	seq1	121	66	35M	=	283	197	GGGGTTGCCAGCACAGGGGCTTAACCTCTGGTGAC	<<<<+<<<<8<<<+<<<<<;<<:07;8;7402447	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:1:225:195:543	83	seq1	123	99	35M	=	299	211	GGTTGCCAGCACAGGGGCTTAACCTCTGGTGACTG	<<<<<<<<<<<<<<<<<<<<<<<9<<;::388998	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:114:714:317	83	seq1	126	99	35M	=	311	220	TGCCAGCACAGGGGCTTAACCTCTGGTGACTGCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5;<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:70:147:84	147	seq1	128	73	35M	=	285	192	CCAGCACAGGGGCTTAACCTCTGGTGACTGCCAGA	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;(5<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:187:227:818	147	seq1	129	99	35M	=	290	196	CAGCACAGGGGCTTAACCTCTGGTGACTGCCAGAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<;<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:77:29:126	83	seq1	131	99	35M	=	315	219	GCACAGGGGCTTAACCTCTGGTGACTGCCAGAGCT	<<<<<<<<<<3<<<<<<<;;;7<;<<449<-:977	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:327:795:103	83	seq1	133	99	35M	=	302	204	ACAGGGGCTTAACCTCTGGTGACTGCCAGAGCTGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:139:117:262	69	seq1	135	0	*	=	135	0	GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC	<<<7<<<<<<<<<<<<<<<<<<<;<;<<<<<37;3	MF:i:-64
+EAS114_30:3:139:117:262	137	seq1	135	76	35M	=	135	0	AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG	<<<<;<<<<<<<<<<<<<:<<<<<:<<8<<<<:<:	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:29:817:854	73	seq1	135	77	35M	=	135	0	AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:29:817:854	133	seq1	135	0	*	=	135	0	GTTCTCAAGGTTGTTGCAAGGGGGTTTATGTGAAC	<<<<<<<<<<<<<<<1..;:;;;;1%407)07&7.	MF:i:-64
+EAS192_3:6:170:169:57	147	seq1	138	99	35M	=	296	193	GGCTTGACCTCTGGTGACTGCCAGAGCTGCTGGCC	<<<<<;<<<<<<;<<<<<<<<<<<<:<<<<<;;+%	MF:i:18	Aq:i:45	NM:i:2	UQ:i:30	H0:i:0	H1:i:1
+B7_595:4:84:802:737	83	seq1	140	68	35M	=	284	179	CTTAACCTCTGGTGACTGCCAGAGCTGCTGGCAAG	<<<<<<<<<<;9<9<<<;<<;73;<<<<<37;1+.	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:78:583:670	147	seq1	142	99	35M	=	316	209	TAACCTCTGGTGACTGCCAGAGCTGCTGGCAAGCT	<<<<<<<<<<;;;<;;<<<:7;5;<5;;<2--8-;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:90:435:691	83	seq1	147	99	35M	=	318	206	TCTGGTGACTGCCAGAGCTGCTGGCAAGCTAGAGT	<<<<<<<<<<;<<<;<<<<:<<<;<81;<<1;784	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:13:122:187	147	seq1	153	99	35M	=	343	225	GACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCCTT	<<<<<<<;<;<<<;<<<<:;6<<<<;;;;:<<%%<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS221_1:6:69:735:1915	83	seq1	154	99	35M	=	321	202	ACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCATTT	<<<<<<<<;<<<<<<<<<;<<<<;<8<<<<;1:<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:66:959:1311	147	seq1	159	95	35M	=	336	212	CAGAGCTGCTGGCAAGCTAGAGGCCCATCTGGAGC	;;4;;;+;;;-01;;&-;;4;;&;;73)(&**274	MF:i:18	Aq:i:31	NM:i:2	UQ:i:12	H0:i:0	H1:i:1
+EAS56_57:6:325:759:288	83	seq1	163	99	35M	=	341	213	GCTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCT	8<;<<<<81<<<<<;<<;<<<;9</;6;;809034	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:82:926:112	83	seq1	164	99	35M	=	328	199	CTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTC	<;<<<<<<<<<5<<<<<<<<<<<<<<<;<<1:<4<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:324:728:956	83	seq1	165	99	35M	=	322	192	TGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCT	<<<<<<<<<<<<<<<<<<<<8<<<:<::;;;;<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:294:525:849	147	seq1	167	99	35M	=	340	208	CTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCTAA	<<<<<<<<<<<<<<<<<<<<<<9+<:<<<<9;;15	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:159:125:297	147	seq1	170	99	35M	=	337	202	GCAAGCTAGAGTCCCATTTGGAGCCACTCTAAGAC	<<<<<<<<<<<<<<;<<<;<;<<6;)<:9;26;39	MF:i:18	Aq:i:43	NM:i:2	UQ:i:26	H0:i:0	H1:i:1
+EAS54_65:6:164:797:930	83	seq1	173	99	35M	=	332	194	AGCTAGAGACCCATTTGGAGCCCCTCTAAGCCGTT	<<<<<<<<<<<<<<<;;;:<<<<<;<;<<<<<,::	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_81:7:293:355:321	147	seq1	174	99	35M	=	356	217	GCTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTC	<<<:<;<<<<<<<;<<<<<<<<<;<<;4<<<:+:<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:1:209:653:400	147	seq1	175	99	35M	=	340	200	CTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCT	<;<9<<+<2<9<,;;64;<<<<;8<00*1<48:+8	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:62:1109:804	147	seq1	176	99	35M	=	350	209	TAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCTA	<<<<<<<<<<<<<:<<:<<<<<<:<:<<<<;;;;;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:303:402:142	147	seq1	181	99	35M	=	343	197	TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT	<8<<<<<<<<<<<<<<<<<<<<<<<46<648;;';	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:321:642:388	147	seq1	181	99	35M	=	357	209	TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<8;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:1:1140:1206	147	seq1	181	99	35M	=	368	222	TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT	;;;;;;;;;;;;;:9;;7;;:;:;97;:;:88888	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:155:68:326	83	seq1	182	99	36M	=	332	186	CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:19:886:279	83	seq1	182	99	35M	=	337	190	CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTA	<9<<<<<<<<<<<<6<28:<<85<<<<<2<;<9<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:4:143:69:578	147	seq1	185	98	35M	=	36	-184	ATTGGGAGCCCCTCTAAGCCGTTCTATTTGTAATG	222&<21<<<<12<7<01<<<<<0<<<<<<<20<<	MF:i:18	Aq:i:35	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_71:4:13:981:659	149	seq1	187	0	*	=	188	35	CGGGACAATGGACGAGGTAAACCGCACATTGACAA	+)---3&&3&--+0)&+3:7777).333:<06<<<	MF:i:-64
+EAS54_71:4:13:981:659	89	seq1	188	37	34M	=	187	-35	TGTAGCCCCTCTAAGGCGTTCTATTTGTAATGAA	()&)06636;;<664*6;<<<<<<<<<<<<<<<1	MF:i:64	Aq:i:0	NM:i:2	UQ:i:14	H0:i:0	H1:i:1
+B7_610:1:37:652:403	147	seq1	193	99	35M	=	347	189	CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT	<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:1:282:274:50	147	seq1	193	99	35M	=	371	213	CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT	<<<<<<<<<<<<<<<<<;<<<<<99<9<5909;5;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:133:460:542	83	seq1	195	99	36M	=	356	197	CCTATAAGCCGTTCTATTTGTAATGAAAACTATATT	<<<<<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_73:5:44:498:945	83	seq1	195	82	35M	=	377	217	CCTATAAGCCGTTCTATTTGTAATGAAAACTATAT	;<;<<<<<<<<<<9<;<:<<<<<<:<<<<;:;<3<	MF:i:18	Aq:i:37	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_610:1:139:152:856	83	seq1	198	99	35M	=	392	229	CTAAGCCGTTCTATTTGTAATGAAAACTATATTTA	<<<<<<<<;<<<<<<<<<<;<;<<<;<<<<;<;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:323:639:311	147	seq1	200	99	36M	=	357	193	AAGCCGTTCTATTTGTAATGAAAACTATATTTAGGC	<<<<<<<<<<<<<<<<<<<2<<<<<<;<<<<<<81<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:23	H0:i:1	H1:i:0
+EAS114_39:2:18:967:582	147	seq1	200	99	35M	=	398	233	AAGCCGTTCTATTTGTAATGAAAACTATATTTATG	<<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<<<8	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:186:850:838	83	seq1	205	99	35M	=	389	219	GTTCTATTTGTAATGAAAACTATATTTATGCTATT	<<<<<;<<<<<<<<<<<:<<<<<;<<<;</<<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:126:558:408	147	seq1	206	99	35M	=	368	197	TTCTATTTGTAATGAAAACTATATTTATGCTATTC	<<<<<<<<<<<<<:<<<<<<<<<<<<<<7<;<<;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:157:643:175	147	seq1	206	99	35M	=	380	209	TTCTATTTGTAATGAAAACTATATTTATGCTATTC	<<<<<<<<;<<<<<<<<<<<<<<<<<<<)<<<<;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:141:711:813	83	seq1	209	99	35M	=	370	196	TATTTGTAATGAAAACTATATTTATGCTATTCAGT	<<<<<<<<<<;<<<<<<<<<<<<<<;<<<<<<:+<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:115:538:276	147	seq1	209	99	35M	=	360	186	TATTTGTAATGAAAACTATATTTATGCTATTCAGT	<<<<<<<<;<<<;;<<<;<:<<<:<<<<<<;;;7;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:51:1429:1043	83	seq1	209	99	35M	=	59	-185	TATTTGTAATGAAAACTATATTTATGCTATTCAGT	9<5<<<<<<<<<<<<<9<<<9<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:176:168:513	147	seq1	210	99	35M	=	410	235	ATTTGTAATGAAAACTATATTTATGCTATTCAGTT	<<<<;<<<<<<<<<<<<<<<<<<<:&<<<<:;0;;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:282:817:710	83	seq1	211	99	35M	=	384	208	TTTGTAATGAAAACTATATTTATGCTATTCAGTTC	<<<<<<<<<<<<<<<<<<<<<<<;:<<<<:8,<<8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:65:787:74	83	seq1	213	88	35M	=	61	-187	TGTAATGAAAACTATATTTATGCTATTCAGTTCTA	44848=:1661/66==?:<=:?6><<<<1>><<<<	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:240:264:231	89	seq1	213	66	35M	=	213	-35	TGTAATGAAAACTATATTTATGCTATTCAGTTCTA	9;,;;62<9<)29<<<;96<<<;<<7<<<<<<;<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:240:264:231	149	seq1	213	0	*	=	213	35	CAACAGATCAAGAAGGAGGGGCAATGGACGAGTTA	%15+5022))0&<<)0)+7:4+&<0<<:0<<<7<<	MF:i:-64
+EAS1_93:7:14:426:613	83	seq1	214	99	35M	=	379	200	GTAATGAAAACTATATTTATGCTATTCAGTTCTAA	======;=;==========;;==3=;==-=<;<;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:173:995:93	147	seq1	215	99	35M	=	382	202	TAATGAAAACTATATTTATGCTATTCAGTTCTAAA	<<<<<<<<<<<<<<<<<<<7:<<<<;:<:<<<<:7	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:195:348:703	147	seq1	215	99	35M	=	353	173	TAATGAAAACTATATTTATGCTATTCAGTTCTAAA	<<<<<<<;<<<<<;:<<<<<<<<<<<<:<1:<:7<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:62:879:264	147	seq1	216	99	35M	=	396	215	AATGAAAACTATATTTATGCTATTCAGTTCTAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:4:83:452:970	83	seq1	216	99	35M	=	379	198	AATGAAAACTATATTTATGCTATTCAGTTCTAAAT	==========================;========	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:64:1318:1711	83	seq1	218	99	35M	=	389	206	TGAAAACTATATTTATGCTATTCAGTTCTAAATAT	<<<<<<<<<<<<<<<<7<<<<<<<:<<<<<2<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:113:968:19	83	seq1	219	99	35M	=	50	-204	GAAAACTATATTTATGCTATTCAGTTCTAAATATA	8;<;8;9<<<<<<<9<:<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:160:896:275	147	seq1	220	99	35M	=	387	202	AAAACTATATTTATGCTATTCAGTTCTAAATATAG	============<====<==<====<==<==;=:6	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:181:191:418	147	seq1	221	99	36M	=	387	202	AAACTATATTTATGCTATTCAGTTCTAAATATAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<988	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:242:354:637	83	seq1	222	99	36M	=	417	231	AACTATATTTATGCTATTCAGTTCTAAATATAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<6<;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:122:77:789	147	seq1	223	99	35M	=	396	208	ACTATATTTATGCTATTCAGTTCTAAATATAGAAA	<<<:<4<<9<:7<<<:<<<7<<<<<<<<<<9<9<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:42:540:501	147	seq1	224	99	36M	=	60	-200	CTATATTTATGCTATTCAGTTCTAAATATAGAAATT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:155:12:674	83	seq1	224	99	36M	=	52	-208	CTATATTTATGCTATTCAGTTCTAAATATAGAAATT	;<<<<<<<<<<;<<<<;<<<<8<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:106:316:452	147	seq1	224	99	36M	=	49	-211	CTATATTTATGCTATTCAGTTCTAAATATAGAAATT	:<<<<<;<<<<:<<:<<<<<<7<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:89:525:113	147	seq1	227	78	40M	=	397	210	TATTTATGCTATTCAGTTATAAATATAGAAATTGAAACAG	<1<7<6;+0;7;7'<70;-<7<:<:<<5<<:9<5:7:%:7	MF:i:18	Aq:i:39	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS54_65:3:321:311:983	147	seq1	228	99	35M	=	51	-212	ATTTATGCTATTCAGTTCTAAATATAGAAATTGAA	;;4;;<7<<<<<<77<<<<<<<<<<17<<<<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:76:493:708	147	seq1	229	44	35M	=	73	-191	TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA	5/)63.&1517(544(055(0454&7706566679	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:125:628:79	147	seq1	229	99	35M	=	400	205	TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA	==================<6<====<<:<==7;::	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:78:583:499	83	seq1	229	74	35M	=	37	-227	TTTACGCTATTCAGTACTAAATATAGAAATTGAAA	&6&9774&<;67<44&-4<;<9<7<<<<<;<<<<<	MF:i:18	Aq:i:37	NM:i:2	UQ:i:27	H0:i:0	H1:i:1
+EAS54_67:3:175:730:949	83	seq1	230	99	35M	=	70	-195	TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC	<<<<;+<<<<7<;<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:84:275:1572	147	seq1	230	99	35M	=	394	199	TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC	/6;;;4;;;;;;;;7;;4;.4;;;;;6;;;77077	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:248:753:731	83	seq1	231	99	35M	=	402	206	TATGCTATTCAGTTCTAAATATAGAAATTGAAACA	<<<<<<<<<<<8<<<<<<<<<<<<:<<<<&<:<.:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:9:1289:215	83	seq1	231	99	35M	=	394	198	TATGCTATTCAGTTCTAAATATAGAAATTGAAACA	;;;;;;9;;;67;;;;;99;9;;;;;;;;977747	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:188:802:71	147	seq1	232	99	35M	=	415	218	ATGCTATTCAGTTCTAAATATAGAAATTGAAACAG	<<<<<<<<<;<<<<<9<<<:<<<:<<<<<<:<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:7:252:171:323	83	seq1	234	99	35M	=	43	-226	GCTATTCAGTTCTAAATATAGAAATTGAAACAGCT	;8<;<=3=6==:====;;======;==========	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:223:142:410	147	seq1	235	99	35M	=	60	-210	CTATTCAGTTCTAAATATAGAAATTGAAACAGCTG	8;<<<;<<<<;<<<<<<;<;<<<<<<<<<<<<;<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:243:10:911	83	seq1	236	99	35M	=	63	-208	TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT	;<;;;<4;9:<<<;<<;<<<<<;;<<<<<<<<<<<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:5:730:1436	147	seq1	236	99	35M	=	403	202	TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT	;;;;;;;;;;;;;;;;;;8;;;;;8;;;;;67777	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:57:1672:1890	89	seq1	236	75	40M	=	236	-40	TATTCAGTTCTAAATATAGAAATTGAAACAGCTGTGTTTA	:;;;9<8;;*<<<<<<:<<<<<<<<1:<<<<<<<<<<<7<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:57:1672:1890	149	seq1	236	0	*	=	236	40	CCCCCCCCCCCCCCCCCAGCCACTGCGGCCCCCCCAGCCA	-+)%)'-'+,,<066,))090+:&486083:5&&:<<5<0	MF:i:-64
+EAS1_105:2:299:360:220	83	seq1	237	99	35M	=	403	201	ATTCAGTTCTAAATATAGAAATTGAAACAGCTGTG	<<<<<<<9<9<<<<<<<<<<<<<<<<<5<;<0<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:24:1037:84	147	seq1	238	99	35M	=	415	212	TTCAGTTCTAAATATAGAAATTGAAACAGCTGTGT	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<;:<57<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:86:823:683	147	seq1	240	99	35M	=	408	203	CAGTTCTAAATATAGAAATTGAAACAGCTGTGTTT	<<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;9<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:130:568:978	83	seq1	246	88	35M	=	434	223	TAAATATAGAAATTGAAACAGCTGTGTTTAGTGAC	7<<;<<;<7<:;<7<<<<<<<<);4;+<7+3+%;<	MF:i:18	Aq:i:24	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS114_45:4:73:1208:495	147	seq1	246	99	35M	=	431	220	TAAATATAGAAATTGAAACAGCTGTGTTTAGTGCC	;;;;;;;;;;;;;;;;;;;;;;;;5;;;;;37377	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:264:642:506	83	seq1	247	99	35M	=	420	208	AAATATAGAAATTGAAACAGCTGTGTTTATTGTAT	<<;<<<<<<;<<<;:;;:;;<<;<<<<;*+;*&.4	MF:i:18	Aq:i:56	NM:i:3	UQ:i:28	H0:i:1	H1:i:0
+EAS114_28:5:104:350:749	147	seq1	247	99	36M	=	415	204	AAATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT	<<8<<<<<<<<<<<;<<<<<<<<0;<<<9;<85;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:227:259:597	147	seq1	248	99	35M	=	61	-222	AATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT	<8<;2;9;<;;-92<;;;<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:113:809:364	83	seq1	250	99	35M	=	413	198	TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<7<;<;<<<4	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:218:877:489	83	seq1	250	86	35M	=	80	-205	TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG	9<<<8<<<;<9<<<<<<<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:20:979:96	83	seq1	254	99	35M	=	79	-210	GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA	'9996;(:;-<;1<<<<=<<<<=<<<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:259:219:114	83	seq1	254	99	35M	=	411	192	GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA	<<<<<<<<<<<<<<<;<<<<<<7<7<<<<<0<<9<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:13:1034:1144	83	seq1	256	99	35M	=	429	208	AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA	<<<<<<<<<<<<<<<<<<<<<<<<3<<<;<<;<++	MF:i:18	Aq:i:69	NM:i:2	UQ:i:48	H0:i:1	H1:i:0
+EAS221_1:2:29:1486:672	147	seq1	256	99	35M	=	79	-212	AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA	<<:<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<++	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS139_11:7:46:695:738	147	seq1	259	74	35M	=	428	204	TGAAACAGCTGAGTTTAGCGCCTGTGTTCACATAG	<;<<<<;<<),&4<3<<7&7<0;)).3;79;7<;0	MF:i:-126	Aq:i:74	NM:i:3	UQ:i:18	H0:i:0	H1:i:0
+EAS139_11:8:26:1221:222	147	seq1	261	99	35M	=	446	220	AAACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:190:727:308	147	seq1	263	99	35M	=	103	-195	ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG	;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:284:261:124	83	seq1	263	99	35M	=	79	-219	ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG	===27===.====&===========;;========	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:141:80:875	147	seq1	265	99	35M	=	110	-190	AGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCA	6/<;84<;<;<<<<<<5<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:24:1135:563	147	seq1	266	99	40M	=	446	220	GCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAACC	<<<<:<<<<:1:<<<<<<.<<<<<<<<;<;;;43+:30::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:90:986:1224	83	seq1	267	99	35M	=	67	-235	CTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAAC	<7*37;;;;;;;9<<;<7<<<<<<<<<<<;;<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:287:492:169	83	seq1	269	99	36M	=	449	216	GTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAAC	<<<7<<<<<<<<<<<<<<<<<<<<<<<8;;<;6<<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:48:9:409	83	seq1	271	75	18M5I12M	=	464	228	GTTTAGTGCCTTTGTTCACATAGACCCCCTTGCAA	<<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS139_19:1:87:1222:878	147	seq1	272	10	40M	=	435	203	TATAGGGCCTTTGTTCAAACCCCTTGCAACAACCTTGAGA	&+6<6&<:<<9<1112<<;)9227</);;;2-79;)/769	MF:i:18	Aq:i:10	NM:i:3	UQ:i:41	H0:i:0	H1:i:0
+B7_591:7:200:192:373	147	seq1	275	75	14M5I17M	=	451	212	AGTGCCTTTGTTCACATAGACCCCCTTGCAACAACC	<<<<<<<<<<<<<<<<<<<<<<<<<:<:<;5<<;<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_65:1:163:846:223	147	seq1	278	74	11M5I19M	=	463	220	GCCTTTGTTCACATAGACCCCCTTGCAACAACCTT	<<<<;<<;4<<<;;9<<<<<+<<;<</27;;47;.	MF:i:-126	Aq:i:74	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:7:283:799:560	83	seq1	283	66	35M	=	121	-197	ACATAGACCCCCTTGCAACAACCTTGAGAACCCCA	<4<6<8;;6<<<+;<:<<;<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:66	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+B7_595:4:84:802:737	147	seq1	284	68	35M	=	140	-179	CATAGACCCCCTTGCAACAACCTTGAGAACCCCAG	+<1<-;69;;;;8;:<<6<;<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:68	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS51_66:5:308:400:602	147	seq1	285	71	35M	=	470	220	ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG	;<<<<<<<<<<<<<<<<<<<<<<<<;;;<<;<;76	MF:i:-126	Aq:i:71	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS54_81:2:285:367:932	147	seq1	285	74	35M	=	440	190	ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG	===========;======;=====;=======5==	MF:i:-126	Aq:i:74	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_39:1:70:147:84	83	seq1	285	73	35M	=	128	-192	ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG	<<<:<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<;	MF:i:-126	Aq:i:73	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS51_62:3:314:386:190	83	seq1	287	98	35M	=	459	207	AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA	++<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<<<	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS56_65:1:53:272:944	83	seq1	287	99	35M	=	447	195	CAACCCCCTTGCAACAACCTTGCGAACCCCAGGGA	<<<<<<<<<<<<.7<.<<<<<<-<-<<<<<&<222	MF:i:18	Aq:i:41	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS188_7:5:112:51:128	147	seq1	287	99	35M	=	477	225	AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA	++<<<<<<<<<<<<<5<<<<<<<<<<<<<<;<;<6	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS56_57:6:44:280:641	147	seq1	288	99	35M	=	454	201	AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA	;<<<<<<<<<<66<;<<<<<;<<2;;;<<;;;;,;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:75:946:1035	83	seq1	288	99	35M	=	480	227	AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA	<<<<<<<<<<;<<<;<<<<<<<8;<6<<<<44<:4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:187:227:818	83	seq1	290	99	35M	=	129	-196	CCCCCTTGCAACAACCTTGAGAACCCCAGGGAATT	<<9<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:40:1128:1940	83	seq1	291	99	35M	=	112	-214	CCCCTTACAACAACCTTGAGAACCCCAGGGAATTT	<<<:///77:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:14	H0:i:1	H1:i:0
+EAS54_71:4:72:63:435	83	seq1	293	99	34M	=	490	232	CCTTGCAACAACCTTGAGAACCCCAGGGAATTTG	<<<<<<<<<<<<<<<<<<<<;<<<;<;;39:7:7	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:271:244:568	83	seq1	294	99	35M	=	481	222	CTTGCAACAACCTTGAGAACCCCAGGGAATTTGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:82:902:868	83	seq1	295	99	35M	=	471	211	TTGCAACAACCTTGAGAACCCCAGGGAATTTGTCA	<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:313:83:546	147	seq1	296	99	35M	=	454	193	TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA	<<<<<<<<<<;<<<<<<<<<<<<<<4<<<:<;<<9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:57:786:414	147	seq1	296	99	35M	=	453	192	TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA	<<<<<<<<<<<<<<<<<<<<<<<:<<:<<:;;7<7	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:260:985:520	147	seq1	296	99	35M	=	468	207	TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA	<<<<<<<<<<<<<<<<<;:;<<;<:<<<,:1;)<;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:170:169:57	83	seq1	296	99	35M	=	138	-193	TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA	778<:<<<9<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:199:327:965	147	seq1	297	91	35M	=	494	232	NCAACAACCTTGAGAACCCCAGGGAATTTGTCAAT	!,+*+++++++++++*+++++++**)+*+**+(**	MF:i:18	Aq:i:19	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+B7_610:5:147:68:353	147	seq1	299	99	35M	=	486	222	AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT	<;<;<<7<<<<<<<7<<;;<7<4<8<<<8.;4;;;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:1:225:195:543	147	seq1	299	99	35M	=	123	-211	AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT	;;8;;+;(<<<<<<<<7;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:303:184:14	147	seq1	301	99	35M	=	479	213	CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA	<<<<<<8<0<<<<-<-98<<--<<<6;076;75+&	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:326:309:149	147	seq1	301	99	35M	=	467	201	CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA	<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<;;;;:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:327:795:103	147	seq1	302	99	35M	=	133	-204	AACCTTGAGAACCCCAGGGAATTTGTCAATGTCAG	;::;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:110:355:323	83	seq1	303	99	35M	=	477	209	ACCTTGAGAACCCCAGGGAATTTGTCAATGTCAGG	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<;;<<8;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:18:1418:237	83	seq1	304	99	35M	=	503	234	CCTTGAGAACCCCAGGGAATTTGTCAATGTCAGGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<7<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:112:203:90	147	seq1	305	99	35M	=	470	200	CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA	<<:<<<<<<<<.<<<<<<<<<<<<6<:867<8884	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:319:246:304	83	seq1	305	99	35M	=	472	202	CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:114:714:317	147	seq1	311	99	35M	=	126	-220	AACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGC	;8<;:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:5:327:991:508	83	seq1	312	99	35M	=	495	218	ACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGCA	<<<<<<<<<<<<<<<<<<<<<;<;:<7:47;:75;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:77:29:126	147	seq1	315	99	35M	=	131	-219	ACAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT	()9;;<<<<<<<<<<5<<<7<<<<<<;<<<;7<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS219_1:1:37:1004:1136	83	seq1	315	99	35M	=	473	193	CCAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT	<<<<<<<<<<<<<<;<<<;<<<<<:<<;;369<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:78:583:670	83	seq1	316	99	35M	=	142	-209	CAGGGAATTTGTCAATGTCAGGGAAGGAGCATTTT	8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:90:435:691	147	seq1	318	99	35M	=	147	-206	GGGAATTTGTCAATGTCAGGGAAGGAGCATTTTGT	;;<;;;+<<:<<<:<;;<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:69:735:1915	147	seq1	321	99	35M	=	154	-202	AATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAG	<<::<<<7<<<<7<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:324:728:956	147	seq1	322	99	35M	=	165	-192	ATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAGT	<;;;;5;<<0<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:269:280:716	83	seq1	323	99	35M	=	490	202	TTTGTCAATGTCAGGGAAGGAGCATTTTTTCAGTT	<<<<<<<<<2<<:2:1<<7/2/:3<<<<*<3($<<	MF:i:18	Aq:i:58	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+EAS54_73:3:88:24:744	147	seq1	325	84	35M	=	484	194	TGTCAATGTCAGGGAAGGAGCATTTTTGAAGTTTA	<7*:<<::.'<<<<:<<:<<'<63'6+'303*%%+	MF:i:18	Aq:i:21	NM:i:5	UQ:i:53	H0:i:0	H1:i:0
+EAS1_108:7:82:926:112	147	seq1	328	99	35M	=	164	-199	CAATGTCAGGGAAGGAGCATTTTGTCAGTTGCCAA	<1:/<*6<<6<<<<<6<<<<<<4<<<<82<+<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS56_63:7:185:213:330	147	seq1	328	99	35M	=	502	209	CAATGTCAGGGAAGGAGCATTTTGTCAGTTACCAA	<<<<<<<<<;<<;<<<<<;<<<<;;;<<;<<;<38	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:277:458:330	147	seq1	329	99	36M	=	490	197	AATGTCAGGGAAGGAGCCTTTTGTCAGTTACCAAAT	<<7<<<<<<<<<2<<<%,<6<&<<,<<<<:<<<<(7	MF:i:18	Aq:i:41	NM:i:1	UQ:i:11	H0:i:0	H1:i:1
+B7_595:1:81:1000:375	147	seq1	329	90	35M	=	524	230	NATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAA	!.............................+.(+.	MF:i:18	Aq:i:19	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS220_1:8:33:672:473	83	seq1	330	99	35M	=	515	220	ATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAAT	<<<<<<<<7<7<7<<62<<<<66<15*/99*5241	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:164:797:930	147	seq1	332	99	35M	=	173	-194	GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGT	;;:;8<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:155:68:326	147	seq1	332	99	36M	=	182	-186	GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGTG	;<<<:6<<<<<<6<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:202:39:380	83	seq1	334	99	35M	=	513	214	CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT	<<<<<<<<<<<<<<<<<;<<:;<<18<84:<&<+<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:42:1091:1726	83	seq1	334	99	35M	=	502	203	CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT	<<<<<<<<<<<<<<<<<<<<<<8<<<<<<8:<.<:	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:66:959:1311	83	seq1	336	95	35M	=	159	-212	GGGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT	67.68:4::6;;;7:6:;:5;8;;<<:;;<;;;;<	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:200:559:765	83	seq1	337	99	36M	=	521	220	GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTAT	<<<<<<<<<<<<<<7<<<<<<;<<;;4<7<9;<<-;	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:328:669:662	83	seq1	337	99	34M	=	512	210	GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT	<<<<<<<<<<<<<<<<<<<<<<<<+9;<;;.<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:159:125:297	83	seq1	337	99	35M	=	170	-202	GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA	89<;;8<<;<;<4<;<8<<<<;;8<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:19:886:279	147	seq1	337	99	35M	=	182	-190	GAAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA	9%<2)2.2::<;<<<2<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:67	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+B7_595:1:209:653:400	83	seq1	340	99	35M	=	175	-200	AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA	<69<98<+<<6<<4<<<<</4<<:<4<<<<<<<<<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:294:525:849	83	seq1	340	99	35M	=	167	-208	AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA	;<;:;:<;<;<<<3<<<;<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:87:1375:1303	147	seq1	340	99	35M	=	529	224	AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA	<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:325:759:288	147	seq1	341	99	35M	=	163	-213	GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC	9;<9<;<;;<;<;<;<<<:<;<<<;<<<<<;<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:76:786:458	147	seq1	341	99	35M	=	502	196	GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC	<<.<<<<2<<:84<:<<<:<8<<)<)429<2<<8<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:210:880:606	147	seq1	341	99	35M	=	518	212	GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAT	<<<<<<<<<<<<<<<<<<;<<<<<<:<<<<3<<8&	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS192_3:3:257:611:440	83	seq1	341	99	35M	=	524	218	GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC	<<<<<<<<<<<<<<<<<<<<8<<<<;<<<<8<<+5	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:303:402:142	83	seq1	343	99	35M	=	181	-197	AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA	;;;;;<9<<8;<<<<7<<;<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:13:122:187	83	seq1	343	99	35M	=	153	-225	AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA	<<&<;;<<<;7<<<<;<;<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:80:885:513	147	seq1	344	99	35M	=	507	198	GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG	<<<<<<<<<<<<<<<<<<<:<<<<2:<;<<75<7;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:90:1873:89	83	seq1	344	99	35M	=	531	222	GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<7<<<7	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:1:37:652:403	83	seq1	347	99	35M	=	193	-189	TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG	<;<<<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:8:28:701:724	147	seq1	347	99	35M	=	521	209	TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG	<<<<<<7<<<<<<7::<:<<-<<::::::<747::	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:66:655:769	83	seq1	348	99	35M	=	515	202	TTTGTCAGTTACCAAATGTGTTTATTACCAGAGGG	8;<<<<<8<<<<<;<<<7<;<<<<<;<7<27<;;7	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:231:339:551	147	seq1	350	99	35M	=	527	212	TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT	<<<<<<;<<<<<<;<<<<<<<<<<;5<<46;<;:1	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:129:694:359	147	seq1	350	88	35M	=	525	210	TGTCAGTTACCAAATGTGTTTATTACCCGAGGGAT	============+7=======:==;;;'=;==7;=	MF:i:18	Aq:i:43	NM:i:1	UQ:i:6	H0:i:0	H1:i:1
+EAS220_1:2:62:1109:804	83	seq1	350	99	35M	=	176	-209	TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT	<<<<<:<<<::<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:157:935:374	83	seq1	353	99	35M	=	512	194	CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA	<<<<<<<<<<;<<;;<<<<<<<<<::8'5++;+11	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:103:111:720	83	seq1	353	99	36M	=	512	195	CAGTTACCAAATGTGTTTATTACCAGAGGGATGGAG	<<<<<<<<<<<<<<<<<<<<<<<<<5<<<5;<5<:;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:311:100:539	147	seq1	353	99	35M	=	508	190	CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA	<<<<;<<<<;<<<<<;<<<<<<<<<:<::;7;<0;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:195:348:703	83	seq1	353	99	35M	=	215	-173	CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA	<9<<9</<<<<<<<<<<<<<<2<8<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:72:308:839	147	seq1	354	99	40M	=	517	203	AGTTACCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG	<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<99494416:	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:133:460:542	147	seq1	356	99	36M	=	195	-197	TTACCAAATGTGTTTATTACCAGAGGGATGGAGGGA	;:;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:293:355:321	83	seq1	356	99	35M	=	174	-217	TTACCAAATGTGTTTATTACCAGAGGGATGGAGGG	<<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:323:639:311	83	seq1	357	99	36M	=	200	-193	TACCAAATGTGTTTATTACCAGAGGGATGGAGGGAA	-94<<<<<<<4<<<<<<<<2<<<<<7<<<-<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:321:642:388	83	seq1	357	99	33M	=	181	-209	TACCAAATGTGTTTATTACCAGAGGGATGGAGG	19<<<<<8<<<<<<<<;<<<<<<<<<<7<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:4:262:456:74	83	seq1	357	99	35M	=	504	182	TACCAAATGTGTTTATTACCAGAGGGATGGAGGGA	<<<<<<<<<<<<<<<<<<<<:;;:;7:<::7<7:3	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:8:95:426:791	83	seq1	359	99	35M	=	547	223	CCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG	<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<,<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:115:538:276	83	seq1	360	99	35M	=	209	-186	CAAATGTGTTTATTACCAGAGGGATGGAGGGAAGA	:<<<<<<<<;;<5<<;<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:196:533:921	83	seq1	361	99	35M	=	526	200	AAATGTGTTTATTACCAGAGGGATGGAGGGAAGAG	=====1========8===:===7======971=3=	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:121:380:656	83	seq1	362	99	35M	=	542	215	AATGTGTTTATTACCAGAGGGATGGAGGGAAGAGG	<<<<<<<<<<<<<<<<<<<<<<<<:<:<<83<:<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:34:970:1374	83	seq1	363	99	35M	=	520	192	ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG	<<<<<<<<<<<<<<;7<77;<<;<;;9;;:86:::	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:29:1061:574	147	seq1	363	99	35M	=	563	235	ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG	<<<<<<<<<<<<<<<<<<;<<<<<<;<<8<:<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:124:243:35	83	seq1	364	60	35M	=	544	215	TGTGTTTATTACCAGAGGGATGGAGGGAAGAGCGA	<<<<<;;<<<<<<:<<<.<<<:++5+:1(;1;$<(	MF:i:18	Aq:i:60	NM:i:1	UQ:i:3	H0:i:1	H1:i:0
+EAS114_30:2:272:750:698	147	seq1	365	80	35M	=	538	208	GTGTTTATTACCAGAGGGATGGAGGGATGACGGAC	<)<<<<<7;<<<4<;7<<<<78068:(%<3*861,	MF:i:18	Aq:i:37	NM:i:2	UQ:i:13	H0:i:0	H1:i:1
+EAS56_53:3:126:558:408	83	seq1	368	99	35M	=	206	-197	TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT	<:<<:;;<<<<<<<<8<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:1:1140:1206	83	seq1	368	99	35M	=	181	-222	TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT	77977::99;;;:;;<;;;:;;;<<;<;;;;<;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:141:711:813	147	seq1	370	99	35M	=	209	-196	TATTACCAGAGGGATGGAGGGAAGAGGGACGCTGA	=<5<5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:1:282:274:50	83	seq1	371	99	35M	=	193	-213	ATTACCAGAGGGATGGAGGGAAGAGGGACGCTGAA	</7;/:<<<<<<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:46:485:482	83	seq1	371	94	35M	=	530	194	ATTACCAGAGGGATGAAGGGAAGAGGGACGCTGAA	<<<<<<<<<<<<<<<<<<<<<<<6<<<<<:<:89<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_63:1:119:446:185	147	seq1	372	99	35M	=	562	225	TTACCAGAGGGATGGAGGGAAGAGGGACGCTGAAG	<<<<<<<7<<<4<<<<9<<54<:<7<5:<::7-5;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:168:69:605	147	seq1	373	67	36M	=	565	228	TACCCGAGGGATGGAGGGTAGAGGGACGCTGAAGTG	<<<4(<<<<<<<<<<<<<(1<6<-<2<<7<<6<<++	MF:i:18	Aq:i:26	NM:i:4	UQ:i:59	H0:i:0	H1:i:0
+EAS114_32:6:78:909:394	147	seq1	373	81	35M	=	554	216	TACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGA	<<<<<<8<<<&<<<-<<<14,4;<<-0<2+<)/82	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:5:41:118:1246	83	seq1	374	99	35M	=	548	209	ACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGAA	<<<<<<<<<<<<<<<<<<<<<<<</<<<<<<1<<(	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:44:498:945	147	seq1	377	82	35M	=	195	-217	ATAGGGATGGAGGGAAGAGGGCCGCTGAAGAACTT	<%*50<7<4<<<7<,<<.<8/,9<:</<<<;<;<<	MF:i:18	Aq:i:37	NM:i:2	UQ:i:15	H0:i:0	H1:i:1
+EAS114_39:5:50:972:1286	147	seq1	377	99	35M	=	559	217	AGAGGGATGGAGGGAAGAGGGACGCTGAAGAACTT	<<<<<<<<<<<<<<<<<;<<<<<<<<<6<<7:7:;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:82:164:1924	147	seq1	378	99	35M	=	542	199	GAGGGATGGAGGGAAGAGGGACGCTGAAGAACTTT	<<<<<<<<<<<<<<<<<<<<8<<<<<<3<<'<7<8	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:7:14:426:613	147	seq1	379	99	35M	=	214	-200	AGGGAGGGAGGGAAGAGGGACGCTGAAGAACTTTG	:<<<<&<<<<<<<<<<<<<<6<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_61:4:83:452:970	147	seq1	379	99	35M	=	216	-198	AGGGATGGAGGGAAGAGGGACGCTGAAGAACTTTG	<<<39<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:157:643:175	83	seq1	380	99	35M	=	206	-209	GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA	;<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:61:1797:113	83	seq1	380	99	35M	=	551	206	GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA	<<<<<<;<<<<;:<3<<<<;;<<<8<<;:<<;3<.	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:90:828:633	147	seq1	381	99	36M	=	537	192	GGATGGAGGGAAGAGGGACGCTGAAGAACTTTGATG	<<<<<<<<<<<8<;96<;<<<<<99<2<<;<96<8;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:61:433:385	147	seq1	381	99	35M	=	579	233	GGATGGAGGGAAGAGGGACGCTGAAGCACTTTGAT	<<<<<<<<<<<<<<<<<;<<;<<6<<)91<<;;,;	MF:i:18	Aq:i:43	NM:i:1	UQ:i:8	H0:i:0	H1:i:1
+EAS1_93:2:173:995:93	83	seq1	382	99	35M	=	215	-202	GCTGGAGGGAAGAGGGACGCTGAAGAACTTTGATG	<(0<<9<<<7<<<<<<7<<<<<<<<<7<<<<<<<<	MF:i:18	Aq:i:73	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS54_71:3:254:32:275	83	seq1	382	99	34M	=	575	228	GATGGAGGGAAGAGGGACGCTGAAGAACTTTGAT	<<<<<<<<<<<<<<<<<<<<<<;;<:<::<:2*<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:282:817:710	147	seq1	384	99	35M	=	211	-208	TGGAGGGAAGAGGGACGCTGAAGAACTTTGATGCC	366=6;======8====:========;========	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:75:217:337	147	seq1	386	99	35M	=	568	217	GAGGGAAGAGGGACGCTGAAGAACTTTGATGCCCT	;;;;;;;;;;;;;;;;;;8;;;;;;;;;;;88787	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:181:191:418	83	seq1	387	99	36M	=	221	-202	AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:160:896:275	83	seq1	387	99	35M	=	220	-202	AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTC	;;;9;<<<<<<;<;;<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:88:1656:896	83	seq1	387	99	40M	=	538	191	AGGGAAGAGGGATGCTGAAGAACTTTGATGCCCTCTTCTT	<<<9<<<<<<<9<<<;<<<<<<<<<;6<<;7<<<<::9:;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_597:8:186:850:838	147	seq1	389	99	35M	=	205	-219	GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT	<;<;<;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:64:1318:1711	147	seq1	389	99	35M	=	218	-206	GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:78:1478:1446	83	seq1	389	99	35M	=	560	206	GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<:<<<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:82:879:246	147	seq1	391	99	35M	=	576	220	AAGAGGGACGCTGAAGAATTTTGATGCCCTCTTCT	<<<<<<<<<<<<<<<<<<&<<<77<<-<<<6<62<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_610:1:139:152:856	147	seq1	392	99	35M	=	198	-229	AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT	<<<<<;<<<<<<<<<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:162:503:769	83	seq1	392	99	35M	=	571	214	AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT	========================:==========	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:216:988:883	147	seq1	392	99	35M	=	584	227	AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT	<<<<<<<<<<<<8;<;88<;8;;;;828;8;8;;;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:118:523:591	147	seq1	393	99	35M	=	563	205	GAGGGACGCTGAAGAACTTTGATGCCCTCTTCTTC	<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<;;<;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:3:168:741:680	147	seq1	394	99	35M	=	562	203	AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC	<<<<<<<<<<<<<<<<<<<<<<<<<1<<<<<<<<<	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:9:1289:215	147	seq1	394	99	35M	=	231	-198	AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC	7747*7;;;;+;;:2;7;:1;;9:;:;:;;:;::;	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:84:275:1572	83	seq1	394	99	35M	=	230	-199	AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC	777777::7:;74;:;:7;:::;;;;:;;8;;;<;	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:122:77:789	83	seq1	396	99	35M	=	223	-208	GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA	9<;<:<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:62:879:264	83	seq1	396	99	35M	=	216	-215	GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA	====:=<============================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:89:525:113	83	seq1	397	78	40M	=	227	-210	GACGCTGAAGAACTTTGATTCCCTCTTCTTCCAAAGATGA	);:+4-&<<+<<:<+<)<<<7<8<8:<:<<:<82::<<2<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_39:2:18:967:582	83	seq1	398	99	35M	=	200	-233	ACGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAG	<:<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:140:522:212	147	seq1	399	99	35M	=	568	204	CGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA	<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<;95;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:125:628:79	83	seq1	400	99	34M	=	229	-205	GCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA	95&<<<<<<<63<<<6<<<<8<;<<8<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:185:312:167	147	seq1	401	99	35M	=	562	196	CTGAAGAACTTTGATGCCCTCTTCTTCCAAAGATG	===========================;855;===	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:248:753:731	147	seq1	402	99	35M	=	231	-206	TGAAGAACTTTGATGCCCTCTTCTTCCAAAGATGA	7;55;=,=89=====3===9=======9=======	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:299:360:220	147	seq1	403	99	35M	=	237	-201	GAAGAACTTAGATGCCCTCTTCTTCCAAAGATGAA	66<;;4;<<()<<4<<<<<<;<<;<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:7	H0:i:0	H1:i:1
+EAS114_45:6:5:730:1436	83	seq1	403	99	35M	=	236	-202	GAAGAACTTTGATGCCCTCTTCTTCCAAAGATGAA	7977979;;;;;;;;;7;3<;2<;26;<;<<;;<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:134:868:252	83	seq1	404	99	36M	=	595	227	AAGAACTTTGATGCCCTCTTCTTCCAAAGATGAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<<:<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:165:431:857	83	seq1	406	99	35M	=	559	188	GAACTTTGATGCCCTCTTCTTCCAAAGATGAAACG	<<<<<<<<<<<<<<<<<<<<<<<6&:<7<:76,;;	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:86:823:683	83	seq1	408	99	35M	=	240	-203	ACTTTGATGCCCTCTTCTTCCAAAGATGAAACGCG	<4<<<<<<<<:<<6<<7<<<8<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:176:168:513	83	seq1	410	99	35M	=	210	-235	TTTGATGCCCTCTTCTTCCAAAGATGAAACGCGTA	;0;;;7:<<<<<<<;<<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:259:219:114	147	seq1	411	99	35M	=	254	-192	TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA	666<:6/:6::6::<:::<<<;<<<<<<<<;<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:84:1013:1074	89	seq1	411	71	35M	=	411	-35	TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA	8;;<;8744<7<<4<<47<<<<<<7<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:84:1013:1074	149	seq1	411	0	*	=	411	35	GCAAGGGGGTCTATGTGAACAAAGGCACTAAACAC	<7<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-64
+EAS54_81:7:325:150:465	83	seq1	412	99	35M	=	598	221	TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<3;;:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:179:13:782	147	seq1	412	99	35M	=	568	191	TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC	<<<<<<<<<<<<<<<<<:<<:7<<<<::<7<:-:1	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:113:809:364	147	seq1	413	99	35M	=	250	-198	GATGCCCTCTTCTTCCAAAGATGAAACGCGTAACT	;<;;;<<<:<6<<<::<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:188:802:71	83	seq1	415	99	35M	=	232	-218	TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC	;;;;<:::<<<<<7<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:204:264:413	83	seq1	415	96	34M	=	593	213	TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTG	<<<<<<<<<<<<<;:59<+<<:<<<9<<;:62<)	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:104:350:749	83	seq1	415	99	36M	=	247	-204	TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGCG	;<93;9;<3;<<<;<<<<<;<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:24:1037:84	83	seq1	415	99	35M	=	238	-212	TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC	<;<<;<<<7<<7&<<<<<<;<<<;<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:242:354:637	147	seq1	417	99	36M	=	222	-231	CCCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT	8<;;;;;<<<8;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:37:761:635	83	seq1	418	99	35M	=	581	198	CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT	<6<<<<<<6<<<<<<<<<<<<<<<<<8<8<<4<4<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:44:1578:1674	83	seq1	418	99	35M	=	573	190	CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT	;<<;<<;<<;;;;;9<;9;;<9:;;<:;9;76669	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:120:63:653	83	seq1	420	99	35M	=	598	213	TCTTCTTCCAAAGATGAAACGCGTAACTGCGCTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<9<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:264:642:506	147	seq1	420	99	35M	=	247	-208	ACTTCATCCAAAGATGAAACGCGTAACTGCGCTCT	&;(-/)-1&:<<9<25<<<<2<1<';8<<<:888<	MF:i:18	Aq:i:56	NM:i:2	UQ:i:13	H0:i:1	H1:i:0
+EAS188_7:3:101:572:491	83	seq1	425	99	35M	=	600	210	TTCCAAAGATGAAACGCGTAACTGCGCTCTCATTC	<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<1<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:27:1881:486	147	seq1	427	99	35M	=	607	215	CCAAAGATGAAACGCGTAACTGCGCTCTCATTCAC	;;;;;;;;;;;;;;1;;;;;;;;78;8;8;8878/	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:120:14:944	147	seq1	428	99	35M	=	621	228	CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT	<<<<<<<<<<<<<<<;<<<<<;<<<<<<<:;8;;7	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:46:695:738	83	seq1	428	74	35M	=	259	-204	CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT	<<<<2<5<<-<<<<<<<4<<<<<<<<<<<<<<3<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:13:1034:1144	147	seq1	429	99	35M	=	256	-208	AAAGATGAAACGCGTAACTGCGCTCTCATTCACTC	<<:%<9)<<<<<<8<<<<9<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:6:91:360:585	83	seq1	430	99	35M	=	586	191	AAGATGAAACGCGTAACTGCGCTCTCATTCACTCC	<<<<9<<<<<;<<<;<<77<<<;<;;<;;<;<;;<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:73:1208:495	83	seq1	431	99	35M	=	246	-220	AGATGAAACGCGTAACTGCGCTCTCATTCACTCCA	8-889<<;<;;:<;<;;;;;;<<;;<;;;;<<;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:16:1081:1894	147	seq1	431	99	35M	=	624	228	AGATGAAACGCGTAACTGGGCTCTCATTCACTCCA	<<<<<<<<<<<<<<<<<<8<<<<;<<;<<<<<<<+	MF:i:18	Aq:i:45	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+EAS188_4:7:35:408:348	85	seq1	433	0	*	=	433	35	GGTTCTCAAGGTTGTTGCAATGGGGTCTATGTGAA	.73<;<<:77<<<<<<<<<<-<<;<<<<<<<<<<<	MF:i:-64
+EAS188_4:7:35:408:348	153	seq1	433	35	35M	=	433	-35	AAGAAACGCGTAACTGCGCTCTCATACACTCCAGC	4,'3<6;)2);<3<-6<;<;7+7<5+<<<7<<<<<	MF:i:64	Aq:i:0	NM:i:2	UQ:i:21	H0:i:0	H1:i:1
+EAS56_53:4:130:568:978	147	seq1	434	88	35M	=	246	-223	TGAAACGCGAAACTGCACTCTCATTCACTCCAGCT	--;066;;62<<<2&<+<+<2;<<2<<<;<<<7<<	MF:i:18	Aq:i:24	NM:i:2	UQ:i:27	H0:i:0	H1:i:0
+EAS139_19:1:87:1222:878	83	seq1	435	34	40M	=	272	-203	TCAGCGCGTCACTCCGCTCTCATTCACCCCAGCTCCCTGT	!!;*:885<&<<<)8&<:<<<8<8<::*<4<88<<<8<<<	MF:i:18	Aq:i:10	NM:i:6	UQ:i:42	H0:i:0	H1:i:0
+EAS51_64:6:143:763:480	85	seq1	436	0	*	=	436	35	CTGAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA	;<&-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-64
+EAS51_64:6:143:763:480	153	seq1	436	70	35M	=	436	-35	AAACGCGTAACTGCGCTCTCATTCACTCCAGCTCC	::3<:6<<<:<<<<7<<<<<<<<)6<<<1<<<<;<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:4:145:607:216	147	seq1	437	99	35M	=	596	194	AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC	<<<<<<<<8<<<<<<<<<<4<<<7<:<<1<<;;99	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:46:285:790	89	seq1	437	72	35M	=	437	-35	AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC	;;<8<;<<<<88<8<<;;<;<<;<<<<<<<<;<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:46:285:790	149	seq1	437	0	*	=	437	35	TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG	!!<<3<<<;;<<<<<<<<<;<;7<<7<<<<<<;<<	MF:i:-64
+EAS56_59:4:329:577:757	85	seq1	437	0	*	=	437	35	TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG	!!<<<<9;<:<<;<<<<<<<<;<<<<<<<<<<<<<	MF:i:-64
+EAS56_59:4:329:577:757	153	seq1	437	72	35M	=	437	-35	AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC	;;;888;<<<<<<6<<<2;<<<<<<;<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:57:722:347	147	seq1	439	99	35M	=	599	195	CGCGTAACTGCGCTCTCATTCACTCCAGCTCCCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:285:367:932	83	seq1	440	74	35M	=	285	-190	GCGTAACTGCGCTCTCATTCACTCCAGCTCCCTGT	9=5==;=;7===;==;===================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:38:842:395	73	seq1	442	77	35M	*	0	0	GTAACTGCGCTCTCATTCACTCCAGCTCCCTGTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<93<;9	MF:i:32	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:8:14:601:624	147	seq1	446	99	35M	=	622	211	CTGCGCTCTCATTCACTCCAGCTCCCTGTCAACCC	<<1<<<<<<<<<<<<<<<<<3<<::<<7<<1,<:(	MF:i:18	Aq:i:69	NM:i:2	UQ:i:18	H0:i:1	H1:i:0
+EAS114_45:3:3:1377:1663	83	seq1	446	99	35M	=	626	215	CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA	<<;;;;<:;;:<;;<;;<;:;;<;9;;::977676	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:26:1221:222	83	seq1	446	99	35M	=	261	-220	CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA	<<<<<<<:<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:82:566:1096	83	seq1	446	99	35M	=	621	210	CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA	<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<;<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:24:1135:563	83	seq1	446	99	40M	=	266	-220	CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA	6+96:87<&8<<79:<;<<<<:<<;<<<<<<;;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:53:272:944	147	seq1	447	99	35M	=	287	-195	TGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAA	&94<4&8.6<6&;<:0:8;;:6;<;:<*<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:287:492:169	147	seq1	449	99	36M	=	269	-216	CGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG	;/;6<<<<4(<(<<<<6<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:49:163:904	147	seq1	450	99	35M	=	616	201	GCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78958	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:200:192:373	83	seq1	451	75	36M	=	275	-212	CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC	<<<8<<<4<4<<<<<:<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:253:285:104	147	seq1	451	99	35M	=	627	211	CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA	======================:========7==;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:151:159:43	83	seq1	452	99	35M	=	645	228	TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC	<<<<<<<;<<<8<<<;<;8<<<<7<77;;79<09+	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:1:115:868:887	147	seq1	452	99	35M	=	650	233	TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC	>>>>>>>>>>>>>>;<>>>>><<>>>;<+<</;;1	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:57:786:414	83	seq1	453	99	35M	=	296	-192	CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC	;;;8;1;:<<<<;<::;;<<<<;<;;<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:197:170:559	89	seq1	453	71	35M	=	453	-35	CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC	<:<;;:<5<5<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:197:170:559	149	seq1	453	0	*	=	453	35	TTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAACA	:;;;;<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-64
+EAS1_103:7:313:83:546	83	seq1	454	99	35M	=	296	-193	TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT	;)<994<;<<<<<<<;<<<<<<<<<<<<<<5<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:44:280:641	83	seq1	454	99	35M	=	288	-201	TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT	9;<<9;9;;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:1:60:837:923	147	seq1	457	61	36M	=	641	220	TTCACGCCAGCTCCCTGTCACCCAATGGACCTCTGA	<<<<<4<<+<<*<<<<88<<<<<'*<4-+<<4&<40	MF:i:18	Aq:i:24	NM:i:2	UQ:i:24	H0:i:0	H1:i:1
+EAS114_45:5:85:401:1190	147	seq1	458	99	35M	=	652	229	TCACTCCAGCTCCCTGTCACCCAATGGACCTGTGA	4;;;1;;;;;;.6;;;(;;/;/;3;;;7;(3&063	MF:i:18	Aq:i:55	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:314:386:190	147	seq1	459	98	35M	=	287	-207	CACTCCAGCTCCCTGTCACCCAATGGACCTGTGAT	76;%;<<3<9;<69<<<7;;;<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:2:831:692	83	seq1	462	99	35M	=	634	207	TCCAGCTCCCTGTCACCCAATGGACCTGTGATATC	<<<<<<<<;<<<<<<<<<<9<<:9<<<;;96<796	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:163:846:223	83	seq1	463	74	35M	=	278	-220	CCAGCTCCCTGTCACCCAATGGACCTGTGATATCT	<7<5<*<<<<0<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:48:9:409	147	seq1	464	75	35M	=	271	-228	CAGCTCCCTGTCACCCAATGGACCTGTGATATCTG	<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:134:751:831	83	seq1	465	99	36M	=	651	222	AGCTCCCTGTCACCCAATGGACCTGTGATATCTGGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<948	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:326:309:149	83	seq1	467	99	35M	=	301	-201	CTCCCTGTCACCCAATGGACCTGTGATATCTGGAT	;;<<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:260:985:520	83	seq1	468	99	35M	=	296	-207	TCCCTGTCACCCAATGGACCTGTGATATCTGGATT	;9;7<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:112:203:90	83	seq1	470	99	35M	=	305	-200	CCTGTCACCCAATGGACCTGTGATATCTGGATTCT	;<;:;<;;;<<<<<<<<<:<<<7<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:308:400:602	83	seq1	470	71	35M	=	285	-220	CCTGTCACCCAATGGACCTGTGATATCTGGATTCT	;77;2<<;<7<<;<<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:82:902:868	147	seq1	471	99	35M	=	295	-211	CTGTCACCCAATGGACCTGTGATATCTGGATTCTG	<<;;<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:153:977:200	147	seq1	472	99	35M	=	640	203	TGTCACCCAATGGACCTGTGATATCTGGATTCTGG	;<<;<<<<7<<;;;;;<<6<<<<<86;;8<;8;6;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:319:246:304	147	seq1	472	99	35M	=	305	-202	TGTCACCCAATGGACCTGTGATATCTGGATTCTGG	;;<;;;<<<<8;<<<<;<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:37:1004:1136	147	seq1	473	99	35M	=	315	-193	GTCACCCAATGGACCTGTGATATCTGGATTCTGGG	</8<<<<7<+<<<<<<<,<<<<<<<<<6<<<<1<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:59:396:359	83	seq1	474	99	35M	=	670	231	TCACCCAATGGACCTGTGATATCTGGATTCTGGGA	<<9;;<;<;;;;<;;9;;;;;<;;;;;<;;77677	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:45:1769:1130	147	seq1	476	99	35M	=	635	194	ACCCAATGGACCTGTGATATCTGGATTCTGGGAAA	;;;;;;;;;;;;9;;;;;;19;;;9;;;;176777	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:110:355:323	147	seq1	477	99	35M	=	303	-209	CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT	6069;1<<;4<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:28:708:463	83	seq1	477	99	36M	=	672	231	CCCAATGGACCTGTGATATCTGGATTCTGGGAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;<:<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:112:51:128	83	seq1	477	99	35M	=	287	-225	CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT	;9<;;:<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:303:184:14	83	seq1	479	99	35M	=	301	-213	CAATGGACCTGTGATATCTGGATTCTGGGAAATTC	:<<.<;;7<:<<<<<<7<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:84:101:328	147	seq1	480	99	35M	=	673	228	AATGGACCTGTGATATCTGGATTCTGGGAAATTCT	<<<;<<<<<<<<;<<<<<<<<<<:<;;<44;;<;<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:228:354:203	83	seq1	480	99	34M	=	643	198	AATGGACCTGTGATATCTGGATTCTGGGAAATTC	88<<<8<<<<<<<<<8<<<<<<<<<4<<<4/9/;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:38:856:336	83	seq1	480	99	33M	=	656	211	AATGGACCTGTGATATCTGGATTCTGGGAAATT	<<<<<<<<<<<;;<;<;<:69<<;<5-500373	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:75:946:1035	147	seq1	480	99	35M	=	288	-227	AATGGACCTGTGATATCTGGATTCTGGGAAATTCT	<<)4</<5<<<<<<<<<<<<<<<<<<<<<66<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:271:244:568	147	seq1	481	99	35M	=	294	-222	ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT	;<<<<<<;<;<<<<<<<<<<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:8:129:477:427	83	seq1	481	99	35M	=	652	206	ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT	<<<<<<<<<<<<<<<<<<;;<<<<::<9<;<<;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:262:297:601	147	seq1	482	99	35M	=	635	188	TGGACCTGTGATATCTGGATTCTGGGAAATTCTTC	<<<<;<<9<<57<<7<<<;<<;77-;;53<<;;<7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:88:24:744	83	seq1	484	84	35M	=	325	-194	GTCCTGTGATATCTGGATTCTGGGAAATTCTTCAT	4%++88;-9<;<<<+8<<<:<;8:<<<<<<<<<<<	MF:i:18	Aq:i:21	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+B7_610:5:147:68:353	83	seq1	486	99	35M	=	299	-222	CCTTTGATATCTGGATTCTGGGAAATTCTTCATCC	<<;;<<<<<<<<+;<<;<<0;<<<<;<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS51_78:7:316:961:576	83	seq1	488	65	35M	=	666	213	TGTGATATCTGGATTCTGGGAAATTCTTCATCCCG	<<<<<<<;<<<<;<<:<<;<;<<:;<9+34;;6%/	MF:i:18	Aq:i:65	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS56_61:8:7:171:402	83	seq1	489	99	35M	=	682	228	GTGATATCTGGATTCTGGGAAATTCTTCATCCTGG	<<<<<<<<<<<<<<<;/<<<<;<<<<<;<<1<<<4	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:277:458:330	83	seq1	490	99	36M	=	329	-197	TGATATCTGGATTCTGGGAAATTCTTCATCCTGGAC	<<<<<8;<<<1<;7<<<;<<<<<<<<7<<7<<<<;7	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:269:280:716	147	seq1	490	99	35M	=	323	-202	TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA	6;<;;6:;<<<;64;<<<<<<<<;<<;<<;<<<<<	MF:i:18	Aq:i:58	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:72:63:435	147	seq1	490	99	35M	=	293	-232	TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA	::<;<<<<;;;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:8:46:900:610	83	seq1	491	99	35M	=	684	228	GATATCTGGATTCTGGGAAATTCTTCATCCTGGAC	<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<;;4;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:189:467:475	83	seq1	493	99	35M	=	683	225	TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC	<<<<<<<<<<<<;;;<<<<<<<<<:<<<<:+<<;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:201:959:19	83	seq1	493	99	35M	=	681	223	TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC	<<<<<<<<<<<<<<;<<<:<;<<;<<;+;+<3494	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:240:593:842	83	seq1	494	99	35M	=	660	201	ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT	============<================9===:=	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:29:381:169	147	seq1	494	99	35M	=	641	182	ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT	<<<<<<<<<<<2<288;<<;<<:4<:<<;&92929	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:199:327:965	83	seq1	494	91	35M	=	297	-232	ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT	<5<:<<<58<:<<<<<<8<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:87:323:895	83	seq1	494	99	35M	=	671	212	ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT	;<<;;;;<<;<959;;;<;:<<;9<;;;4377788	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:5:327:991:508	147	seq1	495	99	35M	=	312	-218	TCTGGATTCTGGGAAATTCTTCATCCTGGACCCTG	0:;::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:6:882:784	147	seq1	496	99	35M	=	686	225	CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGA	<<<<<<<<<<<<<:<<<<<<<<<<<<:6::::<,2	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:175:705:982	83	seq1	496	89	36M	=	660	200	CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG	<<<<;<<;<<<<<<<<<<<<<;<<+<:;39;+<40<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:30:92:753	83	seq1	497	99	35M	=	673	211	TGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG	<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:245:323:744	147	seq1	499	99	35M	=	679	215	GATTCTGGGAAATTCTTCATCCTGGACCCTGAGAG	<;<<<<<<<<<<<<<<<<<<<<<;<+<<<<<<<4<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:76:786:458	83	seq1	502	99	35M	=	341	-196	TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT	;<;:7<.<<<<<8;<<<<<<<6<;8<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:185:213:330	83	seq1	502	99	35M	=	328	-209	TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT	;4<<<;<<<<<<<<;<<;;;<<<<9<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:42:1091:1726	147	seq1	502	99	35M	=	334	-203	TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT	4443838<4<8<87<<3</8<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:12:158:458	83	seq1	503	84	36M	=	675	208	CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT	<77<<<7<<<<<<<<<<<<5<4;<<;5<;;+2<+;;	MF:i:18	Aq:i:15	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:277:590:364	147	seq1	503	99	35M	=	681	213	CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC	<<<<<8<<<<<<<<;<<<<<;;<7<<;;7858;;8	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:18:1418:237	147	seq1	503	99	35M	=	304	-234	CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC	<<:<<<<<<<<:<<<<<<<<<:<<<<<<<<<<<<:	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:4:262:456:74	147	seq1	504	99	35M	=	357	-182	TGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT	862;<<<:;<;<<<;;;<<<<;;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:186:989:869	83	seq1	505	99	34M	=	655	185	GGGAAATTCTTCATCCTGGACCCTGAGAGATTCT	<<<<<<<<<<<<<<<<<<<<7;:<<<<<<<<<$<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:80:885:513	83	seq1	507	99	35M	=	344	-198	GAAATTCTTCATCCTGGACCCTGAGAGATTCTGCA	<7<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:311:100:539	83	seq1	508	99	35M	=	353	-190	AAATTCTTCATCCTGGACCCTGAGAGATTCTGCAG	;<;<<;;<;<<;<<<<<;9<<<;<<<<<<<<9<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:199:511:426	147	seq1	509	99	35M	=	669	195	AATTCTTCATCCTGGACCCTGAGAGATTCTGCAGC	<<<<<<<<<<<<<<;<<<<<<:<<<<<<<<<;:<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:26:227:1053	83	seq1	510	99	35M	=	663	188	ATTCTTCATCCTGGACCCTGAGAGATTCTGCAGCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:172:622:707	83	seq1	511	99	35M	=	685	209	TTCTTCATCCTGGACCCTGAGAGATTCTGCAGCCC	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<5:<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:157:935:374	147	seq1	512	99	35M	=	353	-194	TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCA	94988994.<:<+42::<<<<<:<:<4<<<<;<1<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:103:111:720	147	seq1	512	99	36M	=	353	-195	TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG	;4<<<;)<<-<9<;<<7<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:328:669:662	147	seq1	512	99	35M	=	337	-210	TCTTCATCCTGTACCCTGAGAGATTCTGCAGCCCA	4<<;<<8<.<88.<<;4<<<<<<<4<.<<<<7<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+EAS51_64:5:202:39:380	147	seq1	513	99	35M	=	334	-214	CTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG	/92/;2<+2<<<<64<<<<<<<<<<<<<<<<7<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:66:655:769	147	seq1	515	99	35M	=	348	-202	TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT	8<<;:69<;:;9<2<*9<;6<<<<<17<;<3+<;<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:4:7:526:343	83	seq1	515	99	35M	=	698	218	TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT	<<<<<<<<<<<<<<<:<<<5<<<<<<5;<<<+8<;	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:33:672:473	147	seq1	515	99	35M	=	330	-220	TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT	5<70<<55<4<24.5<<<<<<<<<6<<<<<<2<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:72:308:839	83	seq1	517	99	40M	=	354	-203	ATCGTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT	:8:.:<;<<5<<<<<<<<<<<<<<<<;:<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:2	UQ:i:40	H0:i:0	H1:i:1
+EAS56_61:1:210:880:606	83	seq1	518	99	35M	=	341	-212	TCCTGGACCCTGAGAGATTCTGCAGCCCAGCTCCA	.<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:80:760:490	83	seq1	520	99	34M	=	686	201	CTGGACCCTGAGAGATTCTGCAGCCCAGCTCCAG	<<<<<<<<<<8<;<7<<<<<<;<;;<2<;<<<1,	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:34:970:1374	147	seq1	520	99	35M	=	363	-192	CTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGA	<6<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_593:1:200:559:765	147	seq1	521	99	36M	=	337	-220	TGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT	8<;;4<3;<;<<<<<<5<<;;<<98;;<<<<;<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_53:8:28:701:724	83	seq1	521	99	35M	=	347	-209	TGGACCCTGAGAGATTCTGCAGCCCAGCTCCAGAT	.;..3;8.8<8;<<;9<9<<<7;<<<<<<<<7<<7	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:318:345:156	147	seq1	522	99	35M	=	695	208	GGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT	<<<<<<<<:<<<<<<<<5<:5<<<3:'<72')*;9	MF:i:18	Aq:i:39	NM:i:1	UQ:i:6	H0:i:0	H1:i:1
+B7_595:1:81:1000:375	83	seq1	524	90	35M	=	329	-230	ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGC	;8<;+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:13:1155:631	147	seq1	524	99	40M	=	668	184	ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTG	<<<<<<;<<;<<<<<<;<<<<<9<;<;94<<%<<<7:777	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:257:611:440	147	seq1	524	99	35M	=	341	-218	ACCCTGAGAGATTCTGCAGCCCAGATCCAGATTGC	2<;;8<;;<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_26:6:129:694:359	83	seq1	525	88	35M	=	350	-210	CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT	7777<7<7;77+<3<<;<<;<<<<;<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_11:6:11:285:1567	147	seq1	525	99	35M	=	685	195	CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_95:1:196:533:921	147	seq1	526	99	35M	=	361	-200	CCTGAGAGATTCTGCAGCCCAGATCCAGATTGCTT	7<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_11:2:6:251:1557	147	seq1	526	99	35M	=	700	209	CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:20:492:850	83	seq1	526	78	35M	=	694	203	CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT	<7<<<<<<<<<<<.<54<7&<<<7<74<2<<<2<<	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:231:339:551	83	seq1	527	99	35M	=	350	-212	CTGAGAGATTCTGCAGCCCAGATCCAGATTGCTTG	<;<<;<<<<<<<<<<;:<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_19:4:68:1122:79	83	seq1	528	99	40M	=	687	199	TGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCT	<<<<<<<<<<<<<;<<<<;<<<<<<;<<<4;<<4;99::;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:87:1375:1303	83	seq1	529	99	35M	=	340	-224	GAGAGATTCTGCAGCCCAGATCCAGATTGCTTGTG	:<;<(<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS220_1:8:46:485:482	147	seq1	530	94	35M	=	371	-194	AGAGATTCTGCAGCCCAGATCCAGATTGCTTGTGG	<<<<<::<<<<<<<<6<<<<<<<<<6<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS218_4:7:90:1873:89	147	seq1	531	99	35M	=	344	-222	GAGATTCTGCAGCCCAGATCCAGATTGCTTGTGGT	<<<<;49<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_26:5:238:31:968	83	seq1	534	99	35M	=	717	218	ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTG	9======8====*=====,=1=======<=7:::,	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:78:773:660	147	seq1	534	99	36M	=	711	213	ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTGA	<<<<<<<<;<<<<<<<<<8<8<<;<<<;<<;7<<4:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:90:828:633	83	seq1	537	99	36M	=	381	-192	CTGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG	<<<;<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_30:2:272:750:698	83	seq1	538	80	35M	=	365	-208	TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG	0<;8;64;<<<;<;.<+;:<4;4<;<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_19:3:88:1656:896	147	seq1	538	99	40M	=	387	-191	TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCTGC	6/8::*9/*3*'<88<:9*<<<8<<<;<<<<<<<<;<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+EAS54_61:6:126:541:194	147	seq1	540	97	35M	=	730	225	CAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGC	<<<<<<<<8<<<<<8<<<<<<<<<8<<<428+<80	MF:i:18	Aq:i:43	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+EAS114_28:4:9:55:730	147	seq1	540	99	36M	=	722	218	CAGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT	>>=>>+==>>==<==<=8=><:;8/;7</5724-2;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:278:918:892	83	seq1	541	99	35M	=	720	214	AGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT	=============:====================8	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:243:876:758	83	seq1	541	99	35M	=	712	206	AGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;78<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_65:5:121:380:656	147	seq1	542	99	35M	=	362	-215	GCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTG	:;<<;<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:82:164:1924	83	seq1	542	99	35M	=	378	-199	GCCCAGCACCAGATTGCTTGTGGTCTGACAGGCTG	6<<<<<<-<<<<<<<<<2<<06<9<<<<<1<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS114_30:6:163:312:891	83	seq1	543	99	35M	=	709	201	CCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTGC	<<<<<<<<<;<<<<<<<<<<<<<<<<:;;<;;<;0	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:124:243:35	147	seq1	544	60	35M	=	364	-215	GCATATCCAGATTGCTGGTGGTCTGACAGGCAGCA	&+<+;<694;+&99<<2<;423<26<-<<<<,<3<	MF:i:-126	Aq:i:60	NM:i:2	UQ:i:28	H0:i:0	H1:i:0
+B7_591:1:191:462:705	83	seq1	545	99	36M	=	721	212	CAGATCCAGATTGCTTGTGGTCTGACAGGCTGCAAC	<<<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<::<6	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_610:8:95:426:791	147	seq1	547	99	35M	=	359	-223	GNTCCAGATTGCTTGTGGTCTGACAGGCTGCAACT	!!!!<<<<<;;<<<<;<<;<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:1	UQ:i:23	H0:i:1	H1:i:0
+EAS218_4:5:41:118:1246	147	seq1	548	99	35M	=	374	-209	CTCCAGATTGCTTGTGGTCTGACAGGCTGCAACTG	<<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:27:973:518	83	seq1	549	99	35M	=	691	177	TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT	<<<<<<<<<<<<<<;<<<<7<<<<<<<<88;0:8;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:4:679:110	83	seq1	549	99	35M	=	705	191	TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT	<<<<<<<<<<<<<<<<<<<;<<<<<<<<::<;;:7	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:297:283:948	147	seq1	550	99	35M	=	727	212	CCAGATTGCTTGTGGTCTGACAGGCTGCAACTGTG	<<<<<<<<<<<<<<<<<<<<<<<:<<9;)+1;19-	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:61:1797:113	147	seq1	551	99	35M	=	380	-206	CAGATAGCTTGTGGTCTGACAGGCTGCAACTGTGA	<<0<<&<<<<;<<4;;3<;<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS188_7:6:205:873:464	83	seq1	552	99	35M	=	743	226	AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG	<<<<<<<<<7<<<<<<<<<<<<:<<,:<:<<<<::	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:33:1168:1762	83	seq1	552	99	35M	=	728	211	AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG	<<<<<<<<<<<<<<<<;<<;<;<<<<<<<<:;2::	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:78:909:394	83	seq1	554	81	35M	=	373	-216	ATTGCTTGGTGTCTGACAGGCTGCAACTGTGAGCC	6167&+&&/&//734/3<<<9*<;;3<3<;9<<3<	MF:i:18	Aq:i:21	NM:i:2	UQ:i:19	H0:i:0	H1:i:0
+EAS1_103:2:226:302:758	147	seq1	556	99	35M	=	751	230	TGCTTGTGGTCTGACAGGCTGCAACTTTGAGCGNT	<<<<<<<;;;,<;<92;66<;))42<&2&(/1!!!	MF:i:18	Aq:i:33	NM:i:2	UQ:i:9	H0:i:0	H1:i:1
+EAS114_28:5:206:671:49	147	seq1	557	99	36M	=	719	198	GCTTGTGGTCTGACAGGCTGCAACTGTGAGCCATCA	<<<<<<;<<<<8<<<;;<<<3<<8<8<35+,55;,3	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:165:431:857	147	seq1	559	99	35M	=	406	-188	TTGGGGTCTGACAGGCTGCAACTGTGAGCCATCAC	''7'/;'1%0447<<<*<6<<<*<*<<<<6<<<<<	MF:i:18	Aq:i:53	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS114_39:5:50:972:1286	83	seq1	559	99	35M	=	377	-217	TTGTGGTCTGACAGGCTGCAACTGTGAGCCATCAC	:;;7;7;;0<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:288:552:440	147	seq1	560	87	35M	=	747	222	TGTGGTCTGACAGGCTGCAACTGTGAGCCTTCCAT	<<<<71<77<<<:<<<&<4<<77<16<88&36+%%	MF:i:18	Aq:i:26	NM:i:4	UQ:i:26	H0:i:1	H1:i:0
+EAS221_1:8:78:1478:1446	147	seq1	560	99	35M	=	389	-206	TGTGGTCTGACAGGCTGCAACTGTGAGCCATCACA	<8,8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:275:851:240	83	seq1	561	99	35M	=	743	217	GTGGTCTGACAGGCTGCAACTGTGAGCCATCACAA	<<<<<<<<<<<<<<<<<<<<<<<:<<4<7<<<<<<	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:185:312:167	83	seq1	562	99	35M	=	401	-196	TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT	<<8:<8<<<<<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:1:119:446:185	83	seq1	562	99	35M	=	372	-225	TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT	+70730;<0<77;;<<<<<9<<<<<<9<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:3:168:741:680	83	seq1	562	99	35M	=	394	-203	TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT	<<5<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:67:1797:1931	83	seq1	562	99	35M	=	750	223	TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:228:182:717	83	seq1	563	99	35M	=	729	201	GGTCTGACAGGCTGCAACTGTGAGCCATCCCCATG	<=9============5==5=<,59<=1=<&;&;;7	MF:i:18	Aq:i:66	NM:i:2	UQ:i:10	H0:i:1	H1:i:0
+EAS112_34:7:118:523:591	83	seq1	563	99	35M	=	393	-205	GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG	4:--&0:67<<8:<<<<<<<<<<<:4<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:29:1061:574	83	seq1	563	99	35M	=	363	-235	GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG	<87<5<<9<<<66<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:168:69:605	83	seq1	565	67	36M	=	373	-228	TCTGACAGGCGGCAACTGTGAGCCATCACAATGAAC	'<'<144<0<&<<<<<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:26	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS221_3:4:90:247:212	83	seq1	567	99	35M	=	733	201	TGACAGGCTGCAACTGTGAGCCATCACAATGAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<8<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:140:522:212	83	seq1	568	99	35M	=	399	-204	GACAGGCTGCAACTGTGAGCCATCACAATGAACAA	:;8;:::<<:<<<<<<<<<7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:179:13:782	83	seq1	568	99	35M	=	412	-191	GACAGTCTACAACTGTGAGCCATCACAATGAACAA	&37.3&;3'*<3<;9<9<<5<<<<<<<<<9<<<<<	MF:i:18	Aq:i:39	NM:i:2	UQ:i:11	H0:i:0	H1:i:1
+EAS114_45:3:75:217:337	83	seq1	568	99	35M	=	386	-217	GACAGGCTGCAACTGTGAGCCATCACAATGAACAA	4779797;;;<;:4;;<<<77<;;;7<<;<;<;<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:168:528:288	147	seq1	570	99	35M	=	740	205	CAGGCTGCAACTGTGAGCCATCACAATGAACAACA	<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<;<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:162:503:769	147	seq1	571	99	35M	=	392	-214	AGGCTGCAACTGTGAGCCATCACAATGAACAACAG	;:;1;=8=;:+=====;&==7==============	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:163:618:570	147	seq1	571	99	35M	=	751	215	AGGCTGCAACTGTGAGCCATCACAATGAACAACAG	<<<<<<<8<<<<<<<<<<<<<+<.7<<..<;&;8;	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:2:251:121:479	147	seq1	572	99	35M	=	750	213	GGCTGCAACTGTGAGCCATCACAATGAACAACAGG	<<<<<<<<<<<;:<<<<;:;:<:<;:188;7:<+(	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:44:1578:1674	147	seq1	573	99	35M	=	418	-190	GCTGCAACTGTGAGCCATCACAATGAACAACAGGA	62631;;4;;;8;;48;;7;8;;;;;;;;;8;;;;	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:263:74:407	147	seq1	574	99	35M	=	754	215	CTGCAACTGTGAGCCATCACAATGAACAACAGGAA	<<<<2<<<<<<:<<<9<<4<<<<:<<<<9<999.7	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:254:32:275	147	seq1	575	99	35M	=	382	-228	TGCAACTGTGAGCCATCACAATGAACAACAGGAAG	(6+<;+6:9<<:7:<95<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:82:879:246	83	seq1	576	99	35M	=	391	-220	ACAACTGTGAGCCATCACAATGAACAACAGGAAGA	%+=661;&===:&==1<5======1==========	MF:i:18	Aq:i:43	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS54_71:4:165:397:25	147	seq1	576	99	35M	=	759	217	GCAACTGTGAGCCATCACAATGAACAACAGGAAGA	<<7<<<<<<)97<6<:3:60:3+37-37+<:33:3	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:148:776:486	147	seq1	578	99	35M	=	755	212	AACTGTGAGCCATCACAATGAACAACAGGAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:59:1576:946	83	seq1	578	99	35M	=	761	218	AACTGTGAGCCATCACAATGAACAACAGGAAGAAA	<:<<<<<<<<<<<<:<:<<<<<<<8<<::1<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:61:433:385	83	seq1	579	99	35M	=	381	-233	ACTGTGAGCCATCACAATGAACAACAGGAAGAAAA	<*97<<<<&9<<;<&<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:37:761:635	147	seq1	581	99	35M	=	418	-198	TGTGAGCCATCACAATGAACAACAGGAAGAAAAGG	+37:<088<+<<;<<;<<<<<;<<;<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:178:192:499	147	seq1	582	99	35M	=	768	221	GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT	<<<<<<<;<1<<<<<<;<<;6<<3666;;;;;/6/	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:93:945:176	83	seq1	582	99	35M	=	745	198	GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT	<<<<<<<<<<<<<<<<<<<<<;<<<<;;<;:7;<3	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:216:988:883	83	seq1	584	99	35M	=	392	-227	AAGCCAACACAATGAACAACAGGAAGAAAAGGTCT	(=/1+=&:=&======<==<===============	MF:i:18	Aq:i:68	NM:i:2	UQ:i:12	H0:i:1	H1:i:0
+EAS114_39:1:12:884:219	83	seq1	584	99	35M	=	756	207	GAGCCATCACAATGAACAACAGGAAGAAAAGGTCT	<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<5:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:61:628:681	147	seq1	586	99	36M	=	746	196	GCCATCACAATGAACAACAGGAAGAAAAGGTCTTTC	<<<<<<<<<<<<<<<<<<<;<<<<<<<:<<;;;;;;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:6:91:360:585	147	seq1	586	99	35M	=	430	-191	GACATCACAATGAACAACAGGAAGAAAAGGTCTTT	5&&<<3:;<<<<<<)<<3<<<<<<<;;<<<<;<<<	MF:i:18	Aq:i:67	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS139_11:6:89:1151:1878	83	seq1	587	99	35M	=	757	205	CCATCACAATGAACAACAGGAAGAAAAGGTCTTTC	<;;<<<<<;;;<<<<4;;::;<;8;;<;;8:<8<4	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:40:1596:1433	83	seq1	587	99	40M	=	756	209	CCATCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<1<<<<<::;::	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:4:1620:413	83	seq1	588	99	35M	=	768	215	CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA	<<<<<<<<<<6<<<6<<<;<6<9-1<;<&66<<<2	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:65:1928:1125	83	seq1	588	99	35M	=	784	231	CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA	<<;<<<7<<7<;<7<<<<<<<7<<<<;<.-;<+88	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:123:998:248	147	seq1	589	99	35M	=	776	222	ATCACAATGAACAACAGGAAGAAAAGGTCTTTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;9<<<68<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:240:603:890	147	seq1	590	99	36M	=	740	186	TCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA	<<<<<<<<<<<<<<<<<<;<:<<:<<;<<<<<8865	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:20:762:748	147	seq1	591	99	35M	=	777	221	CACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA	===================================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:246:313:499	83	seq1	592	99	35M	=	757	200	ACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG	<<<<<<<<<<<<<;<;<<<<<<<<;<<<<<;;<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:6:7:858:437	83	seq1	593	99	35M	=	773	215	CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG	<<<<<<<<<<<<<<<<<<<<<;<3<<<<<<<<<33	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:150:933:810	147	seq1	593	99	35M	=	755	197	CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG	===================================	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:204:264:413	147	seq1	593	96	35M	=	415	-213	CAATGAACAACAGAAAGAAAAGTTCTTTCAAAAGG	1==(4=::;/7::&===;====/=;===;;=====	MF:i:18	Aq:i:27	NM:i:2	UQ:i:19	H0:i:0	H1:i:0
+EAS139_11:3:65:556:1505	147	seq1	593	99	35M	=	790	232	CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG	<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:62:386:959	83	seq1	594	99	35M	=	752	193	AATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGT	<<8<<<<;<<<<-<<87;</<;<+<;5<+;;<3;+	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:134:868:252	147	seq1	595	99	36M	=	404	-227	ATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGA	<;<<<8<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:1:252:19:955	83	seq1	596	84	35M	=	771	210	TGAACAAAAGGAAGAAAAGGTCTTTCAAAAGGTGA	<<<<<<<<<<4<<<<9<<+9)9<<4:9+<<0<909	MF:i:18	Aq:i:41	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_67:4:145:607:216	83	seq1	596	99	35M	=	437	-194	TGAAAAACAGGAAGAAAAGGTCTTTCAAAAGGTGA	/;<<&<<8<<<<<<<<<<<<<;872<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_65:8:140:924:923	147	seq1	597	99	35M	=	767	205	GAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGAT	<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<5;<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:120:63:653	147	seq1	598	99	35M	=	420	-213	AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG	<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:204:779:181	147	seq1	598	99	35M	=	779	216	AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG	<<<<<<5<<:<<<<<8<<,<<<<<<<<<<91<91<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:325:150:465	147	seq1	598	99	35M	=	412	-221	AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG	<<:<<<<<<<<;<:<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:57:722:347	83	seq1	599	99	35M	=	439	-195	ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:177:266:842	147	seq1	599	99	35M	=	784	220	ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT	=====)===========8=====7882855355'5	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:183:852:253	147	seq1	599	99	35M	=	773	209	ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<;;<8	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:30:887:404	147	seq1	600	99	35M	=	789	224	CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG	<<<<<<<<<<;<<<<<<<<<<<<<<<<:(<<<7;7	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:101:572:491	147	seq1	600	99	35M	=	425	-210	CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG	8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:2:73:730:487	83	seq1	604	99	35M	=	770	201	AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT	<<<<<<<<<<<<<<<<<<<9<<<<<<:<<<;<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:172:896:83	83	seq1	604	99	34M	=	786	217	AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGT	<<<<<<<<<<<<<<<<<:;;+;<<<<<<<<9;;;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:154:762:630	147	seq1	604	99	35M	=	792	223	AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:99:756:130	147	seq1	606	99	35M	=	798	227	GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:11:360:1577	83	seq1	606	99	35M	=	781	210	GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT	<<<<<<<<<<<<<<<<<4<;;<<;;<;<<<8<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:27:1881:486	83	seq1	607	99	35M	=	427	-215	AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC	99797;;9:<:;;;<;;;;<<<;;;;<;<;;<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:5:497:687	83	seq1	607	99	35M	=	789	217	AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:142:63:937	147	seq1	609	99	36M	=	777	204	GAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC	<<<<<<<<<<<<<<<<<:<<<<<<<<<;<<:<<:<:	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:36:485:632	147	seq1	610	99	36M	=	784	210	AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<;<18;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:8:36:927:478	83	seq1	610	99	35M	=	798	223	AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC	<<<<<<<<<<<<<<<<;<<<<<:<:<<<<8<9;<8	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:169:862:829	147	seq1	611	99	35M	=	772	195	AAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA	<<<<<<<<<<<<<<<<<;<<<;<;<<<<:<;;<78	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:63:424:1643	147	seq1	614	99	35M	=	798	219	GGTCTTTCAAAAGGTGATGTGTGTTCTCATCAACC	;;<<<<<<;<<<<<<<<<<5;9;<<<<<<<<<<;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:20:41:138	83	seq1	615	99	35M	=	774	194	GTCTTTCAAAAGGTGATGTGTGTTCTCATCAACCT	<<<<<<<<<<<<<<<<<<<<<<<<7<;<<<<<(<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:49:163:904	83	seq1	616	99	35M	=	450	-201	TCTTTCAAAAGGTGATGTGTGTTCTCATCAACCTC	79779<<<<<;;;;9;;<<7<;*9<<<7<<;<<;<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:135:543:760	83	seq1	619	99	35M	=	787	203	TTCAAAAGGTGATGTGTGTTCTCATCAACCTCATA	<<<<;;<;<<<<<<<9<<<<<<<<<<<;<<<<5<:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:131:742:561	147	seq1	620	99	35M	=	790	205	TCAAAAGGTGATGTGTGTTCTCATCAACCTCATAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:120:14:944	83	seq1	621	99	35M	=	428	-228	CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA	:;<<;<;<;<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:82:566:1096	147	seq1	621	99	35M	=	446	-210	CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA	<<<<<<<<<<:<<<<<<<:<<<<<<:<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:8:14:601:624	83	seq1	622	99	35M	=	446	-211	AAAAGGTGATGTGTGTTCTCATCAACCTCATACAC	1;;;;==5===.(=9=5=========8====;===	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:5:538:401	83	seq1	624	99	40M	=	788	204	AAGGTGATGTGTGTTCTCATCAACCTCATACACACACATG	<<<<;<<<<<<<<<<<<<<<;<::7<<;<53:<98;;;;;	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:16:1081:1894	83	seq1	624	99	35M	=	431	-228	AAGGTGATGTGTGTTCTCATCAACCTCATACACAC	;5;;&<;<<<<<<<<;<;<<;<<<;<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:3:1377:1663	147	seq1	626	99	35M	=	446	-215	GGTGATGTGTGTTCTCATCAACCTCATACACACAC	6-88663;8;81;;66;8;;89939;;;67;2;;;	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:253:285:104	83	seq1	627	99	35M	=	451	-211	GTGATGTGTGTTCTCATCAACCTCATACACACACA	2<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:66:1282:1215	83	seq1	627	99	35M	=	794	202	GTGATGTGTGTTCTCATCAACCTCATACACACACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:2:1200:1076	147	seq1	629	99	35M	=	786	192	GATGTGTGTTCTCATCAACCTCATACACACACATG	;;;;;;;;;;/;;;;;;;;6;;9;489;;;88888	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:194:688:289	83	seq1	631	99	35M	=	795	199	TGTGTGTTCTCATCAACCTCATACACACACATGGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<:;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:8:19:855:491	83	seq1	631	99	35M	=	783	187	TGTGTGTTCTCATCAACCTCATACACACACATGGT	<<<<<<<<<<<;<<.:<<<<;;;<4<:<:<7<;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:215:133:909	83	seq1	631	99	34M	=	789	193	TGTGTGTTCTCATCAACCTCATACACACACATGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<996(	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:35:378:681	83	seq1	632	99	35M	=	812	215	GTGTGTTCTCATCAACCTCATACACACACATGGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:40:758:116	147	seq1	632	99	40M	=	814	222	GTGTGTTCTCATCAACCTCATACACACACATGGTTTAGGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:7262	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:2:831:692	147	seq1	634	99	35M	=	462	-207	GTGTTCTCATCAACCTCATACACACACATGGTTTA	2749'979<9<<<6;<<<0<;<<<<<3<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:162:594:858	83	seq1	634	99	35M	=	818	219	GTGTTCTCATCAACCTCATACACACACATGGTTTA	<<<<<<<<<<<<<<<<<9<;<<<<<<<<<<3<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:233:478:792	83	seq1	634	99	35M	=	791	192	GTGTTCTCATCAACCTCATACACACACATGGTTTA	<<<<<<<<<<<<<<<<<<<+<<<<<<<9<<<+;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:262:297:601	83	seq1	635	99	35M	=	482	-188	TGTTCTCATCAACCTCATACACACACATGGTTTAG	;;<26;;;<;<7;<<<<<99<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:45:1769:1130	83	seq1	635	99	35M	=	476	-194	TGTTCTCATCAACCTCATACACACACATGGTTTAG	88989;<;97;9<<;<;;;;9<98<<<<<<<;<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:153:977:200	83	seq1	640	99	35M	=	472	-203	TCATCAACCTCATACACACACATGGTTTAGGGGTA	1:<83<<9;;9<<9;;<<;<<;;;;<;;<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:1:60:837:923	83	seq1	641	61	36M	=	457	-220	CATCAACCGCATACACTCACATGGTTTAGGGGTATA	0<4<<<02.<99+<+&!<<<<+<<<<<<<<<<<<3<	MF:i:18	Aq:i:24	NM:i:2	UQ:i:13	H0:i:0	H1:i:0
+EAS51_66:3:29:381:169	83	seq1	641	99	35M	=	494	-182	CATCAACCTCATACACACACATGGTTTAGGGGTAT	2<82<;66<:<;<:<;<;<8<<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:96:836:737	83	seq1	642	99	35M	=	841	234	ATCAACCTCATACACACACATGGTTTAGGGGTATA	<<<<<<71<<<<<<<<<<899<:5<<<96858<<.	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:228:354:203	147	seq1	643	99	35M	=	480	-198	TCAACCTCATACACACACATGGTTTAGGGGTATAA	%1<851<5<<<982<<<<<<<<::<<<<7<<<<3<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:151:159:43	147	seq1	645	99	35M	=	452	-228	AACCTCATACACACACATGGTTTAGGGGTATAATA	;;4;6<<;<<<<7<77<6;<6<<<<<;;<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:182:404:693	147	seq1	646	99	35M	=	812	201	ACCTCATACACACACATGGTTTAGGGGTATAATAC	<<<<<<<<<<<<<<<<<<<<<<:::<6<;<94;77	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:4:841:339	147	seq1	646	99	35M	=	793	182	ACCTCATACACACACATGGTTTAGGGGTATAATAC	<<<<<<<<<<<<<<<<<;<7<<&;;<5<+<;7<<;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:156:857:494	147	seq1	648	99	35M	=	838	225	CTCATACACACACATGGTTTAGGGGTATAATACCT	<<<<<<<<<<<<<<<<<6<<<<<<<<<<<<<<:<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:165:464:123	83	seq1	650	99	35M	=	814	199	CATACACACACATGGTTTAGGGGTATAATACCTCT	===============7==============8====	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:1:115:868:887	83	seq1	650	99	35M	=	452	-233	CATACACACACATGGTTTAGGGGTATAATACCTCT	==;==8=;=;=========================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:134:751:831	147	seq1	651	99	36M	=	465	-222	ATACACACACATGGTTTAGGGGTATAATACCTCTAC	;:<4<8<<<;<;<<5<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:192:716:235	147	seq1	651	99	35M	=	798	182	ATACACACACATGGTTTAGGGGTATAATACCTCTA	======================9==:<==:;;69;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:40:594:752	83	seq1	651	99	35M	=	831	215	ATACACACACATGGTTTAGGGGTATAATACCTCTA	<<<<<<<<<<;<<<;<<<::;<:;<;:<;;;<;<:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:184:17:636	89	seq1	652	76	35M	=	652	-35	TACACACACATGGTTTAGGGGTATAATACCTCTAC	8<89<<:<<<;;;<<<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:184:17:636	149	seq1	652	0	*	=	652	35	TTTTTTTTTTTTTTTTTTTTTTTTTTTTCACAGGT	!!!!!!!!!!!!!!!!!!!!!!!!!!!77777777	MF:i:-64
+EAS1_108:8:129:477:427	147	seq1	652	99	35M	=	481	-206	TACACACACATGGTTTAGGGGTATAATACCTCTAC	<<<9;<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:130:912:658	147	seq1	652	99	35M	=	841	224	TACACACACATGGTTTAGGGGTATAATACCTCTAC	<<<<<;<<<<<<;<<<<<<<<<<<<<<<<<7<;;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:85:401:1190	83	seq1	652	99	35M	=	458	-229	TACACACACATGGTTTAGGGGTATAATACCTCTAC	64778:;69739:;+9::7;;;<;6<;7;;;;;7<	MF:i:18	Aq:i:55	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:4:1502:1911	147	seq1	652	99	40M	=	802	190	TACACACACATGGTTTAGGGGTATAATACCTCTACATGGC	<<<:4<<<<<<;<<<<;9;5<95<;<<;9+;1612:1:::	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:198:691:595	147	seq1	655	99	35M	=	847	227	ACACACATGGTTTAGGGGTATAATACCTCTACATG	==============&===============;7;=1	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:186:989:869	147	seq1	655	99	35M	=	505	-185	ACACACATGGTTTAGGGGTATAATACCTCTACATG	;<<;:<<<7:<<<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:38:856:336	147	seq1	656	99	35M	=	480	-211	CACACATGGTTTAGGGGTATAATACCTCTACATGG	2;4;4<:;6:5:<<;:;<<;<<;<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:49:271:588	147	seq1	658	99	35M	=	830	207	CACATGGTTTAGGGGTATAATACCTCTACATGGCT	<<<<<<<<<<<<<<5:<<<<<<:<<<<<<<:7%9<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:240:593:842	147	seq1	660	99	35M	=	494	-201	CATGGTTTAGGGGTATAATACCTCTACATGGCTGA	*<<<;<<6<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:175:705:982	147	seq1	660	89	36M	=	496	-200	CATGGTTTAGGGGTATAATACCTCTACATGGCTGAT	')'''''')'''''*')*)'*)')))+,'*)+'*,!	MF:i:18	Aq:i:19	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS221_3:6:26:227:1053	147	seq1	663	99	35M	=	510	-188	GGTTTAGGGGTATAATACCTCTACATGGCTGATTA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:316:961:576	147	seq1	666	65	35M	=	488	-213	TTACGGGTGTAATCTCTCTACATGGCTAATTATGA	(++%%+++),+,+*++,+,,-,**+,-&-,+-+--	MF:i:-126	Aq:i:65	NM:i:5	UQ:i:36	H0:i:0	H1:i:0
+EAS56_63:5:96:788:614	147	seq1	667	99	35M	=	862	230	TAGGGGTATAATACCTCTACATGGCTGATTATGAA	<<<<<<<<<<<<<<<<<<<<<<;6;<<;;<;;7;9	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:13:1155:631	83	seq1	668	99	40M	=	524	-184	AGGGGTATAATACCTCTACATGGCTGATTATGAAAACAAT	;:398<<;<<<<<;<3<;;<<<<;;<<<<<<<<<<;<<;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:199:511:426	83	seq1	669	99	35M	=	509	-195	GGGGTATAATACCTCTACATGGCTGATTATGAAAA	<:7:<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:124:241:608	83	seq1	670	99	35M	=	856	221	GGGTATAATACCTCTACATGGCTGATTATGAAAAC	<<<<<<<<<;<<<<<<<<<;;<<<;<<<<;;8;;:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:59:396:359	147	seq1	670	99	35M	=	474	-231	GGGTATAATACCTCTACATGGCTGATTATGAAAAC	28288;;;;;;;;;::;;;;:;;;;;;;;;;;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:87:323:895	147	seq1	671	99	35M	=	494	-212	GGTATAATACCTCTACATGGCTGATTATGAAAACA	55777;;;939;9;;9;;;;9;;;;;;;;;;;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:28:708:463	147	seq1	672	99	36M	=	477	-231	GTATAATACCTCTACATGGCTGATTATGAAAACAAT	;;<;<<====3=====5===================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:84:101:328	83	seq1	673	99	35M	=	480	-228	TATAATACCTCTACATGGCTGATTATGAAAACAAT	<<<<<<<<:<<<<<<<<<6<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:30:92:753	147	seq1	673	99	35M	=	497	-211	TATAATACCTCTACATGGCTGATTATGAAAACAAT	<<<<<<;<<<<<<:<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:8:88:90:59	73	seq1	674	37	35M	=	674	0	ATAATACCTCTACATGTCTGATTATGAAAACAATG	<<<<<<<4;7;<<<;;47;&9..1;6&4<755;1;	MF:i:64	Aq:i:0	NM:i:1	UQ:i:19	H0:i:0	H1:i:1
+EAS112_32:8:88:90:59	133	seq1	674	0	*	=	674	0	TGCACCTCCCTGTTCACCTAGATGCTAGGAGGACA	=7595=92=72.=+5(:4=9092((.2&(&%07%.	MF:i:-64
+B7_593:1:12:158:458	147	seq1	675	84	36M	=	503	-208	TAATAATGCTACATGGATGATTATGAAATCAATGTT	++++++$((+*+++++++++++++&+++++++++++	MF:i:18	Aq:i:15	NM:i:5	UQ:i:40	H0:i:0	H1:i:0
+B7_593:4:28:781:723	83	seq1	676	99	36M	=	855	215	AATACCTCTACATGGCTGATTATGAAAACAATGTTC	<<<<<<<<<7<<<;;<<;;<<;<5<4<7<;7<+:<9	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:27:856:401	147	seq1	679	99	35M	=	871	227	ACCTCTACATGGCTGATTATGAAAACAATGTTCCC	======6===;2==;===;=+=92=;5+=&556:6	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:245:323:744	83	seq1	679	99	35M	=	499	-215	ACCTCTACATGGCTGATTATGAAAACAATGTTCCC	/.848299;&;9;9;=2.=7========;;=====	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:31:948:254	83	seq1	680	99	35M	=	849	204	CCTCTACATGGCTGATTATGAAAACAATGTTCCCC	<<<<<<<<<<<<<<<<<<<;<<<<<:<<8<;;;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:277:590:364	83	seq1	681	99	35M	=	503	-213	CTCTACATGGCTGATTATGAAAACAATGTTCCCCA	:::<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:201:959:19	147	seq1	681	99	35M	=	493	-223	CTCTACATGGCTGATTATTAAAACAATGTTCCCCA	;4;.9<:0&/<5<::<<9/.<<<<<<<<<<<<;<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS56_61:8:7:171:402	147	seq1	682	99	35M	=	489	-228	TCTACATGGCTGATTATGAAAACAATGTTCCCCAG	:086::::847:<7<<7<<<<<<;7<<;<<<<7<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:67:317:249	83	seq1	683	26	35M	=	840	192	CTACATGGCTGATTATGAAATCTATGTTCCCCATA	<<<<<<;<<<<;:;<<7;<<.<&3<;;<<(;;6.<	MF:i:18	Aq:i:26	NM:i:3	UQ:i:31	H0:i:0	H1:i:0
+EAS51_64:4:189:467:475	147	seq1	683	99	35M	=	493	-225	CTACATGGCTGATTATGAAAACAATGTTCCCCAGA	*.;*;7<75<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:8:46:900:610	147	seq1	684	99	35M	=	491	-228	TACATGGCTGATTATGAAAACAATGTTCCCCAGAT	<;5<;<<<;<<<<<<;<<<<<<<<<<8<<<<<8<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:232:351:909	83	seq1	685	80	36M	=	843	194	ACATGGCTGATTATGAAATCAATGTTCCCCAGATGC	<<<<<99<<<<<<99<7<'<9<<<6<<+<;7;<<&;	MF:i:18	Aq:i:39	NM:i:2	UQ:i:11	H0:i:0	H1:i:1
+EAS139_11:6:11:285:1567	83	seq1	685	99	35M	=	525	-195	ACATGGCTGATTATGAAAACAATGTTCCCCAGATA	<8<4<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:172:622:707	147	seq1	685	99	35M	=	511	-209	ACATGGCTGATTATGAAAACAATGTTCCCCAGATA	92<3996;<<<<<<<<<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:6:882:784	83	seq1	686	99	35M	=	496	-225	CATGGCTGATTATGAAAACAATGTTCCCCAGATAC	4;7<;64<<:<<4<<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:80:760:490	147	seq1	686	99	35M	=	520	-201	CATGGCTGATTATGAAAACAATGTTCCCCAGATAC	%::::+<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:68:1122:79	147	seq1	687	99	40M	=	528	-199	ATGGCTGATTATGAAAACAATGTTCCCCAGATACCATCCC	::77*:1<<<<<<<<<<<<<<<:;<<<;<<<<<<8<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:264:988:663	83	seq1	688	99	35M	=	875	222	TGGCTGATTATGAAAACAATGTTCCCCAGATACCA	<<<<<<<<<<<1<4<<<4<<0<;<-<74*(<&51-	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:3:233:911	147	seq1	688	99	35M	=	868	215	TGGCTGATTATGAAAACAATGTTCCCCAGATACCA	<<<<<<<<<<<<<<<<<;<<<<<<<<<<;<;<<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:187:925:547	83	seq1	689	99	35M	=	857	203	GGCTGATTATGAAAACAATGTTCCCAAGATACCAT	43<<<:9<;;;:7<<<<6<:<8<-4-/,81<(48:	MF:i:18	Aq:i:37	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS56_65:5:75:637:650	147	seq1	691	99	35M	=	868	212	CTGATTATGAAAACAATGTTCCCCAGATACCATCC	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:27:973:518	147	seq1	691	99	35M	=	549	-177	CTGATTATGAAAACAATGTTCCCCAGATACCATCC	+<<<<<<9<<<<<<<<<<<;<;<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:20:492:850	147	seq1	694	10	35M	=	526	-203	AGTATGAAAACAATGTTCCCCAGATGCCGTCCCGG	:.5:+.;;&91:;79:766:1:9+6&:1&&:+:))	MF:i:18	Aq:i:10	NM:i:4	UQ:i:31	H0:i:0	H1:i:0
+EAS51_64:4:318:345:156	83	seq1	695	99	35M	=	522	-208	TTATGAAAACAATGTTCCCCAGATACCATCCCTGT	;8<8<<<<<;<<:<<;<;77<<<<<;<<;<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:5:863:302	83	seq1	698	99	35M	=	866	203	TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:4:7:526:343	147	seq1	698	99	35M	=	515	-218	TGAAAACAGTGTTCCCCAGATACCATCCCTGTCTT	(7:;;;<<;;;<1<1<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS114_26:2:73:513:102	83	seq1	698	99	35M	=	868	205	TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT	===========================;=======	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:6:251:1557	83	seq1	700	99	35M	=	526	-209	AAAACAATGTTCCCCAGATACCATCCCTGTCTTAC	<<<<<<<<<<<<6:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:147:64:416	83	seq1	701	99	35M	=	870	204	AAACAATGTCCCCCAGATACCATCCCTGTCTTACT	<<<<<<<<<<<<<<<;<<<<<;<<<<;;:<;;;;;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_595:3:297:637:86	147	seq1	704	99	35M	=	869	200	CAATGTTCCCCAGATACCATCCCTGTCTTACTTCC	<<<<<<<<<<<<;+<+;<;<:<<<<<9<<957<;(	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:160:272:398	147	seq1	705	99	35M	=	891	221	AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA	9<<<3<<<<<<<<<<<9<<;8<<<<;<+.;;89..	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:4:679:110	147	seq1	705	99	35M	=	549	-191	AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:163:312:891	147	seq1	709	99	35M	=	543	-201	TTCCCCAGATACCGTCCCTGTCTTACTTCCAGCTC	0.<;;8<<<0<<<<<<<<<<6<<<<<<8<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_28:3:78:773:660	83	seq1	711	99	36M	=	534	-213	CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC	7<;7<<<7;9<<8;<<<<<<;<<<<<<<<<<7<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:5:63:875:1339	147	seq1	711	99	35M	=	879	203	CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCC	<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:243:876:758	147	seq1	712	99	35M	=	541	-206	CCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC	0%3<1;.70;3363;31;<<<<<<6<<<;<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:104:153:698	147	seq1	713	99	36M	=	896	219	CCAGATACCATCCCTGTCTTACTTCCAGCTCCCCAG	;<<<<<<;6<<<<<<<<<<;<<<<;<;;;<.<::50	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:86:498:373	147	seq1	716	99	35M	=	894	213	GATACCATCCCTGTCTTACTTCCAGCTCACCAGAG	<<<<<<<<<<<<<<<<<<<<<<<5:<<<:<;7+67	MF:i:18	Aq:i:69	NM:i:1	UQ:i:25	H0:i:1	H1:i:0
+EAS1_95:6:87:734:888	147	seq1	717	99	35M	=	900	218	ATACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG	===========;8=========;;=;====;;3(;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:238:31:968	147	seq1	717	99	35M	=	534	-218	ACACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG	=(.7=5%===9:7==+==77===============	MF:i:18	Aq:i:69	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS54_65:3:290:558:349	83	seq1	719	99	35M	=	869	185	ACCATCCCTGTCTTACTTCCAGCTCCCCAGCGGGA	<<<;<<;<;<188<<<8::<686+4:<<6:&3)*&	MF:i:18	Aq:i:59	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_28:5:206:671:49	83	seq1	719	99	36M	=	557	-198	ACCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA	;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:278:918:892	147	seq1	720	99	35M	=	541	-214	CCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA	=6=3=<===&=========================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:1:191:462:705	147	seq1	721	99	36M	=	545	-212	CATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAG	<<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:9:55:730	83	seq1	722	99	36M	=	540	-218	ATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAGC	<:<;;<6<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:45:462:455	147	seq1	723	99	35M	=	874	186	TCCCTGTCTTACTTCCAGCTCCCCAGACGGAACGC	<<<<<<8<<<;<;<<<;<<<<<<<6;8&:80;733	MF:i:18	Aq:i:43	NM:i:2	UQ:i:27	H0:i:0	H1:i:1
+EAS114_28:2:149:650:44	147	seq1	726	99	36M	=	902	212	CTGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC	<<<<<<<<<<<<<<<<<<<<<<<<<;6<<;<<7<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:297:283:948	83	seq1	727	99	35M	=	550	-212	TGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC	6;;3;6<<66<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:33:1168:1762	147	seq1	728	99	35M	=	552	-211	GTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCA	79<9;3<<<4<<<97<;;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:228:182:717	147	seq1	729	99	35M	=	563	-201	TCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAA	778;8;474<<<;2;;<2<<<<<<<<;<;;9<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:8:1351:1986	147	seq1	729	99	35M	=	911	217	TCTTACTTCCAGATCCCCAGAGGGAAAGCTTTCAA	<<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS51_64:4:163:31:455	147	seq1	730	99	35M	=	886	191	CTTACTTCCAGCTCCCCAGAGGGACAGCTNNCAAC	<+<<<<<<<;0+<<<<;06070-9(0(9<!!5)05	MF:i:18	Aq:i:31	NM:i:3	UQ:i:7	H0:i:0	H1:i:1
+EAS54_61:6:126:541:194	83	seq1	730	97	35M	=	540	-225	AGTACGACCAGCTCCCCAGAGGGAAAGCTTTCAAC	+%&:/+(46=47&71/2==;=;8====28212===	MF:i:18	Aq:i:43	NM:i:4	UQ:i:40	H0:i:1	H1:i:0
+EAS51_62:7:178:286:414	147	seq1	731	99	35M	=	907	211	TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG	<<<<<<<<<<<<<<<<8<<<<<<<<<1<<<1;998	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:35:361:546	147	seq1	731	99	35M	=	892	196	TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG	<<<<<<<<<<<<<<<<;<5<<<<<;<2<<<:<8<4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:90:247:212	147	seq1	733	99	35M	=	567	-201	ACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCT	7655:;87;<;;;8<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:149:354:667	83	seq1	734	99	35M	=	888	189	CTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCTT	<<<<<<<<<<<<<<<<<<<><<<<<<<<;<:<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:240:603:890	83	seq1	740	99	36M	=	590	-186	GCTCCCAAGAGGGAAAGCTTTCAACGCTTCTAGCCA	;+&+//&<<<<<<<<<<9<<<8<<<<9<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_591:7:129:956:115	147	seq1	740	99	36M	=	927	223	GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;877-	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:168:528:288	83	seq1	740	99	35M	=	570	-205	GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCC	8<%<31;<<;<;<<<<<<<;<<<<<<<<<<;<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:275:851:240	147	seq1	743	99	35M	=	561	-217	CCCCAGAGGGAAAGCTTTCAACGTTTCTAGCCATT	66614/&3616630666&66666&66666868666	MF:i:18	Aq:i:31	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS188_7:6:205:873:464	147	seq1	743	99	35M	=	552	-226	CCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCATT	<-((+:+;289<--;<;-;<:;;<<<;;<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:37:610:260	147	seq1	745	99	35M	=	913	203	CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC	<<<;<;<<7<<<<<<<<<<<<<<;6<963;;;3;1	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:93:945:176	147	seq1	745	99	35M	=	582	-198	CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC	6;;;8<<3<<8.<;6)<<<<<9<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:61:628:681	83	seq1	746	99	36M	=	586	-196	CAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTCTT	95<<<<<<<<;<<<<;<<<:<<;;<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:288:552:440	83	seq1	747	87	35M	=	560	-222	AGAGGGAACGCTTTCAACTCTTCTAGCCATTTCTT	9<<%'%<<.2<<<<<<<<5:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:26	NM:i:2	UQ:i:33	H0:i:0	H1:i:0
+EAS56_53:2:170:265:818	147	seq1	748	10	35M	=	920	207	GAGGGGAAGCTTTCAACGCTTCTAGCACTTTCTTT	<<<<<(5/959<8.<9<8<<<2<&59&&:22:8+(	MF:i:18	Aq:i:10	NM:i:3	UQ:i:17	H0:i:0	H1:i:0
+B7_595:2:251:121:479	83	seq1	750	99	35M	=	572	-213	GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG	<<<<<6'..663;&<<;<<9<<<9<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:67:1797:1931	147	seq1	750	99	35M	=	562	-223	GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:226:302:758	83	seq1	751	99	35M	=	556	-230	GGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGG	;<<<<9;<<<<<<<<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:33	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:163:618:570	83	seq1	751	99	35M	=	571	-215	GGAAAGCTGTCAACGCTTCTAGCCATTTCTTTTGG	<9774<88&:8<:8<8:8<8<<<<<;88<88<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS1_97:3:73:292:429	83	seq1	752	99	35M	=	920	203	GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTTGC	<<<<<<<<<<7<<;<<<<<<<2<<<5<<<<<:%)<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_108:3:82:356:253	83	seq1	752	99	35M	=	927	210	GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC	===================<========;===39=	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:62:386:959	147	seq1	752	99	35M	=	594	-193	AAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC	%;71131((<<6<92(+<1<<;<-3<8<<;<;;<<	MF:i:18	Aq:i:57	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_62:3:263:74:407	83	seq1	754	99	35M	=	574	-215	AAGCTTTCAACGCTTCTAGCCATTTCTTTTGGCAT	;;88<::+;<)<5<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:67:620:344	83	seq1	755	99	35M	=	905	185	AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT	<<<<2<:2<<<<<<7<<<<:<<*<<<<<<***3<<	MF:i:18	Aq:i:33	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:148:776:486	83	seq1	755	99	35M	=	578	-212	AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT	;:<<<;<<;<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:150:933:810	83	seq1	755	99	35M	=	593	-197	AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT	:89===:=:=;;==;====================	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:102:467:897	83	seq1	756	97	35M	=	940	219	GCTTTCAACGCTTCTAGCCATTTCTTTTGTCTTTT	<<<<9<<<<9<2<<<&,/</<<<<7<<;&&<$;*<	MF:i:18	Aq:i:37	NM:i:2	UQ:i:8	H0:i:1	H1:i:0
+EAS114_39:1:12:884:219	147	seq1	756	99	35M	=	584	-207	GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTT	7;::<:<<<7<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:40:1596:1433	147	seq1	756	99	40M	=	587	-209	GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT	-:8:1841<4;<88<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:7:761:623	83	seq1	757	99	35M	=	938	216	CTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTG	<<<<<<<<<<<<<8<<<<;;<0<<<<<;;<;<;;&	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:246:313:499	147	seq1	757	99	35M	=	592	-200	CTTTAAACGCTTCTAGCCATTTCTTTTGGCATTTG	+;77%;;;&:;:7;<<<<<6<:<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS139_11:6:89:1151:1878	147	seq1	757	99	35M	=	587	-205	CTTTCAACGATTCTAGCCATTTCTTTTGGCATTTG	8<66,,<<<<<<:<<<<<9<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_71:4:165:397:25	83	seq1	759	99	34M	=	576	-217	TTCAACGCTTCTAGCCATTTCTTTTGGCATTTGC	&(33'60;-'+'<7;<<*3-<;;183<<<;<;<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:59:1576:946	147	seq1	761	99	35M	=	578	-218	CAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT	9<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:256:407:470	147	seq1	762	99	35M	=	939	212	AACGCTTCTAGCCATTTCTTTTGGCATTTGCCTTC	<<<<<<<<;<;<<<<<<<<<;;<</<<;;83;7;9	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:148:437:481	147	seq1	764	99	36M	=	949	221	CGCTTCTAGCCATTTCTTTTGGCATTTGCCTTCAGA	<<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<;0;8	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:140:924:923	83	seq1	767	99	35M	=	597	-205	TTTTAGCCATTTCTTTTGGCATTTGCCTTCAGACC	<<&<<;;<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_103:4:143:560:194	83	seq1	768	99	35M	=	946	213	TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC	<<<<;;<<<<<<<<<<<6<;<<<<;;<<;9<999<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:178:192:499	83	seq1	768	99	35M	=	582	-221	TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC	86<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:4:1620:413	147	seq1	768	99	35M	=	588	-215	TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC	-<<<7<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:2:73:730:487	147	seq1	770	99	35M	=	604	-201	TAGCCATTTCTTTTGGCATTTGCCTTCAGACCCTA	<;;<<2;<;<<<;0<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:179:389:585	147	seq1	770	24	35M	=	953	218	TGGCCACTTTTTATCGCATTTCCCTTTAGAACCTA	<.4<9.4+.+'&-220<+<4<6<<20*6;<0(9<%	MF:i:-126	Aq:i:24	NM:i:7	UQ:i:103	H0:i:0	H1:i:0
+B7_595:1:252:19:955	147	seq1	771	84	35M	=	596	-210	AGCCAGTTCTTTTGGCATTTGCCTTCAGACCCTCC	<8<884<<<<<<68<<<<<<<2<;<<;<+<<<;<<	MF:i:18	Aq:i:41	NM:i:2	UQ:i:46	H0:i:0	H1:i:1
+EAS54_71:4:169:862:829	83	seq1	772	99	34M	=	611	-195	GCCATTTCTTTTGGCATTTGCCTTCAGACCCTAC	,1<6<<<<<7<<<<<<<<<<<<<<<<<7<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:6:7:858:437	147	seq1	773	99	35M	=	593	-215	CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC	7;<4;;:;80<;<;<<<<<<:<<;<<<;;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:183:852:253	83	seq1	773	99	35M	=	599	-209	CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC	;<9<;<<<<<<<<;<<<<<;<<<;<<<<;<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:20:41:138	147	seq1	774	99	35M	=	615	-194	CATTTCTTTTGGCATTTGCCTTCAGACCCTACACG	;;;<;<<<::<<<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:123:998:248	83	seq1	776	99	35M	=	589	-222	TTTCTTTTGGCATTTGCCTTCAGACCCTACACGAA	;:;5;<;:<9<<<<<:<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:142:63:937	83	seq1	777	99	36M	=	609	-204	TTCTTTTGGCATTTGCCTTCAGACCCTACACGAATG	;;;<;<<<<;<<<<<;:<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:20:762:748	83	seq1	777	99	35M	=	591	-221	TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT	=:747;7=;;==7=;==7===7==7;=========	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:149:953:349	83	seq1	777	99	35M	=	915	173	TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT	<<<<<<<<;<<<<<<<<<<<;7:<:<<:<:;;::;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:46:981:766	147	seq1	778	99	35M	=	933	190	TCTTTTGGCATTTGCCTTCAGACCCTACACGAATG	<<<<<<<<<<<<<;<<<<<-<;<<<<-<-<;-:6;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:204:779:181	83	seq1	779	99	35M	=	598	-216	CTTTTGGCATTTGCCTTCAGACCCTACACGAATGC	;:;/*<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:11:360:1577	147	seq1	781	99	35M	=	606	-210	TTTGGCATTTGCCTTCAGACCCTACACGAATGCGT	1<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:5:491:391	83	seq1	782	99	35M	=	917	170	TTGGCATTTGCCTTCAGACCCTACACGAATGCGTC	=========;===;==:4=========;3;==7;=	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:186:199:927	83	seq1	783	99	35M	=	802	54	TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT	<77<<<<2<;<<<<<06<<<<<<<<60<<684/6&	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:8:19:855:491	147	seq1	783	99	35M	=	631	-187	TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT	8<<<<;:<<<<:<<<<<:<;;<<<<<<<;<<<;<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:36:485:632	83	seq1	784	99	36M	=	610	-210	GGCATTTGCCTTCAGACCCTACACGAATGCGTCTCT	0;;;<<;<<<;<<<<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:177:266:842	83	seq1	784	99	35M	=	599	-220	GGCATTTGCCTTCAGACCCTACACGAATGCGTCTC	<9<<6;9<;9;;<<<<;;;9<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:65:1928:1125	147	seq1	784	99	35M	=	588	-231	GGCATTTGCCTTCAGACCCTACACGAATACGTCTC	<+<<<2<4<<<0<<4<<<<<6<<<6<<<'<<<<0<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:6	H0:i:0	H1:i:1
+EAS221_3:4:66:584:407	147	seq1	785	99	35M	=	954	204	GCATTTGCCTTCAGACCCTACACGAATGCGTCTCT	<<<*9<9<<<1<<<<<<<<*<59<4<)<2<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:172:896:83	147	seq1	786	99	35M	=	604	-217	CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA	;<.5.;;<+;<<<<<<<4<<<<<<<;<<<<<;<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:2:1200:1076	83	seq1	786	99	35M	=	629	-192	CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA	7779779;9;:;;4;;9;;:7;<<<7;;;:<;<<;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:135:543:760	147	seq1	787	99	35M	=	619	-203	ATTTGCCTTCAGACCCTACACGAATGCGTCTCTAC	;;.;;8;<8;<<32;<<<<<7<<<<<9<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:5:538:401	147	seq1	788	99	40M	=	624	-204	TTTGCCTTCACACCCTACACGAATGCGTCTCTGCCACAGG	671&7::49:&0<<<(<::<&<<<:<<<<<<<&<<<<1<<	MF:i:18	Aq:i:39	NM:i:2	UQ:i:10	H0:i:0	H1:i:1
+EAS54_71:6:215:133:909	147	seq1	789	99	35M	=	631	-193	TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA	7758;<;<;8<<<<;<;<<<<<:;<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:30:887:404	83	seq1	789	99	35M	=	600	-224	TTGCCTTCAGACCCTGCACGAATGCGTCTCTACCA	<<<<5<;::<<<;<<.<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:13	H0:i:0	H1:i:1
+EAS219_1:1:5:497:687	147	seq1	789	99	35M	=	607	-217	TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA	<8<<8<<<;<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:131:742:561	83	seq1	790	99	35M	=	620	-205	TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC	<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:65:556:1505	83	seq1	790	99	35M	=	593	-232	TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC	<6<8<<4<8;;;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:233:478:792	147	seq1	791	99	35M	=	634	-192	GCCTTCAGACCCTACACGAATGCGTCTCTACCACA	6<;9:<<9-<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:66:257:524	83	seq1	791	99	35M	=	959	203	GCCTTCAGACCCTACACGAATGCGTCTCTACCACC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<%	MF:i:18	Aq:i:73	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS56_53:4:154:762:630	83	seq1	792	99	35M	=	604	-223	CCTTCAGACCCTACACGAATGCGTCTCTACCACAG	<<-::<91<<<<;<;<<<<;<<<<<<<<;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:4:841:339	83	seq1	793	99	35M	=	646	-182	CTTCAGACCCTACACGAATGCGTCTCTACCACAGG	77-):22<<<33;<5<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:66:1282:1215	147	seq1	794	99	35M	=	627	-202	TTCAGACCCTACACGAATGCGTCTCTACCACAGGG	::;<;<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:194:688:289	147	seq1	795	99	35M	=	631	-199	TCAGACCCTACACGAATGCGTCTCTACCACAGGGG	;8;%28<;<<<<<<<<;<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:8:36:927:478	147	seq1	798	99	35M	=	610	-223	GACCCTACACGAATGCGTCTCTACCACAGGGGGCT	,6;;;3;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:99:756:130	83	seq1	798	99	35M	=	606	-227	GACCCTACACGAATGCGTCTCTACCACAGGGGGCT	;;<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:192:716:235	83	seq1	798	99	35M	=	651	-182	GACCCTACACGAATGCGTCTCTACCACAGGGGGCT	<5<<<8<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:63:424:1643	83	seq1	798	99	35M	=	614	-219	GACCCTACACGAATGCGTCTCTACCACAGGGGGCT	9+<<<+7<<<<<<<<<<<<<<<<<8<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:14:360:580	83	seq1	799	99	35M	=	963	199	ACCCTACACGAATGCGTCTCTACCACAGGGGGCGG	===========3===;5<==8;====79==.=5'5	MF:i:18	Aq:i:68	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS51_78:7:186:199:927	147	seq1	802	99	35M	=	783	-54	CTACGCGAATGCGTCTCTACCACAGGGGGCTGCGC	-;++)6<*8+;&<&/<<<<7<<71<<<<<6<<<7<	MF:i:18	Aq:i:57	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS139_19:3:4:1502:1911	83	seq1	802	99	40M	=	652	-190	CTACACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTTT	:+:::5/;99<;<&<*<-9<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:187:791:153	83	seq1	803	99	35M	=	958	190	TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG	<<<<<<<<<<<<<<<<<<<<<:+;;<;<88*6;68	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:63:527:1923	83	seq1	803	99	35M	=	981	213	TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG	<<<<<<<<<<<<<<<<<:<<<<3<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:31:98:804	83	seq1	805	99	35M	=	982	212	CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGC	=======9===;============5=;9=;=;==&	MF:i:18	Aq:i:74	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS218_4:7:89:1487:520	147	seq1	805	99	35M	=	997	227	CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGT	8<<<6/<<<<<<<<<:<<8<:<<3<<:668<86<3	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:69:88:1154	83	seq1	805	99	35M	=	992	222	CACGAATGCGTCTCTACCACAGGCGGCTGCGCGGT	<<<<<<<<<<<<<<<<<<<<<<<2<<<<:<<<<<7	MF:i:18	Aq:i:47	NM:i:1	UQ:i:17	H0:i:0	H1:i:1
+EAS114_26:1:99:212:522	147	seq1	806	99	35M	=	1002	231	ACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTT	================8==;====;=;===1==:8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:35:378:681	147	seq1	812	99	35M	=	632	-215	GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT	:<5-<);;;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:182:404:693	83	seq1	812	99	35M	=	646	-201	GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT	<;7;;4<<<<<<<7<<7<<<<<<<<<8<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:119:761:239	83	seq1	813	99	35M	=	999	221	CGTCTCTACCACAGGGGGCTGCGCGGTTTCCCATC	<<<<<<<<<<<<6<<<<<<;<2<<<<;<<<<<;;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:165:464:123	147	seq1	814	99	35M	=	650	-199	GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCA	9;<)<<%<<9<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:40:758:116	83	seq1	814	99	40M	=	632	-222	GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG	25/8/:<75:2<<<<<<7<<;<<<<<<<88;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:55:506:125	83	seq1	817	99	35M	=	982	200	TCTACCACAGGGGGCTGCGCGGTTTCCCATCATGA	<<<<<<<<<;<9<;<<;558<<<<5(5*<<<<<51	MF:i:18	Aq:i:35	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:162:594:858	147	seq1	818	99	35M	=	634	-219	CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA	90;<99;==99==;4=:========;=====;===	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:55:74:1040	83	seq1	818	99	35M	=	975	192	CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:100:708:1984	83	seq1	819	99	35M	=	1015	231	TACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<7%:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:92:367:1495	147	seq1	820	99	35M	=	987	202	ACCACAGGGGGCTGCGCGGTTTCCCATCATGAAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<6<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:49:905:27	147	seq1	821	68	35M	=	1000	214	CCACAGGGGGCTGCGCGGTTTCCCATCCTGAAGCA	<<;<.89<9.<2<9<:91+447.9,04&000(,+(	MF:i:18	Aq:i:31	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS218_4:7:87:964:826	147	seq1	822	99	35M	=	999	212	CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC	<<<<<<<<<<<<<<<<<<<<<<<<<<1<<8;4;;<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:38:1576:1923	147	seq1	822	99	35M	=	987	200	CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;<<;<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:122:337:968	83	seq1	823	85	35M	=	981	193	ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT	<<<<<;<<<<<<<<<<<<<<<<<<<;<<;;<;;;;	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:187:294:947	83	seq1	823	99	35M	=	1002	214	ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT	<<<<<<<<<<<<<<<<:<<<<<&<<%:<)7;7::4	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:49:271:588	83	seq1	830	99	35M	=	658	-207	GCTGCGCGGTTTCCCATCATGAAGCACTGAACTTC	:0=:===:<===;;===;=================	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:40:594:752	147	seq1	831	99	35M	=	651	-215	CTGCGCGGTTTCCCATCATGAAGCACTGAACTTCC	;7;9<;;;<;<;:<<;;<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:8:163:757:432	83	seq1	837	99	35M	=	1013	211	GGTTTCCCATCATGAAGCACTGAACTTCCACGTCT	<<<<<<<;<<<<<<<<;<;<<<<<<<<<<<<83:<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:156:857:494	83	seq1	838	99	35M	=	648	-225	GTTTCCCATCATGAAGCACTGAACTTCCACGTCTC	<<<8<:5<<;<<8<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:84:91:614	147	seq1	839	99	35M	=	1019	215	TTTCCCATCATGAAGCACTGATCTTCCACGTCTCA	;4<<<<<-84<<<;<<<<8<7.<4<<;77&:%<::	MF:i:18	Aq:i:39	NM:i:1	UQ:i:13	H0:i:0	H1:i:1
+EAS51_64:7:152:918:824	147	seq1	839	99	35M	=	1033	229	TTTCCCATCATGAAGCACTGAACTTCCACGTCTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:67:317:249	147	seq1	840	26	35M	=	683	-192	TTCCCATCATGACGCACCGAACTTCCACGTCTCAT	.5;7;++;<8.;&:7<<.5<<<<7<<7<<<<<<;7	MF:i:-126	Aq:i:26	NM:i:2	UQ:i:18	H0:i:0	H1:i:0
+EAS51_62:7:96:836:737	147	seq1	841	99	35M	=	642	-234	TCCCATCATGAAGCACTGAACTTCCACGTCTCATC	1<;<7;;1;8;;8:<<1<;<<;<<<<<<<<<<;<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:130:912:658	83	seq1	841	99	35M	=	652	-224	TCCCATCATGAAGCACTGAACTTCCACGTCTCATC	;=;;;<<<<<=55=;==<=======<=========	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:75:934:439	147	seq1	842	99	35M	=	1001	194	CCCATCATGAAGCACTGAACTTCCACGTCTCATCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:212:329:348	147	seq1	842	99	35M	=	1020	212	CCCATCATGAAGCACTGAACTTCCACGTCTCATCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:49:183:435	147	seq1	843	99	35M	=	1005	197	CCATCATGAAGCACTGAACTTCCACGTCTCATCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;:;8;:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:280:133:495	83	seq1	843	99	35M	=	1015	207	CCATCATGAAGCACTGAACTTCCACGTCTCATCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:232:351:909	147	seq1	843	80	36M	=	685	-194	CCATCATGAAGCGCTGAACTTCCACGTCTCATCTAG	:8%3<8====130=8==+===;=3=8===48==;3*	MF:i:18	Aq:i:39	NM:i:1	UQ:i:15	H0:i:0	H1:i:1
+EAS221_1:8:77:781:676	147	seq1	846	99	35M	=	1010	199	TCATGAAGCACTGAACTTCCACGTATCATCTAGGG	<<<<<<<5<<5<<<<<<<<<<<<13<<2<<<<<,<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:18	H0:i:0	H1:i:1
+EAS1_95:2:198:691:595	83	seq1	847	99	35M	=	655	-227	CATGAAGCACTGAACTTCCACGTCTCATCTAGGGG	:=:;=;===========;=================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:31:948:254	147	seq1	849	99	35M	=	680	-204	TGAAGCACTGAACTTCCACGTCTCATCTAGGGGAA	7;;;98<<7<<<<<<<<<<<<<<<<<<8<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:278:440:902	83	seq1	851	99	35M	=	1032	216	AAGCACTGAACTTCCACGTCTCATCTAGGGGAACA	=========<==<==============:;;=;=;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:74:674:124	147	seq1	854	99	35M	=	1041	222	CACTGAACTTCCACGTCTCATCTAGGGGAACAGGG	<<<<<<<<<<<<:<;<<<<;<<<<;9;<<;;.;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:28:781:723	147	seq1	855	99	36M	=	676	-215	ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG	8488<::;4;;<:;;;::<;7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:28:474:566	147	seq1	855	99	36M	=	1018	199	ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG	<<<<<<<<<<<<<<<<<<<<<<<:<;<;;<<7;8;<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:124:241:608	147	seq1	856	99	35M	=	670	-221	CTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG	9;;<<;<<<;<<<;<:<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:187:925:547	147	seq1	857	99	35M	=	689	-203	TGAACTTCCACGTCTCATCTAGGGGAACAGGGAGG	((988+&8<<;<09<;<<9<<4<<-<99<<;<9<;	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:9:512:826	83	seq1	859	99	35M	=	1021	197	AACTTCCACGTCTCATCTAGGGGAACAGGGAGGTG	67<<<;;;<;;<<;;<;<:;9;;;9;;;;<59777	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:194:696:490	83	seq1	862	99	35M	=	1026	199	TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC	<<<<<<<<<<<<<<<<<<<;5<<<<<:<1<8<<<8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:96:788:614	83	seq1	862	99	35M	=	667	-230	TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC	;9;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:81:786:340	147	seq1	863	99	35M	=	1033	205	TCCACGTCTCATCTAGGGGAACAGAGAGGTGCACT	<<<<7<<<<<<<<<<<<<<7<<;<&<<;;7<7;;;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS192_3:7:298:644:697	147	seq1	863	99	35M	=	1035	207	TCCACGTCTCATCTAGGGGAACAGGGAGGTGCACT	<<<<<<<<<<<<<<<::;;;6<8:;;9;98;668;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:178:305:843	147	seq1	864	99	35M	=	1037	208	CCACGTCTCATCTAGGGGAACAGGGAGGTGCACTA	<<<<<<<<<<<<<<<<<<<:<<<<<;<<:<<:<;:	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:5:863:302	147	seq1	866	99	35M	=	698	-203	ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT	:4:29:<<<9;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:30:788:376	83	seq1	866	99	35M	=	1038	207	ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT	<<<<<<<<<<<<:<<<<<<<<:<;<<(<7;7;:(;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:143:310:958	147	seq1	868	99	35M	=	1048	215	GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC	<<<<<<<<<<<8<8<<<<<;;7<<<;6;<<+4;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:3:233:911	83	seq1	868	99	35M	=	688	-215	GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:75:637:650	83	seq1	868	99	35M	=	691	-212	GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC	<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:73:513:102	147	seq1	868	99	35M	=	698	-205	GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC	==::===8=>=====>=>=>>>=>>==>=>>>>>>	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:297:637:86	83	seq1	869	99	35M	=	704	-200	TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG	<:75<;<;;<<<<<<;;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS54_65:3:290:558:349	147	seq1	869	99	35M	=	719	-185	TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG	2;2;;'5&;<<5<<;5/<<<<<7<<;+;<<+1<8<	MF:i:18	Aq:i:59	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS1_95:3:308:956:873	83	seq1	870	99	35M	=	1068	233	CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC	<<<<<<<<<<<<<;<;<;1<<<<<.<9<;<<<<+;	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:147:64:416	147	seq1	870	99	35M	=	701	-204	CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC	/;49;:6<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:30:812:345	147	seq1	871	99	36M	=	1036	201	TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCTC	<<<<<<<7<;<<7<;77;3<&0-;<5<;6<1'13<:	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:134:243:630	147	seq1	871	99	35M	=	1052	216	TCATCTAGGGGAACAGGGAGGCGCACTAATGAGCT	<<<:<<<<</<<<-<<<<6/<-<:<5+<::-2</2	MF:i:18	Aq:i:39	NM:i:2	UQ:i:29	H0:i:0	H1:i:1
+EAS54_81:2:27:856:401	83	seq1	871	99	35M	=	679	-227	TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCT	.'=.93======;;====;======;===;=;===	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:45:462:455	83	seq1	874	99	35M	=	723	-186	TCTAGGGGAACAGGGAGGTGCACTAATGCGCTCCA	62*<;;;;<<;<<9;;<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:264:988:663	147	seq1	875	99	35M	=	688	-222	CGAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC	(%<:4<4<<7<<1-:<1766<66<<<<+<:<;8;<	MF:i:18	Aq:i:60	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS56_63:1:145:71:26	147	seq1	875	99	35M	=	1040	200	CTAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC	<<<<<<<<<<<<<<<<<;<;;<<;<;<9<9;;99;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:101:825:28	147	seq1	879	99	35M	=	1079	235	GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC	<<86<<;<78<<<)<;4<67<;<;<74-7;,;8,;	MF:i:18	Aq:i:39	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS218_4:5:63:875:1339	83	seq1	879	99	35M	=	711	-203	GGGAACAGGGAGGTGCACTAATGCGCTCCACGCCC	;;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:290:270:557	83	seq1	880	99	35M	=	1052	207	GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA	<<<<<<<<<<<<<;<<<<9<:;<<<<<<5<0<<;+	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:134:853:558	147	seq1	880	99	35M	=	1071	226	GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA	==========================9=9=;<;<5	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:282:567:481	83	seq1	880	88	35M	=	1064	219	GGAACAGGGAGGCGCACTAATGCGCTCCACGCCCA	<<<<<<<<<<<<3<7<7<<<<;<<0)<<<<<<<<3	MF:i:18	Aq:i:43	NM:i:1	UQ:i:18	H0:i:0	H1:i:1
+EAS114_30:1:154:818:165	147	seq1	881	99	35M	=	1041	195	GAACAGGGAGGTGCACTAATGCGCTCCACGCCCAA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<:7;:;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:301:54:240	147	seq1	882	99	35M	=	1061	214	AACAGGGAGGTGCACTAATGCGCTCCACGCCCAAG	<<<<:<9<<<<:<<<<9<<<<<<690<<6</<(83	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:12:402:843	147	seq1	885	99	35M	=	1072	222	AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:262:965:756	83	seq1	885	99	35M	=	1069	219	AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<9;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:30:816:90	147	seq1	885	99	35M	=	1057	207	AGGGAGGTGCACTAATGCGCTCCACGCCCCAGCCC	<<<<<<<<<<<<<<<<<<<:<<<<<<::1&(1::7	MF:i:18	Aq:i:69	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS188_7:4:171:104:398	147	seq1	885	99	35M	=	1066	216	AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC	=========)===97===3===4===4==,)=/)=	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:163:31:455	83	seq1	886	99	35M	=	730	-191	GGGAGGTGCACTAATGCGCTCCACGCCCAAGCCCT	8;<<;<<<78+<=</<<=;23<=<<<<<<<<<<<<	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:149:354:667	147	seq1	888	99	35M	=	734	-189	GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC	;<;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:18:571:1110	83	seq1	888	99	35M	=	1070	217	GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC	7<<<<<<<<<<<<;<<<<<<<<<<<<788<<<;6<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:312:837:406	147	seq1	889	99	35M	=	1048	194	AGGTGCACTAATGCGCTCCACGCCCAAGCCCTTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:160:272:398	83	seq1	891	99	35M	=	705	-221	GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA	3:,<,;;<<;<<1<<<<<<<;<;<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:228:587:504	83	seq1	891	65	35M	=	1050	194	GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA	<<<<7<<7;7<<3<<<<7<<<<<*3<<<<74<:<*	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:35:361:546	83	seq1	892	99	35M	=	731	-196	TGCACTAATGCGCTCCACGCCCAAGCCCTTCTCAC	:4;4;;<<;4<8<;;<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:84:438:1505	83	seq1	893	99	40M	=	1068	215	GCACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTTC	35<<:;9<;<;5<<<:<3<<7:<9/<)<<:::9<&5;;+1	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:277:482:316	147	seq1	894	99	35M	=	1098	239	CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG	<<<<<<<<<<<<<<;<;<<<:<;<<<<;<<<1<1;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:86:498:373	83	seq1	894	99	35M	=	716	-213	CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG	):)4:<5<<<<;89<<<969<<<:<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:236:498:526	147	seq1	895	99	35M	=	1048	188	ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT	===================================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:43:1120:878	83	seq1	895	99	35M	=	1075	215	ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT	<<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<=7;7	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:104:153:698	83	seq1	896	99	36M	=	713	-219	CTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTT	69<<)9<<:5:6<<<16:<6/<6<1<<<<<:<:<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:166:42:147	83	seq1	898	99	35M	=	1048	185	AATGCGCTCCACGCCCAAGCCCTTCTAACAGTTTC	<<;<<<<<<<<<<<<<<<<;6<<64;)<<7;7;;;	MF:i:18	Aq:i:43	NM:i:1	UQ:i:8	H0:i:0	H1:i:1
+B7_595:2:178:77:424	83	seq1	900	99	35M	=	1058	193	TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG	<<<<<<<<<<<<<<<6<<;<<<<<<<<6<;<<<<6	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:87:734:888	83	seq1	900	99	35M	=	717	-218	TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG	56<<86;:<<<4;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:149:650:44	83	seq1	902	99	36M	=	726	-212	CGCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC	;8<<</<<:<<595<<9<<<<<<<<<<<<<<3<9<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:177:552:234	83	seq1	903	99	35M	=	1094	226	GCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC	<<<<<<<<<<<<<;<<<<<<<<9<969<<<<3<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:58:703:72	147	seq1	905	99	35M	=	1088	218	TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC	2<7<<<<<<<<<<<8:<<<<8<(<8<:::8.::<3	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:242:4:593	83	seq1	905	99	35M	=	1086	216	TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC	<<<<<<<<<<<8<<<<-<<<<<88;<;<<8<;88<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:67:620:344	147	seq1	905	99	35M	=	755	-185	CCCCCGCCCAAGCCCTTCTCACAGTTTCTGCCCCC	+++*+++#++++++,++++++++,,+,&+,,,,+,	MF:i:18	Aq:i:33	NM:i:2	UQ:i:19	H0:i:1	H1:i:0
+EAS51_62:7:178:286:414	83	seq1	907	99	35M	=	731	-211	CACGCCCAAGCCCTTCTCACAGTTTCTGCCCCCAG	68;38::<<;<<8;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:174:987:334	147	seq1	908	99	35M	=	1082	209	ACACCCAAGCCCTTCTCACAGTTTCTGCCCCCAGC	<<;4<<<<;;</4<4<+<<<<<;<<<<<</<93+2	MF:i:18	Aq:i:41	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS219_FC30151:1:55:8:1412	147	seq1	910	99	35M	=	1072	197	GCCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:8:1351:1986	83	seq1	911	99	35M	=	729	-217	CCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCATG	<8;<<<<<<<<<<<;<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:37:610:260	83	seq1	913	99	35M	=	745	-203	CAAGCCCTTCTCACAGTTTCTGCCCCCAGCATGGT	/74<.<4.&<<<:<<<<::<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:228:189:826	83	seq1	914	99	35M	=	1112	233	AAGCCCTTCTCACAGTTTCTGCCCCCCGCATGGTT	;9=========;=1======9=====1;=<3=:6;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:16	H0:i:0	H1:i:1
+EAS56_59:3:149:953:349	147	seq1	915	99	35M	=	777	-173	AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG	2;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:24:1374:211	83	seq1	915	99	35M	=	1064	184	AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG	;;:<<;<;:;;;;;;;;;;<::;;;6;;2+74917	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:5:491:391	147	seq1	917	99	35M	=	782	-170	CCCTGCTCACAGTTTCTGCCCCCAGCATGGTTGTA	-/+5-.&&:5+:92=6===========9=======	MF:i:18	Aq:i:62	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS114_32:2:306:119:56	83	seq1	919	99	35M	=	1083	199	CTTCTCACAGTTTCTGCCCCCAGCATGGTTGTACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:216:381:608	147	seq1	920	99	35M	=	1075	190	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	<<<<<<<<<<<<<<<<<<<<<<<<;;+<6:<;26;	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:73:292:429	147	seq1	920	99	35M	=	752	-203	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	;6;6;<<<<<;<<<<;<<<<<<<<7<<<<<<5<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:2:170:265:818	83	seq1	920	73	35M	=	748	-207	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	3+;%;.;;<<9+;3;;;<<<;57<1<;<<<<<<<;	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:278:906:933	83	seq1	920	99	35M	=	1071	186	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<.	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:190:95:706	83	seq1	920	99	35M	=	1078	193	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	<<<<<<<<<<<<<<9<<<<<;;<;<;;<<;<;;<,	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:278:848:765	83	seq1	920	99	35M	=	1088	203	TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:29:249:878	147	seq1	921	99	35M	=	1077	191	TCTCACAGTTTCTGCCCCCAGCATGGTTGTACTGG	<<<<<<<<<<<<<<<<<<<<<<:<:<<=<<:<<6&	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:259:467:737	147	seq1	923	99	36M	=	1102	215	TCACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCA	<<<<<<<<<<<<7<<<<<<<'<<.<<<<<<;;;<67	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:24:195:604	147	seq1	923	99	35M	=	1098	210	TCACAGTTTCTGCCCCCAGCATGGTTGTACTGTGC	<;<<<<<<<<<89<<<<<868<8;6<8;3(38&<8	MF:i:18	Aq:i:65	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_32:4:42:923:169	147	seq1	925	99	35M	=	1099	209	ACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAA	9<<<;9<<<<<;<;<<.<<;<;6<<<<1;8<<-0;	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:29:529:379	147	seq1	926	99	35M	=	1117	226	CAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAAT	<<<<<<<<8<<<<<<<<<<<<<<<<<;<672;<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:26:785:882	147	seq1	926	99	35M	=	1107	216	CAGTTTCTGCCCCAAGCATGGTTGTACTGGGCAAT	<<<0<<<<<<<<<6,<<)<<<<<<<&<<0<<,<'<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:21	H0:i:0	H1:i:1
+B7_591:7:129:956:115	83	seq1	927	99	36M	=	740	-223	AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC	<<:<9<4<<<<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:82:356:253	147	seq1	927	99	35M	=	752	-210	AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA	97;7<<;;<<<<<7;<<:<<<9<<;<<<9<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:134:379:893	83	seq1	927	99	35M	=	1095	203	AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA	<<<<<<<<<<<<<5<<<<;<<<<<;<:5;<<4+<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:256:404:584	83	seq1	928	99	35M	=	1096	203	GTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC	<<<<<<<<<<<<<<<<<<<<<7<3;<:;;3:3:</	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:76:333:905	147	seq1	929	99	35M	=	1076	182	TTTCTGCCCCCAGCATGGTTGTACTGGGCAATACA	<<<<<7;<;<<6<<6<<7<<7<)&<4+6)0+<;(0	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:11:646:628	83	seq1	930	99	36M	=	1106	212	TTCTGCCCCCAGCATGGTTGTACTGGGCAATACATG	<<<<<<<<<<6<<<<<<<<<<<<</<;<<<<<<6<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:136:389:320	83	seq1	930	99	35M	=	1100	205	TTCTGCCCCCAGCATGGTTGTACTGGGCAATACAT	7<<<<<;<<7<6<<;;<;<;;677<6;(27;<(97	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:6:93:334:858	83	seq1	932	99	35M	=	1106	209	CTGCCCCCAGCATGGTTGTACTTGGCAATACATGA	<<<<<<<<;<<<<;;<<9<<<<&;&<<9<9;/;&;	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_597:3:46:981:766	83	seq1	933	99	35M	=	778	-190	TGCCCCCAGCATGGTTGTACTGGGCAATACATGAG	/<<<;/;<<316<<<3<<<<7<<<7<<<;<<<<<7	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:209:159:130	83	seq1	934	99	34M	=	1109	210	GCCCCCAGCATGGTTGTACTGGGCAATACATGAG	<<<<<<8<<<<<<&<<+7<<4<<<22<;<<<<3<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:111:796:737	83	seq1	936	99	35M	=	1112	211	CCCCAGCATGGTTGTACTGGGCAATACATGTGATT	<<<<<<<<<<<<<<<:<<;7;<<<<993<4%:%<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS218_1:4:15:856:340	83	seq1	936	99	35M	=	1093	192	CCCCAGCATGGTTGCACTGGGCAATACATGAGATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<77<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_610:5:7:761:623	147	seq1	938	99	35M	=	757	-216	CCGGCATGGTTGTACTGGGCAATACATGAGATTAT	::';-8);<<<<;<1<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS1_97:5:84:927:843	83	seq1	938	99	35M	=	1138	235	CCAGCATGGTTGTACTGGGCAATACATGAGATTAT	<<<<<<<<<<<<<;9;;4;<<0<<7<<9<;<:<5<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:273:901:459	83	seq1	938	99	35M	=	1098	195	CCAGCATGGTTGTACTGGGCAATACATGAGATTAT	<<8<<<;<;8<;<;<;7+8<788<;;22<27;77;	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:256:407:470	83	seq1	939	99	35M	=	762	-212	CAGCATGGTTGTACTGGGCAATACATGAGATTATT	7.47;0;;5<4033*<<<<<9,<<<<<;<<<<<3<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:77:251:446	147	seq1	939	99	35M	=	1110	206	CAGCATGGTTGTACTGGGCAATACATGAGATTATT	<<9<<<<<<<<<<<<<97<<<<<<<<<96<<<+<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:102:467:897	147	seq1	940	97	35M	=	756	-219	AGCATGGTTGTACAGGGCAATACATGAGATTATTA	83333<+02<:<.&<+<.<::7<<::<<<<:<<<<	MF:i:18	Aq:i:37	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS221_1:6:92:1807:1185	83	seq1	940	99	35M	=	1119	214	AGCATGGTTGTACTGGGCAATACATGAGATTATTA	<<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<;<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:142:858:903	83	seq1	943	99	35M	=	1121	213	ATGGTTGTACTGGGCAATACATGAGATTATTAGGA	======;====5=======9======;===3=5=;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:143:560:194	147	seq1	946	99	35M	=	768	-213	GTTGTACTGGGCAATACATGAGATTATTAGGAAAT	9:<;7<:::<:<;<<<<<<<<<<:<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:148:437:481	83	seq1	949	99	36M	=	764	-221	GTACTGGGCAATACATGAGATTATTAGGAAATGCTT	<<<;<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:75:917:886	147	seq1	951	99	35M	=	1110	194	ACTGGGCAATACATGAGATTATTAGGAAATGCTTT	<<<<<<<<<<<<<<:<<<<<<<<<71<<<:6<:8<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:118:851:285	147	seq1	953	99	35M	=	1133	215	TGGGCAATACATGAGATTATTAGGAAATGCTTTAC	<<<<<<<<<<<<<<<<<<<<<<<;;<;<:<<<<;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:179:389:585	83	seq1	953	24	35M	=	770	-218	TGTGAAATGAATGAGATTATTAGGAAATGCTTTAC	;<)<;*;9*+<;<<,,<,<4<4<<<<<;<4<9494	MF:i:18	Aq:i:24	NM:i:4	UQ:i:53	H0:i:0	H1:i:0
+EAS114_30:7:269:944:220	147	seq1	953	99	35M	=	1147	229	TGGGCAATACATGAGATTATTAGGAAATGCTTTAC	<<<<<<<8<<<<<<<<<<<<<<<;<<<<<;<<;81	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:93:1002:845	147	seq1	954	99	35M	=	1129	210	GGGCAATACATGAGATTATTAGGAAATGCTTTACT	<<<<<<<<<<<<<<<<<<<<<:<<;<<<;<<<</<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:66:584:407	83	seq1	954	99	35M	=	785	-204	GGGCAATACATGAGATTATTAGGAAATGCTTTACT	<<84<<<766<<<.6<<<<<<4<<7<<<<<<<7<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:63:48:631	147	seq1	957	99	35M	=	1143	221	CAATACATGAGATTATTAGGAAATGCTTTACTGTC	<<<<<<;<<7</<<<<<<;;;<<<;<;<<7;;);<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:187:791:153	147	seq1	958	99	35M	=	803	-190	AATACATGAGATTATTAGGAAATGCTTTACTGTCA	:;55&<99<<1<;<<8<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:72:1809:1398	83	seq1	958	99	35M	=	1145	222	AATACATGAGATTATTAGGAAATGCTTTACTGTCA	<<<<<<<<<<<<<<<<<<::<9<<<<<<<<<6<<:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:66:257:524	147	seq1	959	99	35M	=	791	-203	ATACATGAGATTATTAGGAAATGCTTTACTGTCAT	<;<<<<<<<<3<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:247:522:670	147	seq1	960	99	35M	=	1121	196	TACATGAGATTATTAGGAAATGCTTTACTGTCATA	<<<<<<<<<<<<<<<;<<<<<<<<<<<<<5;<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:37:400:627	147	seq1	961	99	35M	=	1154	228	ACATGAGATTATTAGGAAATGCTTTACTGTCATAA	<<<<<<7+<<<<<<2615<<6<<<<5<<1<<;:74	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:329:177:267	147	seq1	962	99	35M	=	1139	212	CATGAGATTATTAGGAAATGCTTTACTGTCATAAC	<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<9;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:166:203:416	147	seq1	963	99	35M	=	1136	208	ATGAGATTATTAGGAAATGCTTTACTGTCATAACT	<<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<<97<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:14:360:580	147	seq1	963	99	35M	=	799	-199	ATGAGATTATTAGGAAATGCTTTACTGTCATAACT	<,1<;<;;<<<<<1<<<;<7<<6<:;;<<<<<<;;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:193:38:987	147	seq1	964	99	35M	=	1158	229	TGAGATTATTAGGAAATGCTTTACTGTCATAACTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;:;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:39:59:738	147	seq1	965	99	35M	=	1142	212	GAGATTATTAGGAAATGCTTTACTGTCATAATTAT	3<8.<<<<<<<-<<<<3<388;;880<0<0)-722	MF:i:18	Aq:i:43	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS51_66:4:209:92:210	147	seq1	965	99	35M	=	1156	226	GAGATTATTAGGAAATGCTTTACTGTCATAACTAT	<<<<<<<<<<<<<<<<;<<<<<<<5<7<<;;;<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:86:308:648	83	seq1	970	99	35M	=	1161	226	TATTAGGAAATGCTTTACTGTCATAACTATGAAGA	=8=====;=8======;=======35==;=;.;25	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:206:563:262	147	seq1	971	99	35M	=	1137	201	ATTAGGAAATGCTTTACTGTCATAACTATGAAGAG	<<<<<<<<<;<<<<<<<<<<<<;<<<<<<<-;<4;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:82:822:767	83	seq1	972	99	35M	=	1165	228	TTAGGAAATGCTTTACTGTCATAACTATGAAGAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<.<,<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:207:926:427	147	seq1	973	99	35M	=	1159	221	TAGGAAATGCTTTACTGTCATAACTATGAAGAGAC	<<<<<<7<<<<<;<<<<<6:<;<6<&<58<<6:::	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:144:28:475	83	seq1	974	99	35M	=	1167	228	AGGAAATGCTTTACTGTCATAACTATGAAGAGACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<::8<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:55:74:1040	147	seq1	975	99	35M	=	818	-192	GGAAATGCTTTACTGTCATAACTATGAAGAGACTA	;;;;;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:274:176:479	83	seq1	976	99	35M	=	1144	203	GAAATGCTTTACTGTCATAACTATGAAGAGACTAT	<<<<<<<<<<<<<;<<<<<<<<<<;<<9<59<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:122:337:968	147	seq1	981	10	35M	=	823	-193	GCTTTACTGTCTAAACTATGAAGAGACTATTGCCA	%454<75!7<+!990<9<6<<<<6<</<<<<<<<<	MF:i:18	Aq:i:10	NM:i:3	UQ:i:24	H0:i:0	H1:i:0
+EAS114_28:7:157:786:424	83	seq1	981	99	36M	=	1171	226	GCTTTACTGTCATAACTATGAAGAGACTATTGCCAG	<<<<<<<<<<<<<;<<<<<<;<<;<<;<<<<+4:70	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:63:527:1923	147	seq1	981	99	35M	=	803	-213	GCTTTACTGTCATAACCATGAAGAGACTATTGCCA	9<<<8<-8;;8<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_95:7:55:506:125	147	seq1	982	99	35M	=	817	-200	CTTTACTGTCATAACTATGAAGAGACTACTGCCAG	118%67;1;8,4:187<4>::1:818;;&::<>.;	MF:i:18	Aq:i:35	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS54_81:2:31:98:804	147	seq1	982	99	35M	=	805	-212	CTTTACTGTCATAACTATGAAGAGACTATTGCCAG	====;========7=====================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:235:805:373	147	seq1	983	99	35M	=	1146	198	TTTACTGTCATAACTATGAAGAGACTATTTCCAGA	<<<<<<<<<<<<<<<<<<<<;<;<<<<<<;;<99;	MF:i:18	Aq:i:74	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS114_28:5:11:868:62	83	seq1	983	99	36M	=	1154	207	TTTACTGTCATAACTATGAAGAGACTATTGCCAGAT	<<<<<<<<<<<<<<<<<<<<:<<<;<<<<(7:7039	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:280:512:316	147	seq1	984	99	35M	=	1159	210	TTACTGTCATAACTATGAAGAGACTATTGCCAGCT	==<========6==4==6;;==:===;=2/:+8%6	MF:i:18	Aq:i:68	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_93:5:292:122:666	83	seq1	985	99	35M	=	1159	209	TACTGTCATAACTATGAAGAGACTATTGTCAGATG	<<<<<<6<<<<<<<<8;<<<<<<<<<<3&9+;;(;	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_53:1:23:403:981	83	seq1	985	99	35M	=	1151	201	TACTGTCATAACTATGAAGAGACTATTGCCAGATG	<8<<<;<<<<<<;<<<<<<8;<<<9<9,3;,6(91	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:33:1566:588	83	seq1	985	76	35M	=	1166	216	TACTGTCATAACTATGAAGAGCCTATTGCCAGATG	<;.;;;;6;;;;6;;29;;;<+9;;;.3;;73797	MF:i:18	Aq:i:37	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS139_11:7:92:367:1495	83	seq1	987	99	35M	=	820	-202	CTGTCATAACTATGAAGAGACTATTGCCAGATGAA	<8<88<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:38:1576:1923	83	seq1	987	99	35M	=	822	-200	CTGTCATAACTATGAAGAGACTATTGCCAGATGAA	8;<98<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:190:481:295	147	seq1	990	99	35M	=	1161	206	TCATAACTATGAAGAGACTATTGCCAGATGAACCA	<<<<<<<<<<<<<<<<<<<<<<9<<<<<9<7<2::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:168:117:441	83	seq1	990	99	35M	=	1151	196	TCATAACTATGAAGAGACTATTGCCAGATGAACCA	<<3<<<<<<<<<<<<<<<<<<<+<<17;<;:<995	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:239:796:221	147	seq1	992	99	35M	=	1160	203	ATAACTATGAAGAGACTATTGCCAGCTGACCCCCC	<<<7<<7<<7<<7<;<<<<<,;;,+'<+/+99%:'	MF:i:18	Aq:i:37	NM:i:4	UQ:i:26	H0:i:0	H1:i:1
+EAS220_1:4:69:88:1154	147	seq1	992	99	35M	=	805	-222	ATAACTATGAAGAGACTATTGCCAGATGAACCACA	<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:34:956:1309	83	seq1	994	99	35M	=	1168	209	AACTATGAAGAGACTATTGCCAGATGAACCACACA	<<<<<<7<<<<<<<<<<<6<<<<<<<<<<<:<8<8	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:229:717:121	83	seq1	995	99	35M	=	1150	190	ACTATGAAGAGACTATTGCCAGATGAACCACACAC	=================<)=<4<0=.<<<71;41&	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS219_1:1:67:191:668	83	seq1	995	99	35M	=	1134	174	ACTATGAAGAGACTATTGCCAGATGAACCACACCT	<<<<<<<<<<<<<<<<<6<<;<;<;<<<<<<6;%2	MF:i:18	Aq:i:74	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_64:3:309:303:278	147	seq1	996	99	35M	=	1178	217	CTATGAAGAGACTATTGCCAGATGAACCACACATT	<<<<<<<<<<<<<<<<+<<+<<7<<<<<5<<<;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:60:1020:1259	83	seq1	996	99	35M	=	1157	196	CTATGAAGAGACTATTGCCAGATGAACCACACATT	<;<<<<;<<<<<<<<<;<<<<<<<8<<<<<:<:<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:89:1487:520	83	seq1	997	99	35M	=	805	-227	TATGAAGAGACTATTGCCAGATGAACCACACATTA	4;;/<<<<<:<;<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:15:805:420	147	seq1	998	35	35M	=	1164	201	ATGAAGAGACTATTCACATGTGAACCACACATTTA	;73;;;;67.;1<<+*.;*&<4947<&474&*9*(	MF:i:-126	Aq:i:35	NM:i:4	UQ:i:33	H0:i:0	H1:i:0
+EAS56_57:3:119:761:239	147	seq1	999	99	35M	=	813	-221	TGAAGAGACTATTGCCAGATGAACCACACATTAAT	;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:142:457:584	83	seq1	999	99	35M	=	1160	196	TGAAGAGACTATTTCCAGATGAACCACACATTAAT	<<<<<<<<<<<<</<<,6<66<<<;<;;<*4744.	MF:i:18	Aq:i:41	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS218_4:7:87:964:826	83	seq1	999	99	35M	=	822	-212	TGAAGAGACTATTGCCAGATGAACCACACATTAAT	)6<<<<<<:;<6<<::<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:49:905:27	83	seq1	1000	68	35M	=	821	-214	GAAGAGACTATTGCCAGTTGAACCACACATTAATA	99515<<&<<6595-56%;86&<;<<<6<<<<6;<	MF:i:18	Aq:i:31	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS1_108:3:75:934:439	83	seq1	1001	99	35M	=	842	-194	AAGAGACTATTGCCAGATGAACCACACATTAATAC	==7=:=========================<====	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:99:212:522	83	seq1	1002	99	35M	=	806	-231	AGAGACTATTGCCAGATGAACCACACATTAATACT	<1<16<7<3<<;;<8<<<<<<<<<<<<;<<<<9<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:187:294:947	147	seq1	1002	99	35M	=	823	-214	AGAGACTATTGCCAGATGAACCACACATTAATACT	<<:<<8181;<8<<<<<<<<8<<<<<<<<<<<<<:	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:2:152:860:286	147	seq1	1004	99	35M	=	1171	202	AGACTATTGCCAGATGAACCACACATTAATACTAT	<;<<<;<<0:<3<:<<2<<<<<7+<7+47<9(999	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:49:183:435	83	seq1	1005	99	35M	=	843	-197	GACTATTGCCAGATGAACCACACATTAATACTATG	1<7<<<<;:<<<<<;<<<;<<<;<;<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:63:854:610	147	seq1	1005	99	35M	=	1180	210	GACTATTGCCAGATGAACCACACATTAATACTATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:12:276:1797	83	seq1	1006	99	35M	=	1190	219	ACTATTGCCAGATGAACCACACATTAATACTATGT	<<<<<<<<<<<<:</<<9<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:190:42:671	147	seq1	1008	99	36M	=	1192	220	TATTGCCAGATGAACCACACATTAATACTATGTTTC	<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:67:692:110	83	seq1	1009	99	35M	=	1175	201	ATTGCCAGATGAACCACACATTAATACTATGTTTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:61:183:767	83	seq1	1010	99	35M	=	1195	220	TTGCCAGATGAACCACACCTTAATACTATGTTTCT	<<<<<<<<<<;<<<9<9<+<<<8<<<<<<;8<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS221_1:8:77:781:676	83	seq1	1010	99	35M	=	846	-199	TTGCCAGATGAACCACACATTAATACTATGTTTCT	:<;<2<<<<<<26<<<<6<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:21:132:1423	83	seq1	1012	99	35M	=	1178	201	GCCAGATGAACCACACATTAATACTATGTTTCTTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:8:163:757:432	147	seq1	1013	99	35M	=	837	-211	CCAGATGAACCACACATTAATACTATGTTTCTCAT	1+<8<<<<<<;<5<;<<<<<;5<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_30:3:302:288:657	83	seq1	1013	99	35M	=	1173	195	CCAGATGAACCACACATTAATACTATGTTTCTTAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:97:1584:777	83	seq1	1013	99	35M	=	1200	222	CCAGATGAACCACACATTAATACTATGTTTCTTAT	<<;<;;;;<;<;<<;;;;;;;;;;;;;;:;79979	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:280:133:495	147	seq1	1015	99	35M	=	843	-207	AGATGAACCACACATTAATACTATGTTTCTTATCT	<:<9:<<7:<6<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:100:708:1984	147	seq1	1015	99	35M	=	819	-231	AGATGAACCACACATTAATACTATGTTTCTTATCT	:8<(8<)9<;<<<<+<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:182:313:319	83	seq1	1016	99	35M	=	1180	199	GATGAACCACACATTAATACTATGTTTCTTATCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<;<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:41:474:283	83	seq1	1018	99	35M	=	1182	199	TGAACCACACATTAATACTATGTTTCTTATCTGCA	<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<+<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:28:474:566	83	seq1	1018	99	36M	=	855	-199	TGAACCACACATTAATACTATGTTTCTTATCTGCAC	;<<<+<<<<5<<<<<<;;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:84:91:614	83	seq1	1019	99	35M	=	839	-215	GAACCACACATTAATACTATGTTTCTTATCTGCAC	<<;;<<<7<<<<<<<;<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:159:222:274	83	seq1	1019	99	35M	=	1189	205	GAACCACACATTAATACTATGTTTCTTATCTGCAC	=;9====;=9==59=+==9========9===5;7=	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:62:603:1552	147	seq1	1019	99	35M	=	1180	196	GAACCACACATTAATACTATGTTTCTTATCTGCAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:212:329:348	83	seq1	1020	99	34M	=	842	-212	AACCACACATTAATACTATGTTTCTTATCTGCAC	8<6:<:<<<;<<<;<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:233:97:262	83	seq1	1021	99	34M	=	1175	189	ACCACACATTAATACTATGTTTCTTATCTGCCCA	<<<<<<<<<<<;<;<<:<<<<<<<<<<<<.<&77	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_45:7:9:512:826	147	seq1	1021	99	35M	=	859	-197	ACCACACATTAATACTATGTTTCTTATCTGCACAT	76777:;;;;;;;;;;;;;;;;;;;;;;;;;:;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:29:794:282	147	seq1	1025	99	36M	=	1196	207	CACATTAATACTATGTTTCTTATCTGCACATTACTA	<<<<<<<<<<<<<<<<<<<<<;<<<&<<;:<<8<<8	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:278:524:521	147	seq1	1025	99	35M	=	1224	234	CACATTAATACTATGTTTCTTATCTGCACATTACT	<<<;<<;<<<<<<<;<<<<<<<<<<7;5;<<<;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:39:966:551	83	seq1	1026	99	35M	=	1205	214	ACATTAATACTATGTTTCTTATCTGCACATTACTA	<<<<<<<<<<<<<<<<<<<<<<<<:<;<&<<&<<;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:194:696:490	147	seq1	1026	99	35M	=	862	-199	ACATTAATACTATGTTTCTTATCTGCACATTACTA	========;======;==========8==:=====	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:305:565:952	83	seq1	1030	99	36M	=	1213	219	TAATACTATGTTTCTTATCTGCACATTACTACCCTG	7<<<<<<<<<7<<<<<<<<<7<<<;;<;<;<<<<<+	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:287:258:321	83	seq1	1030	99	35M	=	1194	199	TAATACTATGTTTCTTATCTGCACATTACTACCCT	<<<<<<<<<<<;<<<<<<<<42:<+<<<;<<;;;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:278:440:902	147	seq1	1032	99	35M	=	851	-216	ATACTATGTTTCTTATCTGCACATTACTACCCTGC	<;7;4<;<;;;<<;<;;;<<<<<9<<<;<<<<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:180:905:36	83	seq1	1033	99	35M	=	1212	214	TACTATGTTTCTTATCTGCACATTACTACCCTGCA	==========8===;;=========;==77%41=;	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:152:918:824	83	seq1	1033	99	35M	=	839	-229	TACTATGTTTCTTATCTGCACATTACTACCCTGCA	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:81:786:340	83	seq1	1033	99	35M	=	863	-205	TACTATGTTTCTTATCTGCACATTACTACCCTGCA	;<;<<<;<<;<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:196:11:27	147	seq1	1035	65	36M	=	1198	199	CTATGTTTCTTATCTGCNCATTACTACCCTGCAATT	<<<<<<<<;<<<<<<<8!4<<<;+<88;8<+2,8<;	MF:i:18	Aq:i:24	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS192_3:7:298:644:697	83	seq1	1035	99	35M	=	863	-207	CTATGTTTCTTATCTGCACATTACTACCCTGCAAT	8:<8;<;:7;<<;4;:+<7<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:30:812:345	83	seq1	1036	99	36M	=	871	-201	TATGTTTCTTATCTGCACATTACTACCCTGCAATTA	;<;<<<<5<<<:<;<:<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:178:305:843	83	seq1	1037	99	35M	=	864	-208	ATGTTTCTTATCTGCACATTACTACCCTGCAATTA	<<<<<<<4<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:30:788:376	147	seq1	1038	99	35M	=	866	-207	TGTTTCTTATCTGCACATTACTACCCTGCAATTAA	:5<<4:88;9<<<<<;<<<<;<8<;<<<<1<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:1:145:71:26	83	seq1	1040	99	35M	=	875	-200	TTTCTTATCTGCACATTACTACCCTGCAATTAATA	882;8;<;;887<<<;;<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:157:42:763	147	seq1	1040	99	35M	=	1203	198	TTTCTTATCTGCACATTACTACCCTGCAATTATTA	<<;<;<<<<<;<:4<<<<<<<<<;;4<<<:;;+;+	MF:i:18	Aq:i:61	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+B7_589:8:74:674:124	83	seq1	1041	99	35M	=	854	-222	TTCTTATCTGCACATTACTACCCTGCAATTAATAT	;;;;;<<:<<:<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:154:818:165	83	seq1	1041	99	35M	=	881	-195	TTCTTATCTGCACATTACTACCCTGCAATTAATAT	;;;;<<<;<;;<;<<<<;<<;;;<<;<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:319:174:811	83	seq1	1044	99	35M	=	1242	233	TTATCTGCACATTTCTACCCTGCAATTAATATAAT	<<<<<<<<<;<<<<<<<<<;;<<<<<<<8<<;9<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_19:3:87:133:930	147	seq1	1044	99	40M	=	1198	194	TTATCTGCACATTACTACCCTGCAATTAATATAATTGTGT	<<<7<<<<;<<;7<<7<<;;<<<;<5;<;;;5;;<:/48:	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:44:1466:425	147	seq1	1044	99	35M	=	1213	204	TTATCTGCACATTACTACCCTGCAATTAATATAAT	<<<<<<<<<<<<<<<<<<<<<;<<<<<<;<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:236:498:526	83	seq1	1048	99	35M	=	895	-188	CAGCACATTACTACCCTGCAATTAATATAATTGTG	<%88<;<:8<<<<:<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_64:3:143:310:958	83	seq1	1048	99	35M	=	868	-215	CTGCACATTACTACCCTGCAATTAATATAATTGTG	84<;<6<<<<;<<<;;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:312:837:406	83	seq1	1048	99	35M	=	889	-194	CTGCACATTACTACCCTGCAATTAATATAATTGTG	;<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:166:42:147	147	seq1	1048	99	35M	=	898	-185	CTGCACATTACTACCCTGCAATTAATATAATTGTG	3.7;;;;:<<<77<<3<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:279:763:945	83	seq1	1048	99	36M	=	1210	198	CTGCACATTACTACCCTGCAATTAATATAATTGTGT	<<<<<<<<<<<<<<<<<<<4:<<47<:<;<<</<9<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:82:998:566	147	seq1	1050	99	35M	=	1227	212	GCACATTACTACCCTGCAATTAATATAATTGTGTC	<<<<<<<:<<0<<<<:<82<<::<4<<;<<4<4<;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:228:587:504	147	seq1	1050	65	35M	=	891	-194	GCACATTACGACCCGGCAAGGTGTATAATTGTGTC	;4;4;&&82&04+&&48;3&3&*<7<47<<;-<-8	MF:i:-126	Aq:i:65	NM:i:6	UQ:i:47	H0:i:0	H1:i:0
+B7_595:6:290:270:557	147	seq1	1052	99	35M	=	880	-207	ACATTACTACCCTGCAATTAATATAATTGTGTCCA	87:9;;;<851+:5.<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:134:243:630	83	seq1	1052	99	35M	=	871	-216	ACATTACTACCCTGCAATTAATATAATTGTGTCCA	63<;37:<*&:<<<,,*<<:7<<7<<<<<<<::<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:47:303:887	147	seq1	1052	96	35M	=	1240	223	ACATTACTACCCTGCCATTAATATACTTGTGTCCA	<<;;<+<9<<<<<9<(6<;//</<8(<<89;6084	MF:i:18	Aq:i:25	NM:i:2	UQ:i:14	H0:i:0	H1:i:0
+EAS221_3:8:74:770:1712	147	seq1	1052	99	35M	=	1208	191	ACATTACTACCCTGCAATTAATATAATTGTGTCCA	<<<<<<<<<<<<<<<<<<<5<<<<<<<<<<<<7<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:29:575:453	147	seq1	1056	99	36M	=	1228	208	TACTACCCTGCAATTAATATAATTGTGTCCATTTAC	<<<<<<<<<<<<<<<<<<<<<<<<7<1<:<9<&<98	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_97:5:318:177:383	147	seq1	1056	99	35M	=	1251	230	TACTACCCTGCAATTAATATAATTGTGTCCATGTA	;<<<<<<<<;<<<<<<<<<<<<<<<<<<7<;1'<;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:8:179:549:753	83	seq1	1056	99	35M	=	1218	197	TACTACCCTGCAATTAATATAATTGTGTCCATGTA	<<<<<<<<<<<<<<<<<<<<<<<<8<7<<<:<9<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:30:816:90	83	seq1	1057	99	35M	=	885	-207	ACTACCCTGCAATTAATATAATTGTGTCCATGTAC	:<3:%9299<<<<<<<<<5<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:2:178:77:424	147	seq1	1058	99	35M	=	900	-193	CTACCCTGCAATTAATATAATTGTGTCCATGTACA	:5:8<;<;:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:301:54:240	83	seq1	1061	99	35M	=	882	-214	CCCTGCAATTAATATAATTGTGTCCATGTACACAC	&..*3===1=========5.5==5===4====:5=	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:91:521:517	83	seq1	1061	99	35M	=	1239	213	CCCTGCAATTAATATAATTGTGTCCATGTACACAC	<<<<<<<<<<<<<<<<9<<<<<<<<<<8<<;;;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:24:1374:211	147	seq1	1064	99	35M	=	915	-184	TGCAATTAATATAATTGTGTCCATGTACACACGCT	77661;;;5;;:;;:;:;;;;;;8:;;;:;;;;;:	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:282:567:481	147	seq1	1064	88	35M	=	880	-219	TGCAATTAATATAATTGTGTCCACGTACACACGCT	<9<6<;<9<<<;<<<;<5<7<5</7<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS188_7:4:171:104:398	83	seq1	1066	99	35M	=	885	-216	CAATTAATATAATTGTGTCCATGTACACACGCTGT	79<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:9:80:353	147	seq1	1067	99	35M	=	1233	201	AATTAATATAATTGTGTCCATGTACACACGCTGTC	<<<<<<<<<<<<<<<<<<<<<6<<<;;<<5<<2;2	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:6:42:920:522	147	seq1	1067	99	35M	=	1244	212	AATTAATATAATTGTGTCCATGTACACACGCTGTT	<<<<<<<<<<<<<:<<<<<<<:<<<<<<<:;;::&	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_95:3:308:956:873	147	seq1	1068	99	35M	=	870	-233	ATAAAAATAAGTGTGTCCATGTACACACGCTGTCC	91.97&9499&-1*98*19999839999.9&9799	MF:i:18	Aq:i:31	NM:i:3	UQ:i:23	H0:i:0	H1:i:1
+EAS139_19:6:84:438:1505	147	seq1	1068	99	40M	=	893	-215	ATTAATATAATTGTGTCCATGTACACACTCTGTCCTATGT	:0::413::;:::0:179::3<;<:<9<&6<<<;<019<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS51_62:3:55:340:837	147	seq1	1069	99	35M	=	1238	204	TTAATATAATTGTGTCCATGTACACACGCTGTCCT	<<;<<;<<<<<8<;<<<;<7<<<;<<<<<93+79(	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:262:965:756	147	seq1	1069	99	35M	=	885	-219	TTAATATAATTGTGTCCATGTACACACGCTGTCCT	<<:<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:18:571:1110	147	seq1	1070	99	35M	=	888	-217	TAATATAATTGTGTCCATGTACACACGCTGTCCTA	9<<;<;==;;=;=<;<===================	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:40:918:950	147	seq1	1071	99	35M	=	1247	211	AATATAATTGTGTCCATGTACACACGCTTTCCTTT	=========,=9=====2=7===7=0==&=+3=-=	MF:i:18	Aq:i:65	NM:i:2	UQ:i:17	H0:i:1	H1:i:0
+EAS1_97:2:59:882:980	147	seq1	1071	99	35M	=	1263	227	AATATAATTGTGTCCATGTACACACGCTGTCCTAT	<<<<<<<<<8<<<<<9<+<<<9<<<1<<77889+6	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:134:853:558	83	seq1	1071	99	35M	=	880	-226	AATATAATTGTGTCCATGTACACACGCTGTCCTAT	<<<<8<<<7<<<<;;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:278:906:933	147	seq1	1071	99	35M	=	920	-186	AATATAATTGTGTCCATGTACACACGCTGTCCTAT	<88::<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:12:402:843	83	seq1	1072	99	35M	=	885	-222	ATATAATTGTGTCCATGTACACACGCTGTCCTATG	<7<+<<11<9<<<<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:160:434:853	147	seq1	1072	99	35M	=	1259	222	ATATAATTGTGTCCATGTACACACGCTGTCCTATG	<<<<<<<<<<<<<<<<<<<<<<,<<<<:<<<<,<:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:55:8:1412	83	seq1	1072	99	35M	=	910	-197	ATATAATTGTGTCCATGTACACACGCTGTCCTATG	<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:219:294:861	147	seq1	1073	99	35M	=	1244	206	TATAATTGTGTCCATGTACACACGCTGTCCTCTGT	<<<<<<<<<<<<<9<<<5<9<<<9<<544<<'<+:	MF:i:18	Aq:i:69	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS220_1:4:14:1665:1772	147	seq1	1073	84	35M	=	1263	225	TATAATGGTGTCCATGTACACACGCTGTCCTATGT	<<<<<7*<<<<<<<<<78<5<<7<<5<556<(73(	MF:i:18	Aq:i:39	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+B7_591:3:45:294:380	147	seq1	1074	80	36M	=	1233	195	ATAATTGTGTCCATGTACACACGATGTCATATGTAC	<<<<<<<<9<<<<<<<<<70<<7<6272&:3<+</%	MF:i:18	Aq:i:39	NM:i:2	UQ:i:32	H0:i:0	H1:i:1
+EAS1_108:7:222:538:267	83	seq1	1074	99	35M	=	1228	189	ATAATTGTGTCCATGTACACACGCTGTCCTATTTA	<<<<<<<<<<<<<<<<<<<<<;<<<<74;;39%6+	MF:i:18	Aq:i:67	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_93:1:216:381:608	83	seq1	1075	99	35M	=	920	-190	TAATTGTGTCCATGTACACTCGCTGTCCTATGTAC	55<99<<<99;<;<<(<39&7<<<<<<<<<<<<<9	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS54_67:1:138:186:274	83	seq1	1075	99	35M	=	1231	191	TAATTGTGTCCATGTACACACGCTGTCCTATGTAC	=39====9===;=;=;=9=;=====;===-=+=-7	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:43:1120:878	147	seq1	1075	99	35M	=	895	-215	TAATTGTGTCCATGTACACACGCTGTCCTATGTAC	<<<;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:166:776:590	147	seq1	1075	99	35M	=	1252	212	TAATTGTGTCCATGTACACACGCTGTCCTATGTAC	<<<<<</<<<<<<<<<<<<<'<=<:26.</79<::	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:76:333:905	83	seq1	1076	99	35M	=	929	-182	AATTGTGTCCATGTACACACGCTGTCCTATGTACT	<<;<<<<;7<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:29:249:878	83	seq1	1077	99	35M	=	921	-191	ATTGTGTCCATGTACACACGCTGTCCTATGTACTT	<,;<9<;<:<<<<<<<<<<<<<<<<<<<<<<><<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:190:95:706	147	seq1	1078	99	35M	=	920	-193	TTGTGTCCATGTACACACGCTGTCCTATGTACTTA	9;97437;<;;<<;<;<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:101:825:28	83	seq1	1079	99	35M	=	879	-235	TGTGTCCATGTACACACGCTGTCCTATGTACTTAT	0;0'0;<<<<<<8<;<<<<;;3<<;;<<<8<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:188:460:1000	83	seq1	1080	99	35M	=	1251	206	GTGTCCATGTACACACGCTGTCCTATGTACTTATC	<<<<<<<<<<<<<<<<7<<;:4;44<;;:8;;9;;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:3:268:523:511	83	seq1	1081	99	35M	=	1241	195	TGTCCATGTACACACGCTGTCCTATGTACTTATCA	<<<<<<<<<<<<<<<<<<<<;<<<<6<:9<<3<44	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:54:263:585	83	seq1	1081	99	36M	=	1254	209	TGTCCATGTACACACGCTGTCCTATGTACTTATCAT	<<<<<<<<<<<<<<<<<<<:;<<;<:;::<<;;:;4	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:174:987:334	83	seq1	1082	99	35M	=	908	-209	GTCCATGTACACACGCTGTCCTATGTACTTATCAT	,;<;;<<<&<<<1<<<<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:224:932:942	83	seq1	1082	99	34M	=	1250	203	GTCCATGTACACACGCTGTCCTATGTACTTATCA	<<<<<<<<<<<<<<<<<<<<<<;<<<<7<<(;3,	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:12:1296:358	83	seq1	1082	96	35M	=	1252	205	GTCCATGTACACACGCTGTCCTATGTACTTATCAT	;;;6;7;7;;;;;7;9;;-*1;9;699/99/7477	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:306:119:56	147	seq1	1083	99	35M	=	919	-199	TCCATGTACACACGCTGTCCTATGTACTTATCATG	;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:66:179:118	147	seq1	1084	99	35M	=	1262	213	CCATGTACACACGCTGTCCTATGTACTTATCATGA	<<<<<<<<<<<<<<<<<<<<<<<<<<:<<;<<6<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:110:584:649	83	seq1	1084	99	35M	=	1266	217	CCATGTACACACGCTGTCCTATGTACTTATCATGA	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<::<38	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:28:315:310	147	seq1	1085	99	35M	=	1242	192	CATGTACACACGCTGTCCTATGTACTTATCATGAC	<<<<<<<<<<<<<<<<<<<<<:<+.<<.<+7<*17	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:242:4:593	147	seq1	1086	99	35M	=	905	-216	ATATACACACGCTGTCCTATGTACTTATCATGACT	1.%55877+8+88808887+7;7;18:8;;;.&;8	MF:i:18	Aq:i:53	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_93:1:131:946:353	147	seq1	1087	99	35M	=	1249	197	TGTACACACGCTGTCCTATGTACTTATCATGACTC	<<<<<<<<<<<<<;<<<<;;<<<<<<<;<:52;<2	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:4:1732:88	83	seq1	1087	99	35M	=	1265	213	TGTACACACGCTGTCCTATGTACTTATCATGACTC	<<<<<<<<<<<<<<<<<2<8;8<;<8;<2;2:<:<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:58:703:72	83	seq1	1088	99	35M	=	905	-218	GTACACACGCTGTCCTATGTACTTATCATGACTCT	5&<<7;+95;7'6<<<<<.<<<<<;<<9<7<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:113:694:725	147	seq1	1088	99	35M	=	1266	213	GTACACACGCTGTCCTATGTACTTATCATGACTCT	<<<<<<<<<<<<9<<<<<:<<<<<<<<<<:;;<;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:278:848:765	147	seq1	1088	99	35M	=	920	-203	GTACACACGCTGTCCTATGTACTTATCATGACTCT	7;;<;5<55<<;;<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:234:787:12	147	seq1	1092	97	35M	=	1257	200	ACACGCTGGCCTATGTACTTATAATGACTCTATCC	<;<<<9<<&+9;3;<993;<9<+94;9&41;08%9	MF:i:18	Aq:i:24	NM:i:2	UQ:i:15	H0:i:0	H1:i:0
+EAS218_1:4:15:856:340	147	seq1	1093	99	35M	=	936	-192	CACGCTGTCCTATGTACTTATCATGACTCTATCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:258:266:101	147	seq1	1094	99	35M	=	1285	226	ACGCTGTCCTATGTACTTATCATGACTCTATCCCA	<<<<<<<<<<<<<<<<<<5<;,<-2<<<<;68<<6	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:177:552:234	147	seq1	1094	99	35M	=	903	-226	ACGCTGTCCTATGTACTTATCATGACTCTATCCCA	::;:=;=99=====;;====;==========<===	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:134:379:893	147	seq1	1095	99	35M	=	927	-203	CGCTGTCCTATGTACTTATCATGACTCTATCCCAA	7137::;<<<<<<<;<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:256:404:584	147	seq1	1096	99	35M	=	928	-203	ACTGTCCTATGTACTTATCATGACTCTATCCCAAA	&&326+23<3<<<+:<</<<8<<<:7:<<<<<<<<	MF:i:18	Aq:i:60	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_30:4:317:378:535	147	seq1	1096	99	35M	=	1258	197	GCTGTCCTATGTACTTATCATGACTCTATCCCAAA	<<<<<<<<<<<<:<<<<<<<<<;<<;<8<;:7:1(	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:277:482:316	83	seq1	1098	99	35M	=	894	-239	TGTCCTATGTACTTATCATGACTCTATCCCAAATT	9998;<<<<<;;<<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:273:901:459	147	seq1	1098	99	35M	=	938	-195	TGTCCTATGTACTTATCATGACTCTATCCCAAATT	4;+/+7,;<8+&<;;82;;<8<8<2<;<<<<<<<<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:316:25:230	147	seq1	1098	99	35M	=	1273	210	TGTCCTATGTACTTATCATGACTCTATCCCAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<);2;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:24:195:604	83	seq1	1098	99	35M	=	923	-210	TGTCCTATGTACTTATCATGACTCTATCCCAAATT	;6<02;<<<<59<<;<;<<<<9<3<<<<<<<<<;<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:42:923:169	83	seq1	1099	99	35M	=	925	-209	TTCCTATGTACTTATCATGAATCTATCCCAAATTC	&;972<;&<9<,;;;<<<;<&99<<;<;;3<<3<<	MF:i:18	Aq:i:39	NM:i:2	UQ:i:10	H0:i:0	H1:i:1
+EAS114_45:6:59:1548:1096	147	seq1	1099	99	35M	=	1297	233	GTCCTATGTACTTATCATGACTCTATCCCAAATTC	;.;;;;;;;;6;;;;;;;;;;;;;;;73;;77777	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:136:389:320	147	seq1	1100	99	35M	=	930	-205	TCCTATGTACTTATCATGACTCTATCCCAAATTCC	.5:,666<)<8<:<<:66<<<<<<<<<<5<<7<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:122:342:296	83	seq1	1100	99	35M	=	1256	191	TCCTATGTACTTATCATGACTCTATCCCAAATTCC	<<<<<<<<<<<<<<<<<<<<<<<<<;<<*<<<<9<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:259:467:737	83	seq1	1102	99	36M	=	923	-215	CTATGTACTTATCATGACTCTATCCCAAATTCCCAA	8<<<<<<<:<<<<<<<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:71:832:743	147	seq1	1102	99	35M	=	1290	223	CTATGTACTTATCATGACTCTATCCCAAATTCCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<*<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:105:521:563	147	seq1	1103	72	35M	=	1267	199	TATGTACTTATCATGACTCTATCCCAAATTCCCAA	;<)<9995<9<<59<7<<<<7<7<35,0,544<3(	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:201:195:757	147	seq1	1103	99	35M	=	1298	230	TATGTACTTATCATGACTCTATCCCAAATTCCCAA	<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;;8	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:6:585:132	147	seq1	1105	23	36M	=	1276	207	TGTACTTATCATGTTTCTTTCCTAATTTTTCAATTA	6666166&6)+61))646+6&)&%&-44))1'144'	MF:i:-126	Aq:i:23	NM:i:7	UQ:i:59	H0:i:0	H1:i:0
+EAS1_105:2:179:532:82	83	seq1	1105	99	35M	=	1285	215	TGTACTTATCATGACTCTATCCCAAATTCCCAATT	<<<<<<<<<<<<<<<<<<<<3<;<;<<<<:<8<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:11:646:628	147	seq1	1106	99	36M	=	930	-212	GTACTTATCATGACTCTATCCCAAATTCCCAATTAC	<<<3<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:6:93:334:858	147	seq1	1106	99	35M	=	932	-209	GTACTTATCATGACTCTATCCCAAATTCCCAATTA	;<;+;;<<;<<<<<;<<<<;;8<<<<8<<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:26:785:882	83	seq1	1107	99	35M	=	926	-216	TACTTATCATGACTCTATCCCAAATTCCCAATTAC	<<&5&<<<<5.;5<'<<;.76<<<<<7<7<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:4:54:989:654	83	seq1	1108	99	35M	=	1296	223	ACTTATCATGACTCTATCCCAAATTCCCAATTACG	<<<<<<<<<<<<<<<9<<<<<<9<<<<<1<<<88;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:202:326:680	147	seq1	1108	78	35M	=	1268	195	ACTTATCATGACTCTATCCCAAATTCTCAATTACG	<<<<<<<4<<<*<<<*<<<7..:7<3*:7.7<+.;	MF:i:18	Aq:i:37	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+B7_597:3:53:616:842	147	seq1	1109	99	35M	=	1288	214	CTTATCATGACTCTATCCCAAATTCCCACTTACGT	<<<<<<<<<<<<<<<<<<<;07<<<<<-&<<-<4;	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_71:4:209:159:130	147	seq1	1109	99	35M	=	934	-210	CTTATCATGACTCTATCCCAAATTCCCAATTACGT	;:6<:<8::;<<<;<-<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:75:917:886	83	seq1	1110	99	35M	=	951	-194	TTATCATGACTCTATCCCAAATTCCCAATTACGTC	<<<<8<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:286:753:854	147	seq1	1110	99	35M	=	1288	213	TTATCATGACTCTATCCCAAATTCCCAATTACGTC	<<<<<<<<<<<<<<<<<<3<<<<<<9999<;<<9;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:290:146:36	83	seq1	1110	99	35M	=	1280	205	TTATCATGACTCTATCCCAAATTCCCAATTACGTC	<<<<<<<<<<<<<<<<<<<<<<<8<<<<<;;<;;<	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:93:1475:542	147	seq1	1110	99	35M	=	1254	179	TTATCATGACTCTATCCCAAATTCCCAATTACGTC	;;;;;;;;;;;;;;;;;;;;;;9;;;9;;;77777	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:77:251:446	83	seq1	1110	99	35M	=	939	-206	TTATCATGACTCTATCCCAAATGCCCAATTACGTC	<<24,:8<<<:1<<<:35<:<:,<<<<<<:5:<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:11	H0:i:0	H1:i:1
+EAS1_105:3:176:431:647	147	seq1	1112	99	35M	=	1285	208	ATCATGACTCTATCCCAAATTCCCAATTACGTCCT	<<<<<<<<<<<<<<<<2<<<<<<<<6<<<<9<<6<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:111:796:737	147	seq1	1112	99	35M	=	936	-211	ATCATGACTCTATCCCAAATTCCCAATTACGTCCT	<3<<<<<<<<<<<7<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:228:189:826	147	seq1	1112	99	35M	=	914	-233	ATCATGACTCTATCCCAAATTCCCAATTACGTCCT	:74=:.==1==========================	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:35:631:594	147	seq1	1112	99	35M	=	1271	194	ATCATGACTCTATCCCAAATTCCCAATTACGTCCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:29:529:379	83	seq1	1117	99	35M	=	926	-226	GACTCTATCCCAAATTCCCAATTACGTCCTATCTT	;<<<:<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:74:596:137	83	seq1	1119	91	35M	=	1294	210	CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT	<<<<<<<<<</4<<<<<<*<:6<<<<<<<<;/3<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:92:1807:1185	147	seq1	1119	99	35M	=	940	-214	CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT	<<<<<<9<<<<<<<<<<<<<<<<<<<<<<><<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:57:735:151	83	seq1	1121	94	35M	=	1314	228	CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC	<<<<<<<<8<<8<:<<*<:<<<4<<<;,<<<<:<:	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:142:858:903	147	seq1	1121	99	35M	=	943	-213	CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC	<<<<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:247:522:670	83	seq1	1121	99	35M	=	960	-196	CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC	;;;9;:<<<<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:75:732:442	83	seq1	1121	99	40M	=	1293	212	CTATCCCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG	<<<<<;<<<<<9<<<;<<;<<<5<<;8<<<<<<<<;:9%%	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:183:645:699	83	seq1	1122	86	35M	=	1281	194	TATCCCAAATTCCCAATTACGTCCTATCTTCTTCT	<<9<9<<<<<<<<<;<<;<<*175;173<;;;<-/	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:175:437:950	147	seq1	1126	99	35M	=	1298	207	CCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:59	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:93:1002:845	83	seq1	1129	99	35M	=	954	-210	AATTCCCAATTACGTCCTATCTTCTTCTTAGGGAA	<<::;;;<<<<<<<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:50:542:881	147	seq1	1132	99	35M	=	1324	227	TCCCAATTACGTCCTATCTTCTTCTTAGGTAAGAA	<<<<<4<09<<9<<2<<<<<<<<<<<2/.&2<%<7	MF:i:18	Aq:i:63	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_99:3:118:851:285	83	seq1	1133	99	35M	=	953	-215	CCCAATTACGTCCTATCTTCTTCTTAGGGAAGAAC	3+7<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:67:191:668	147	seq1	1134	99	35M	=	995	-174	CCAATTACGTCCTATCTTCTTCTTAGGGAAGAACA	<<<<<7<<7<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:166:203:416	83	seq1	1136	99	35M	=	963	-208	AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC	<<<<<<<<::<<<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:15:1497:1530	83	seq1	1136	99	35M	=	1314	213	AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC	0<;;;9;;86<;;;<<&<<.<<;)3;7;654-471	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:206:563:262	83	seq1	1137	99	35M	=	971	-201	ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT	<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:40:352:151	83	seq1	1137	99	35M	=	1327	225	ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT	<<<<<<<<<<<<<<<;<<9<<<<:<<<<;<99<3<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:67:302:762	83	seq1	1138	99	36M	=	1313	211	TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA	<<<<<<<<<<<<<<<<<<<<;;65;<-<;<:8<<<3	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:84:927:843	147	seq1	1138	99	35M	=	938	-235	TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTT	588;<:<<<<<<<6<<<<;<<<:/<<3<:;<*<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:5:147:479:41	147	seq1	1139	99	35M	=	1322	218	TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA	<<<<<<<<<<<<<<<<<<<<::6<<;<<<;;9;;6	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:329:177:267	83	seq1	1139	99	35M	=	962	-212	TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:72:916:763	147	seq1	1142	99	35M	=	1340	233	GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT	</:8<8)<<<<:<<<<<;.89<:67<.;<<7+336	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:124:128:489	83	seq1	1142	99	35M	=	1348	241	GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT	<<<<<<<<<<<<<<<<<6:6<<-4<::;;<<:48<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:39:59:738	83	seq1	1142	99	35M	=	965	-212	GTCCTATGTTCTTCTTAGGGAAGAACAGCTTAGGT	;.;4;<;3<<9<<9<&<<9<<<<<;<9<;<<;9<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:18	H0:i:0	H1:i:1
+EAS1_99:6:63:48:631	83	seq1	1143	99	35M	=	957	-221	TCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTA	;*:;;<2<<2779;:<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:274:176:479	147	seq1	1144	99	35M	=	976	-203	CCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTAT	7)<<7<626<<7<<<<<<<<<<<<<<<<<<<3<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:72:1809:1398	147	seq1	1145	99	35M	=	958	-222	CTATCTTCTTCTTAGGGAAGAACAGCTTAGGTATC	;:;;:<7:7<:<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:235:805:373	83	seq1	1146	99	35M	=	983	-198	TATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCA	<<;<<<<<<9<9<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:269:944:220	83	seq1	1147	99	35M	=	953	-229	ATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAA	<;<;8<<;7<<<<<;<<-<<<<<<;<<<;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:174:597:66	147	seq1	1148	99	35M	=	1307	194	TCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAAT	<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;6;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:229:717:121	147	seq1	1150	99	35M	=	995	-190	TTCTTCTGAGGGAAGAACAGCTTAGGTATCAATTT	6;-;7<<(<<<<<8<18<7<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:7	H0:i:0	H1:i:1
+EAS56_53:1:23:403:981	147	seq1	1151	99	35M	=	985	-201	TCTTCATAGGGAAGAACAGCTTAGGTATCAATTTG	(;3+<&3<</7<<<<<<;<<<<<<<<<<<<</<2<	MF:i:18	Aq:i:65	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS112_32:7:168:117:441	147	seq1	1151	99	35M	=	990	-196	TCTTCTTAGGGAAGAACAGCTTAGGTATCAATTTG	;;;;3;<<<<<<<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:52:1455:1212	83	seq1	1153	99	40M	=	1304	191	TTCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTCT	<9<<<99<;<<9<;<-<<<6<<75;;<*%<5<3+.8:*5;	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:37:400:627	83	seq1	1154	99	35M	=	961	-228	TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTG	474*;<<9<;<<<;<<:<<<<<<;<<<<<<;<<;<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:11:868:62	147	seq1	1154	99	36M	=	983	-207	TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGT	;;77;;7<<<<<<<<7<<<;<7<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:209:92:210	83	seq1	1156	99	35M	=	965	-226	TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT	;9;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:128:394:455	147	seq1	1156	99	35M	=	1313	192	TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT	======6==========;===9==;5===;==;==	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:316:949:122	83	seq1	1156	99	35M	=	1321	200	TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0<:<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:60:1020:1259	147	seq1	1157	99	35M	=	996	-196	TAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:193:38:987	83	seq1	1158	99	35M	=	964	-229	AGGGAAGAACAGCTTAGGTATCAATTTTGTGTTCT	<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_93:5:292:122:666	147	seq1	1159	99	35M	=	985	-209	GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG	<;<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:280:512:316	83	seq1	1159	99	35M	=	984	-210	GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG	;9===;======;7==;;======;=====;====	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:207:926:427	83	seq1	1159	99	35M	=	973	-221	GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG	;;7<<;4<<<2<<;<<<<<<<<<<7<;<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:239:796:221	83	seq1	1160	99	35M	=	992	-203	GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT	;;<<;<<;<<<+:<<<4<4<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:142:457:584	147	seq1	1160	99	35M	=	999	-196	GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT	8::<:<<9<<.<:<<<<<<<<<<<7<<<<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:190:481:295	83	seq1	1161	99	35M	=	990	-206	GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG	;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:86:308:648	147	seq1	1161	99	35M	=	970	-226	GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG	<7<<<;<<<<+;<<<2<5<<<77;<<2<;;<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:182:23:585	83	seq1	1163	99	35M	=	1336	208	AGAACAGCTTAGGTATCAATTTGGTGTTCTGTGTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:216:650:516	83	seq1	1164	99	36M	=	1326	198	GAACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:15:805:420	83	seq1	1164	35	35M	=	998	-201	GAACAGTTTAGGTATCAATTTGGTGTTCTTTGTAA	<64<59&996<(64<)7).68<0<0<<7741<1:<	MF:i:18	Aq:i:35	NM:i:2	UQ:i:24	H0:i:0	H1:i:1
+EAS56_65:6:82:822:767	147	seq1	1165	99	35M	=	972	-228	AACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA	<<9<<<<<<<<<<;;<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:33:1566:588	147	seq1	1166	76	35M	=	985	-216	ACAGCTTAGGCATCAATTTGGTGTTCTGTGTAAAG	-6246;;97;77;;97;;;;;;9;7;79;)&;37;	MF:i:18	Aq:i:37	NM:i:1	UQ:i:22	H0:i:0	H1:i:1
+EAS1_93:1:20:635:509	147	seq1	1167	99	35M	=	1333	201	CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT	<<<<<<<<<;<<<<;<<<;<;;;<<<;<<<<<<(8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:144:28:475	147	seq1	1167	99	35M	=	974	-228	CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT	;;;9;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:36:1402:1709	147	seq1	1168	99	35M	=	1326	193	AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC	<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<:9<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:34:956:1309	147	seq1	1168	99	35M	=	994	-209	AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC	9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:157:784:936	147	seq1	1169	99	35M	=	1356	222	GCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTCT	<<<<<<<<<<<<<<<<<:<<<<<<;<<<<814<4<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:2:152:860:286	83	seq1	1171	99	35M	=	1004	-202	TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCA	2;5;8<<;5<<<;<2<8<<<<<<;8<;<<<<;<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:157:786:424	147	seq1	1171	99	36M	=	981	-226	TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG	;<;2;;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:33:1407:94	147	seq1	1172	99	35M	=	1360	223	TAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG	;;;;;;;6:;;:::7;:;;;;:::;;;;:;47771	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:302:288:657	147	seq1	1173	99	35M	=	1013	-195	AGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAGG	<:5<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:233:97:262	147	seq1	1175	99	35M	=	1021	-189	GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA	--;;7<;<;;:;<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:67:692:110	147	seq1	1175	99	35M	=	1009	-201	GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA	;;<<8<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:68:692:347	147	seq1	1176	99	36M	=	1351	211	TATCAATTTGGTGTTCTGTGTAAAGTCTCATGGAGC	<<<<<<<<<+6<;<<<<3<:<<<<6<8<<<&*/;*0	MF:i:18	Aq:i:64	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS51_64:3:309:303:278	83	seq1	1178	99	35M	=	996	-217	TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC	<:<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:21:132:1423	147	seq1	1178	99	35M	=	1012	-201	TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC	:<<<<<6<<;<<;<5<;<<<<<<;<6<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:63:854:610	83	seq1	1180	99	35M	=	1005	-210	AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT	:.5;2<:88<<72:<<;<<7<8;<;/<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:182:313:319	147	seq1	1180	99	35M	=	1016	-199	AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT	</<;185;8<;;87<;8<<<<8<;83<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:62:603:1552	83	seq1	1180	99	35M	=	1019	-196	AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT	8::;:<<6<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:145:144:796	83	seq1	1181	99	35M	=	1372	226	ATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTC	<<<<<<<<<<<<<<;<<<<<<;<<<<<<4;4;<;/	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:41:474:283	147	seq1	1182	99	35M	=	1018	-199	TTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTCC	6/;;;88;;<:;48<<<<<;<;<<<<<<<<<<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:329:458:365	83	seq1	1186	99	35M	=	1364	213	GTGTTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGT	==========================9========	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:159:222:274	147	seq1	1189	99	35M	=	1019	-205	GTCTGGGGAAAGTCTCAGGGAGCCGTCCGTGTCCT	''7*<&<'<<<<.<2<<<<<<<<<<+<<<8<8<<;	MF:i:18	Aq:i:37	NM:i:3	UQ:i:17	H0:i:0	H1:i:1
+EAS114_32:6:88:162:587	83	seq1	1189	99	35M	=	1372	218	TTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCT	<;<<<<<<<<<;<5<;<;<<7<++<<2&*:322+7	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:148:340:479	83	seq1	1190	99	35M	=	1364	209	TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC	<<<<<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:12:276:1797	147	seq1	1190	99	35M	=	1006	-219	TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC	)9<02)<<<<<<<<<<<<<1<<<<&<<<<9<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:190:42:671	83	seq1	1192	99	36M	=	1008	-220	TGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA	<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:321:271:138	83	seq1	1193	99	35M	=	1394	236	GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA	<<<<<<<<<<<<<<<<<<<<<;9<<;<<;;<88;&	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:154:669:853	147	seq1	1193	99	35M	=	1371	213	GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA	============<===.====<:=<9=<<<9;:;2	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:287:258:321	147	seq1	1194	99	35M	=	1030	-199	TGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCAT	:.<9<)<;<9<.<<:<:+5:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:61:183:767	147	seq1	1195	99	35M	=	1010	-220	GTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATC	6&.;;<3<363<<<<<<<<8<<<6<<<<3<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:29:794:282	83	seq1	1196	99	36M	=	1025	-207	TAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG	7<<<<45::-<<<<<;<<-;<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:313:827:992	83	seq1	1197	99	35M	=	1379	217	AAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG	<<<<6<<<<:<<<<<66<<<:33:<<<80<;6<8+	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:196:11:27	83	seq1	1198	65	36M	=	1035	-199	AAGACCCAGTTAGCCGTCCGTGTCCTCCCATCTGGC	96&6<'<7:!!<,:;+7<<6:<<<<<<<<<7<7;:<	MF:i:18	Aq:i:24	NM:i:4	UQ:i:27	H0:i:0	H1:i:0
+EAS139_19:3:87:133:930	83	seq1	1198	99	40M	=	1044	-194	CAGTCTCAGGGCGCCGTCCGTTTCCTCCCATCTGGCCTCG	)8&)907)-;9&,<<9)<;<<0<;<<99<<<<<<;<<9<<	MF:i:18	Aq:i:39	NM:i:3	UQ:i:28	H0:i:0	H1:i:1
+EAS114_45:7:97:1584:777	147	seq1	1200	99	35M	=	1013	-222	GTCTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCC	66746,9::9;;;;:;;;;;;;;;;;;;;;:;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:127:153:861	83	seq1	1202	99	35M	=	1374	207	CTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTC	<<<<<<<<<<<<<<<<<<<<<<<=<*<<<24;;::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:157:42:763	83	seq1	1203	99	35M	=	1040	-198	TCTGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCG	4++;((2(5;24<./<:<<<<<<<<;<<88<<<<9	MF:i:18	Aq:i:61	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS54_65:4:91:267:655	83	seq1	1204	99	35M	=	1365	196	CAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGT	<<<<<<<<<<<<<<<<<<<<<;:;;7<9477<74;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:39:966:551	147	seq1	1205	99	35M	=	1026	-214	AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC	8;;;;;<<6'<<<+8<<<1<<<<4<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:61:38:1182	147	seq1	1205	99	35M	=	1388	218	AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:47:352:1492	83	seq1	1205	99	40M	=	1385	220	AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGCCCACTA	:<<<::<24<04-&<;<<2<<<&<60)&<5<<6*8:)9+*	MF:i:18	Aq:i:53	NM:i:3	UQ:i:28	H0:i:1	H1:i:0
+EAS221_3:8:74:770:1712	83	seq1	1208	99	35M	=	1052	-191	GAGCCGTCCGTGTCCTCCCATCTGGCCTCGTCCAC	3.&::6<<<9<6:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:279:763:945	147	seq1	1210	99	36M	=	1048	-198	GCCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT	+9:-+<:1-44<<':<;<+<-<<<;:<<;;<<<<<0	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:306:388:342	147	seq1	1211	99	35M	=	1398	222	CCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT	================5====:=====;==1=4==	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:180:905:36	147	seq1	1212	99	35M	=	1033	-214	CCTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG	6%%<;<662<<*;<<<8<<:<<<<<<<<<<<<<<;	MF:i:18	Aq:i:65	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS218_1:2:19:752:816	83	seq1	1212	99	35M	=	1394	217	CGTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG	<<<<<<<<<<<<<<<<<<<8<7;<;<<767277;6	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:305:565:952	147	seq1	1213	99	36M	=	1030	-219	GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT	5(<1<147<81<*8--8<<<7<91<<<;+<+<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:44:1466:425	83	seq1	1213	99	35M	=	1044	-204	GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGG	6-<<9<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:68:64:783	147	seq1	1214	99	35M	=	1402	223	TCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT	<<<<<<<<<<<<<<<<<;;<<<<<<;<<<9:<<:9	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:7:64:37:257	147	seq1	1215	99	35M	=	1389	209	CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT	================<=====;===8;4======	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:20:413:1334	83	seq1	1215	99	35M	=	1370	190	CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT	7<<;<<<.;<;67;7;;;:;;3;<59+...77677	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:8:179:549:753	147	seq1	1218	99	35M	=	1056	-197	TGTCCTCCCATCTGGCCTCGTCCACACTGGTTCTC	:77<</<<<::<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:16:823:343	83	seq1	1223	99	35M	=	1403	215	TCCCATCTGGCCTCGTCCACACTGGTTCTCTTGAA	================================4==	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:266:556:252	83	seq1	1224	99	35M	=	1392	203	CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA	<<<<<<<<<<<<<<<<<;<<<<<<4;;<;;;<7;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:278:524:521	83	seq1	1224	99	35M	=	1025	-234	CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA	7777,<;<<7<<<<;;<<;;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:72:1426:1883	83	seq1	1226	99	35M	=	1405	214	CATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:82:998:566	83	seq1	1227	99	35M	=	1050	-212	ATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCT	<9<9<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:6:29:575:453	83	seq1	1228	99	36M	=	1056	-208	TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTTG	;<<<;;<:<<<;<;<<<<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:222:538:267	147	seq1	1228	99	35M	=	1074	-189	TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTT	52/8-<<7<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:138:186:274	147	seq1	1231	99	35M	=	1075	-191	GGCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGG	<;<<<<<6;<<<<<3<<36;3;<9<<<<<<3;<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:137:895:681	83	seq1	1232	99	35M	=	1418	221	GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<-8<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:71:636:533	83	seq1	1232	99	35M	=	1398	201	GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC	<<<<<<<<<<<<<<<<<<<<<<<7<<<5<<<-847	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:45:294:380	83	seq1	1233	80	36M	=	1074	-195	CCTCGTCCACACTGGTTCGCTTGAAAGCTTGGGCTG	;<+<7<<<<;7<,<7<<<+/7;<<;<<;7<<<;<<<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS51_66:8:9:80:353	83	seq1	1233	99	35M	=	1067	-201	CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT	;;5;:8<:<:;:;<<<<;<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:73:302:1574	83	seq1	1233	99	35M	=	1429	231	CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT	<<<<<<<<<<;<<<<<<<<<<<<+:;<<;:8;<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:131:779:345	147	seq1	1237	99	35M	=	1399	197	GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA	============================9====;=	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:159:71:155	83	seq1	1237	99	35M	=	1428	226	GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA	=========;=<======;=:=3;==;=6<==;=;	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:55:340:837	83	seq1	1238	99	35M	=	1069	-204	TCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAAT	61378<::<<<5:<;;:<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:91:521:517	147	seq1	1239	99	35M	=	1061	-213	CCACACTGGTTCTCTTGAAAGCTTGGGCTGTAATG	8;8<4=:===7===9=============<======	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:47:303:887	83	seq1	1240	96	35M	=	1052	-223	CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA	<;<6<;<;<8<<<8<<<<;<<<.<<<<<<<8<8;<	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:74:570:695	147	seq1	1240	99	35M	=	1436	231	CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA	=========================7====;8<8;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:3:268:523:511	147	seq1	1241	99	35M	=	1081	-195	ACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGAT	8<7<99<<<<<<<<<:<<<<<<4<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:319:174:811	147	seq1	1242	99	35M	=	1044	-233	CACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATG	;7;3<<3.<<<<<<<<<<<4<<<<<<<<<<<<<0<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:28:315:310	83	seq1	1242	99	35M	=	1085	-192	AAACTGTTCTCTTGAAAGCTTGGGCTGTAATGATG	+%,768<<:<:<2<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:4	UQ:i:70	H0:i:1	H1:i:0
+EAS1_108:1:328:614:638	83	seq1	1243	99	35M	=	1428	220	ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGC	<<<<<<<<<<<<<<<<<<<<4/;<<9<<<<7<<*:	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:63:930:152	147	seq1	1243	99	35M	=	1410	202	ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATTC	<<<<;<<<<<<<7<<;::<<)726;)<99<)&;&+	MF:i:18	Aq:i:59	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_59:1:219:294:861	83	seq1	1244	99	35M	=	1073	-206	CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC	;,;<;<<<;&<<<<<<<5<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:6:42:920:522	83	seq1	1244	99	35M	=	1067	-212	CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC	;;;;;99<;<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:87:89:696	83	seq1	1245	99	36M	=	1419	210	TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<;<:;<<<;<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:166:979:531	147	seq1	1245	99	35M	=	1410	200	TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCC	<<</<<<<<<<<<9<<9<<;<7<<<<9<<<9<,)6	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:40:918:950	83	seq1	1247	99	35M	=	1071	-211	GTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCCT	=0=&&33======;=====.===============	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:131:946:353	83	seq1	1249	99	35M	=	1087	-197	TCTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTG	<<:<<66<<<6<<4<<<:8<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:224:932:942	147	seq1	1250	99	35M	=	1082	-203	CTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGG	<;<<;;<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:318:177:383	83	seq1	1251	99	35M	=	1056	-230	TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC	5:9;7;777<<7<<<<<<<<<<<<<<<<<<<<<<4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:188:460:1000	147	seq1	1251	99	35M	=	1080	-206	TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC	+;+077<7;<57<;;8<<<<<<<<<<8<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:12:1296:358	147	seq1	1252	96	35M	=	1082	-205	CTTGAAAGCTTGGTCTGTAATGATGCCCCTTGGCC	-770074;;6;&42;:2;;;:;;;;:;;/:;;;;:	MF:i:18	Aq:i:37	NM:i:1	UQ:i:17	H0:i:0	H1:i:1
+EAS188_4:5:166:776:590	83	seq1	1252	99	35M	=	1075	-212	CTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGCC	<;:;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:54:263:585	147	seq1	1254	99	36M	=	1081	-209	TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCATC	1:::6<<<<;;;<4<<<<<<<<6<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:93:1475:542	83	seq1	1254	99	35M	=	1110	-179	TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCAT	98987:9:<:;:;;;;;<<;<;<;;;;<<<;;;<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:122:342:296	147	seq1	1256	99	35M	=	1100	-191	AAAGCTTGGGCTGTAATGATGCCCCTTGGCCATCA	<:;:<<<;<2<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:234:787:12	83	seq1	1257	97	35M	=	1092	-200	AAGCTTGGGCTGTAATGATGCCCCTTGGCCATCAC	;;.<;;994<;9<<;;;<<<<<<<7<<<<<<<<<;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:317:378:535	83	seq1	1258	99	35M	=	1096	-197	AGCTTGGGCTGTAATGATGCCCCTTGGCCATCACC	;7;':<77<<;<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:160:434:853	83	seq1	1259	99	35M	=	1072	-222	GCTTGGGCTGTAATGATGCCCCTTGGCCATCACCC	;;*4;<;<<<;<<<<<<<8<<<;<<<<<<<<8<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:18:1498:1475	147	seq1	1260	99	35M	=	1427	202	CTTGGGCTGTAATGATGCCCCTTGGCCATCACCCG	<<<<<7<<<<<<+<<-3<<3<:<2<1<<:<<<<<+	MF:i:18	Aq:i:71	NM:i:1	UQ:i:27	H0:i:1	H1:i:0
+B7_593:2:104:744:280	83	seq1	1262	64	36M	=	1421	195	TGGGCTGTAATGATGCCCCTTGTCCATCACCCGGTC	<<<<<<<<<<<<<<;<;<<<<:4<<4<<0<;80+;:	MF:i:18	Aq:i:21	NM:i:2	UQ:i:34	H0:i:0	H1:i:1
+EAS1_95:4:66:179:118	83	seq1	1262	99	35M	=	1084	-213	TGGGCTGTAATGATGCCCCTTGGCCATCACCCAGT	<<99<<<<<<<<<<<<<<<<<<<9<<<:<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:277:194:143	83	seq1	1262	99	35M	=	1444	217	TGGGCTGTAATGATGCCCCTTGGCCATCACCCGGT	<<<<<<<<<<<;<<<<<<<<<<9;<<<8</<<6<:	MF:i:18	Aq:i:72	NM:i:1	UQ:i:21	H0:i:1	H1:i:0
+EAS1_97:2:59:882:980	83	seq1	1263	99	35M	=	1071	-227	GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC	7339%<6<<<<<;<<9<<8<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS220_1:4:14:1665:1772	83	seq1	1263	84	35M	=	1073	-225	GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC	<&7<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_57:2:259:42:969	147	seq1	1265	99	35M	=	1426	196	GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC	<<<<<;<<;<<3<<<;9<36<<29;<<;;;</;<2	MF:i:18	Aq:i:69	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS221_1:4:4:1732:88	147	seq1	1265	99	35M	=	1087	-213	GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC	:<4<:<<:<::<<<<<::<<<<<:<:<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_105:2:110:584:649	147	seq1	1266	99	35M	=	1084	-217	CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT	++:4686<<68<;<;<;<<<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_59:5:113:694:725	83	seq1	1266	99	35M	=	1088	-213	CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT	;::<<:<:<<<<<<<<<<:<:<<<<<<;<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS221_1:8:58:369:244	147	seq1	1266	99	35M	=	1436	205	CTGTAATGATGCCCCTTGGCCATCACCCAGTCCCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:105:521:563	83	seq1	1267	10	35M	=	1103	-199	TGTAATGCTGCCCCTTGGCCATCCCCCGGTCCCTG	/8)-8/6(98<967<3<<979<<1<<<7<<<<7<<	MF:i:18	Aq:i:10	NM:i:3	UQ:i:45	H0:i:0	H1:i:0
+EAS188_4:5:202:326:680	83	seq1	1268	78	35M	=	1108	-195	GTAATGATGCCCCTTGGCCATCACCCGGTCCCTGC	+33<81<:*<;<;;30;<<<;<<<8<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS192_3:6:216:292:528	83	seq1	1269	99	35M	=	1438	204	TAATGATGCCCCTTGGCCATCACCCAGTCCCTGCC	<;<;<<<<<<<;<<<<<<<<;;;;:;;:<%<;1;:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:67:1864:477	147	seq1	1270	99	35M	=	1465	230	AATGATGCCCCTTGGCCATCACCCAGTCCCTGCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:35:631:594	83	seq1	1271	99	35M	=	1112	-194	ATGATGCCCCTTGGCCATCACCCGGTCCCTGCCCC	<<<<4<<<<<.<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS112_34:8:103:812:255	83	seq1	1272	99	35M	=	1461	224	TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCC	<<<<<<<<<<<<<<<9<<;<<<39;;<;32:7;7+	MF:i:18	Aq:i:69	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS188_7:4:259:869:641	83	seq1	1272	99	35M	=	1435	198	TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCA	<<<<<<<<<<<<<<<<<<<<<,;<:<<<<<<<<<1	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:316:25:230	83	seq1	1273	99	35M	=	1098	-210	GATGCCCCTTGGCCATCACCCGGTCCCTGCCCCAT	8;8;<<;<;;<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS221_1:6:38:1071:155	83	seq1	1274	99	35M	=	1465	226	ATGCCCCTTGGCCATCACCCAGTCCCTGCCCCATC	<<<<<<<<<<<<<:<<<<<<<<8<<<:<<:;;8:;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:6:585:132	83	seq1	1276	23	36M	=	1105	-207	GCCCCTTGACCACCACCCAGTCCCTGCCCCATCTCT	:<473$'<+5;7*+<7<&<37<7<<<<7;;7<<:<7	MF:i:18	Aq:i:23	NM:i:2	UQ:i:19	H0:i:0	H1:i:0
+B7_595:6:47:720:789	83	seq1	1278	90	35M	=	1455	212	CCCTTGGCCATCACCCGGTCCCGGCCCCTTCTCTT	<<72<<<<<<<<;;<7;,0<2;*7<2;<*;;<<64	MF:i:18	Aq:i:25	NM:i:3	UQ:i:44	H0:i:0	H1:i:0
+EAS192_3:6:185:868:496	147	seq1	1278	99	35M	=	1442	199	CCCTTGGCCATCACCCAGTCCCTGCCCCATCTCTT	<<<<<<<<<<<<;<<<;<<<<<<<<<<<9<<;<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:290:146:36	147	seq1	1280	99	35M	=	1110	-205	CTTTCCCATCCCCCGGTCCCTGCCCCATCTCTTGT	7;%%%<8-4<(<<<7<<<:<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:25	NM:i:4	UQ:i:37	H0:i:0	H1:i:0
+B7_593:5:267:71:603	83	seq1	1281	99	36M	=	1446	201	TTGGCCATCACCCAGTCCCTGCCCCATCTCTTGTAA	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<9;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:183:645:699	147	seq1	1281	86	35M	=	1122	-194	GTGGCCCTCCCCCATTCCCTGCCCCATCTCTTGTA	&)))2-&420<<<'--<6:6-<7<<<+:7<65<<<	MF:i:18	Aq:i:21	NM:i:4	UQ:i:37	H0:i:0	H1:i:0
+EAS1_105:2:179:532:82	147	seq1	1285	99	35M	=	1105	-215	CCATCACCCGGTCCCTGCCCCATCTCTTGTAATCT	<:96<6<<<<89<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_105:3:176:431:647	83	seq1	1285	99	35M	=	1112	-208	CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT	<(9(<<<7;<<7<<<<<<<7<<<<<<7<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:258:266:101	83	seq1	1285	99	35M	=	1094	-226	CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT	%==/7&8=======:===6================	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:179:735:569	147	seq1	1286	99	35M	=	1461	210	CATCACCCGGTCCCTGCCCCATCTCTTGTAATCTC	<<<<<<<<<<<<<<<<<<<<3<<<<<<<<4/<;<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS188_7:3:200:712:439	147	seq1	1286	99	35M	=	1435	184	CGTCACCCGGTCCCTGCCCCATCTCTTGTAATCTC	<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:2	UQ:i:49	H0:i:0	H1:i:0
+EAS1_103:5:319:165:698	83	seq1	1287	99	35M	=	1485	233	ATCACCCAGTCCCTGCCCCATATCTTGTAATCTCT	<<<<<<<<<<<<<<<<<<<3<9<<<<<<<;<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:24	H0:i:0	H1:i:1
+B7_597:3:53:616:842	83	seq1	1288	99	35M	=	1109	-214	TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC	;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:286:753:854	83	seq1	1288	99	35M	=	1110	-213	TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC	;<2<<<,57:<<9<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:14:1256:204	83	seq1	1288	99	35M	=	1467	214	TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC	<<<<<;;;;;;<;;;;;;;<;<;;;;<:-;79697	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:289:132:526	83	seq1	1289	99	36M	=	1472	219	CACCCGGTCCCTGCCCCATCTCTTGTAATCTCTCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<8<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS218_1:4:71:832:743	83	seq1	1290	99	35M	=	1102	-223	ACCCAGTCCCTGCCCCATCTCTTGTAATCTCTCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:102:511:946	83	seq1	1291	26	35M	=	1461	205	CCCAGTCCCTGCCCCATCTCGGGTAATCTCTCTCC	<<9<<;<<<<;<<<<;<<7;%<5<<0<<<)<.<.+	MF:i:18	Aq:i:26	NM:i:2	UQ:i:31	H0:i:0	H1:i:0
+EAS114_39:5:42:1223:1087	83	seq1	1293	99	35M	=	1479	221	CAGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTT	<<<<<<<<<<<<<5<<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:75:732:442	147	seq1	1293	99	40M	=	1121	-212	CGGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	7,*&28<61:88<.7<:<<:6<1<85:<:1<5<&::<<&<	MF:i:18	Aq:i:60	NM:i:1	UQ:i:11	H0:i:1	H1:i:0
+EAS54_73:3:23:502:103	147	seq1	1294	99	35M	=	1486	227	AGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTT	<2<<<<<<<<<<.<<<<<<<:1&:<<<7<<<<<<:	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:74:596:137	147	seq1	1294	91	35M	=	1119	-210	GGTCCCTGCCCCATCGCTTGTAATCTCTCGCCTTT	+40778449779049'+*87489498949%89948	MF:i:18	Aq:i:22	NM:i:3	UQ:i:32	H0:i:0	H1:i:0
+EAS51_66:8:36:688:722	83	seq1	1295	99	35M	=	1469	209	GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:8:60:182:718	147	seq1	1295	99	35M	=	1485	225	GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT	<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;<;<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:4:54:989:654	147	seq1	1296	99	35M	=	1108	-223	TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT	,<1<2<<<;9)9<<;<<;<<<4<<<;<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:9:203:653	147	seq1	1296	99	35M	=	1488	227	TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT	<<<<<<<<<<<<<<<<<<<<<<::<9<<<<<;;;<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:322:631:245	147	seq1	1297	99	36M	=	1474	213	CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	<<<<<<<<<<<<<<<<<0<<<<<<<<<<<<<<<<5;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:59:1548:1096	83	seq1	1297	99	35M	=	1099	-233	CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG	88888;;88;;;;8;;9;;;<<<<<<<<<<<<<<;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:52:1779:1664	83	seq1	1297	99	35M	=	1462	200	CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG	<<<<<<<<<<<<<<<<<<71<<<<<<<<<<<<<<%	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:218:173:667	83	seq1	1298	99	35M	=	1448	185	CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	<<<<<<<<<<<<<<<6<<<<<<<<<<<<<<<<<.<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:175:437:950	83	seq1	1298	99	35M	=	1126	-207	CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	;;5:;;9<<:<;<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:201:195:757	83	seq1	1298	99	35M	=	1103	-230	CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC	:<':<:<<46<:<;:<;<;<<9<<<<<<<<;<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:8:377:655	83	seq1	1299	99	35M	=	1473	209	CTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:50:950:562	83	seq1	1301	99	35M	=	1473	207	GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGC	<<<<<<<<<<<<<<<&<<8<<<<<<<5<:<+<:+;	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:153:543:671	83	seq1	1301	99	34M	=	1465	199	GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<<7	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:33:1193:664	147	seq1	1301	99	40M	=	1474	213	GCCCCATCTCTTGTAATCTCTCTCCTTTTTTCTGCATCCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<%:<'<9:::9	MF:i:18	Aq:i:71	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_93:1:253:59:242	83	seq1	1302	99	35M	=	1478	211	CCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<</<<9;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:52:1455:1212	147	seq1	1304	99	40M	=	1153	-191	CCATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGT	6::4::;4%;9:<79)<:<;<<:4::7<<9<&+71<9;<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:316:176:543	83	seq1	1305	99	35M	=	1469	199	CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC	====<=9===<<<=====9====<<=3==,96==9	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:50:1339:1154	147	seq1	1305	99	35M	=	1481	211	CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC	==========<<==============;==7<;<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:169:292:652	83	seq1	1306	99	35M	=	1510	239	ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC	<<<<<<<<<<<<<<<<<<<<<<<<<6<<-<<<<8<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:11:706:1030	83	seq1	1306	92	35M	=	1469	198	ATCTCTTGTAATCTCTCTCATCTTTGCTGCATCCC	<<<2<<2<<<<<<<<<<<<0<&<<<+<:2<4<<):	MF:i:18	Aq:i:26	NM:i:2	UQ:i:20	H0:i:0	H1:i:0
+EAS221_3:6:70:843:706	83	seq1	1306	99	35M	=	1449	178	ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC	<<<<<<<<<<<<<<<<<<<<<<<<<5<<5<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:7:174:597:66	83	seq1	1307	99	35M	=	1148	-194	TCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCT	9<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:6:7:1547:1933	147	seq1	1308	99	35M	=	1497	224	CTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTG	<<<<<<<<<<<<<<<<<<<<<<<:<<8<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:30:117:411	147	seq1	1309	99	36M	=	1482	209	TCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTC	<<<<<<<<<<<<<<<<<<<<<<7<<:<<<<<<<<<:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:53:156:845	83	seq1	1311	99	35M	=	1487	211	TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT	<<<<<<8<<<.<<<<.6<<--<-<<<<<<<6<<<<	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:90:1403:1635	83	seq1	1311	99	35M	=	1480	204	TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT	<<;<;<<<<;<;<;;<<<<<9;<.;;<:;99.979	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:67:302:762	147	seq1	1313	99	36M	=	1138	-211	GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC	:8;88<;<<<;<<8<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:270:448:491	83	seq1	1313	99	35M	=	1501	223	GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC	<<<<<<<<<<<<<<<<<<&<<.<<<<<<<:;;;<;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:82:932:400	83	seq1	1313	97	34M	=	1486	208	GTAATCTCTCTCCTCTTCGCTGCATCCCTGTCTT	<<<<<<8<1<<<<8+<<&<<<8<<<<<<<+(,/8	MF:i:18	Aq:i:25	NM:i:2	UQ:i:15	H0:i:0	H1:i:0
+EAS54_81:2:128:394:455	83	seq1	1313	99	35M	=	1156	-192	GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC	;=;9.=5=;=9====;;==================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:57:735:151	147	seq1	1314	94	35M	=	1121	-228	TAAACTCTCACCTTATTGCTGCATCCCTGTCTTCC	07;+79:;<)<<9<+8<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:26	NM:i:3	UQ:i:28	H0:i:0	H1:i:0
+EAS114_28:6:51:506:878	147	seq1	1314	99	36M	=	1501	223	TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCT	<<<<<<<<<<<<<<<<<4<<<<<<<<<<0<<<<<:;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:15:1497:1530	147	seq1	1314	99	35M	=	1136	-213	TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC	77778:;;;:;;;;:9;:;;;;;;;;;9;:;;;;;	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:9:1595:1826	83	seq1	1316	99	35M	=	1494	213	ATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:73:273:488	147	seq1	1318	99	35M	=	1512	229	CTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTG	<<<<<2<88<88<<<8<<1<<<<<<68<<<;<;<*	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:1:199:760:42	147	seq1	1318	24	35M	=	1489	206	CTCTCTAATTTTTGCTGCTTCCATGTCTTACTCTG	+2&2&2&22222220222&220-222-22-22-22	MF:i:-126	Aq:i:24	NM:i:5	UQ:i:51	H0:i:0	H1:i:0
+EAS1_95:7:61:702:720	147	seq1	1320	99	35M	=	1500	215	CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC	==============;=======&=========3:=	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:41:576:1016	147	seq1	1320	99	35M	=	1503	218	CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC	<<<<<<<<<<<<<<;<<<;<<<<<<<<<<<4<::<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:115:683:296	83	seq1	1320	99	35M	=	1514	229	CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC	<<<<<<<<<<<8<<<<<<<<<<6<<<<3<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:63:1265:820	83	seq1	1320	99	35M	=	1480	195	CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC	<<<<<<<<<<27<<<<<<<<<<<<<<<<<<<<03<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:7:92:288:1354	147	seq1	1321	99	40M	=	1480	199	TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT	<<<<<<:<<<<<<<<<<<8<<:<<<<;;<8<<<8<:8+::	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:316:949:122	147	seq1	1321	99	35M	=	1156	-200	TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT	59899<<<<;;<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:37:1626:862	147	seq1	1321	99	35M	=	1489	203	TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:5:147:479:41	83	seq1	1322	99	35M	=	1139	-218	CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTT	;:;:;<::<:<<<<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:73:936:1509	147	seq1	1322	99	40M	=	1502	220	CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTTATTT	<<<<<<<<<7<<7<<<<<<<;<<<<<<<<<:<:<;%8:::	MF:i:18	Aq:i:75	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_62:6:50:542:881	83	seq1	1324	99	35M	=	1132	-227	CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA	+2<<<;<3;29<6<5;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:71:85:629	147	seq1	1324	99	35M	=	1484	195	CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA	<<<<<<<<<<9<<<<<<<<<<<<<<<<<5<9<<+6	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:191:948:257	147	seq1	1325	99	35M	=	1493	203	CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT	:<<<<<<<<9<:<<<<<<:<<<<;<<<<8<<<<7<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:249:986:224	83	seq1	1325	99	35M	=	1499	209	CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT	=========5======7878===98==7=9==.-=	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:5:6:1067:91	147	seq1	1325	99	35M	=	1483	193	CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<:8<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:216:650:516	147	seq1	1326	99	36M	=	1164	-198	TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	;9;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:18:376:416	147	seq1	1326	99	35M	=	1510	219	TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGTTT	<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;:(<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS114_28:5:209:778:588	147	seq1	1326	99	36M	=	1514	224	TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	<<<<<<<<;<<<<<<<<<;<<<;<8<8<<<<;7;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:36:1402:1709	83	seq1	1326	99	35M	=	1168	-193	TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT	;;;:<<<;<<<<<<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:40:352:151	147	seq1	1327	99	35M	=	1137	-225	TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	;=;;5=:-=9=====;;==================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:139:331:63	83	seq1	1327	99	35M	=	1486	194	TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	====================<<=============	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:11:1274:1230	147	seq1	1327	99	35M	=	1507	215	TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:36:678:316	83	seq1	1328	99	35M	=	1500	207	TTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTTA	<<<<<<<<<<<<<<;<<<<<<<<<;<<<<,2<<<)	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:102:825:507	147	seq1	1330	99	35M	=	1501	206	TGCTGCATCCCTGTCTTCCTCTGTCTTGATTTACT	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;;<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:171:343:758	83	seq1	1331	99	36M	=	1494	199	GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG	<<<<<<<<<<<<<<<<<<<<<;<<<<59<<<9;<<3	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:85:1224:625	83	seq1	1331	99	35M	=	1532	236	GCTGCATCCCTGTCTTCCTCTGTCTTGATTTCCTT	<<<<<<<<<;<<;<<7<<:<<7.<<<:&7<<.<;<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:13	H0:i:1	H1:i:0
+EAS188_7:5:308:354:124	83	seq1	1331	99	35M	=	1507	211	GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTT	<<<<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:7:22:22:934	147	seq1	1332	99	35M	=	1500	203	CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG	<<<<<<<<<<<6<<<;<<<;84;<<48;<;6;<;)	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:71:707:568	147	seq1	1332	99	35M	=	1518	221	CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:123:610:472	83	seq1	1333	99	35M	=	1504	206	TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT	<<<<<<<<<<:<<<<<<<<<<<<<+:<<<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:20:635:509	83	seq1	1333	99	35M	=	1167	-201	TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT	50<59<<9<9<<<<<<<<<<<<<<<<<<<6<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:92:213:217	83	seq1	1333	99	35M	=	1515	217	TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:47:471:858	147	seq1	1335	99	35M	=	1487	187	CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG	<<;<<<<<<<<9<<<4;;<<<<;<<<<<.<<4;<4	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:90:406:631	147	seq1	1335	99	35M	=	1525	225	CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG	<<<<<<<<<<<<<<<<<:<<<<:;<<<<;<<8;<8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:81:1723:1820	83	seq1	1335	99	35M	=	1524	224	CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:182:23:585	147	seq1	1336	99	35M	=	1163	-208	ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT	9:<<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:150:508:757	147	seq1	1336	99	35M	=	1483	182	ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT	<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<,<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:261:504:780	147	seq1	1337	99	35M	=	1501	199	TCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGTT	<<<<<<<<<<<<<<<<<<<</2<<<9<<<5<<,<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:324:515:230	147	seq1	1339	99	35M	=	1512	207	CCTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGG	<<;<<<<<<<<<<<<<<<:<<<<8<<<4<<4<<34	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:72:916:763	83	seq1	1340	99	35M	=	1142	-233	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT	<;;:<<<<<<<;<<;;;<<<<<<<<<;;<;<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:194:168:684	83	seq1	1340	99	36M	=	1512	208	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<7<<.<<6-<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:113:43:634	147	seq1	1340	99	35M	=	1500	195	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTTTT	<<<<<<<<<<<<.<<<<<<<<<<<<</<<2;;%%;	MF:i:18	Aq:i:45	NM:i:2	UQ:i:8	H0:i:1	H1:i:0
+EAS54_71:5:16:434:204	147	seq1	1340	99	35M	=	1522	216	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT	=================;)===8===:==7;<+%;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:246:205:734	73	seq1	1340	65	35M	=	1340	0	CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT	<<<4<<6666<<6<:<<<3<<<:'<<:<<<<;6<+	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:246:205:734	133	seq1	1340	0	*	=	1340	0	CTCCAGGGAAGTTATCTCTCATCTAGANNNNNTTG	<<<<<<:/<<<,6'</7;<-+9<<;<7!!!!!8<,	MF:i:-64
+EAS54_65:3:102:884:63	147	seq1	1341	99	35M	=	1481	175	TGTCTTCCTCTGTCTTGATTTCCTTGTTGTTGGTT	<<<<<<<<<<<<<<<<<3<<<%<<<9<<9<<7+;<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS51_64:3:67:782:132	83	seq1	1343	99	35M	=	1498	190	TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<:<<;4<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:70:348:972	147	seq1	1343	99	35M	=	1528	220	TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT	<.<<3+.7<<7<<:78:<<7<:<7:<3<<7.:::<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:9:206:901	83	seq1	1344	99	35M	=	1517	208	CTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTC	<<<<<<<<<<<<<<<<<<<<<<5<<5<<%%:<<<7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:21:443:404	83	seq1	1345	99	35M	=	1529	219	TTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTCT	<<<<<<<<<<<<<<<<<<<<<7<<;<<;+<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:148:286:316	147	seq1	1347	99	35M	=	1531	219	CCTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGT	<<<<<<<<+<<7<<<<<<<6<<<6<142<<<6<2<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:77:48:860	83	seq1	1348	99	35M	=	1521	208	CTCTGTCTTGATTTACTTGTTGTTTGTTTTCTGTT	=========;===========9==*;5=;=;=,7=	MF:i:18	Aq:i:45	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+EAS51_64:6:124:128:489	147	seq1	1348	99	35M	=	1142	-241	CTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTT	::55<<<8<<<6<<;<<<<<<<<7<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:213:54:878	137	seq1	1348	99	35M	*	0	0	CTCTGTCTTGATTTACTTGTTGTTGGTTTTTTGTT	<<<<<<<<<;<<<<<<<<:<<:<<++<<<<%<%<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS218_1:4:73:42:1038	147	seq1	1349	99	35M	=	1513	199	TCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTTT	<<<<<<<<<<<<<<<<<<<<<<<:<<<<<.<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:320:505:814	83	seq1	1350	99	35M	=	1515	200	CTGTCTTGATTTACTTGTTGTTGGTTTTCTTTTTC	<<<<<<<<<<<<<<<<;<<8<<76<<<<;<&<<<7	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_593:2:68:692:347	83	seq1	1351	99	36M	=	1176	-211	TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCTT	9<;;;;<<<:<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:252:428:683	137	seq1	1351	99	35M	*	0	0	TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCT	<<<<<<;<<<<<<<<7<<7<<&+<<<<:<&<<<4<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:73:182:444	83	seq1	1354	99	34M	=	1533	214	CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTT	<<<<;;<<<<<<<<<<<<;<;<<<<<:<<<<<7<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:63:267:545	147	seq1	1354	99	35M	=	1524	205	CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTTG	<<<<<<<<<<<<:<<<<<::<<<<<<.<<<;;;;5	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:177:562:806	83	seq1	1356	99	35M	=	1515	194	TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTTTT	<;<29<99<<;<<<9<20<9<<5;;<<<<<<<+.<	MF:i:18	Aq:i:35	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS51_62:7:157:784:936	83	seq1	1356	99	35M	=	1169	-222	TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTGTT	<:<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:1:209:345:87	147	seq1	1360	99	35M	=	1513	188	TTACTTGTTGTTGGTTTTCTGTTTCTTTTTTTGAT	<<<<<<<<<<<<<<<<<<<<;<<<-<<<6<<<+8<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:21	H0:i:1	H1:i:0
+EAS114_45:1:33:1407:94	83	seq1	1360	99	35M	=	1172	-223	TTACTTGTTGTTGGTTTTCTGTTTCTTTGTTTGAT	77477;4;;;;;44;;;;;;7;;;;;;;9;;;;;<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:2:434:715	147	seq1	1363	99	35M	=	1527	199	CTTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTT	<<<<<<<<<<<<<<<<<;<<<<<<<0<<<68<<<+	MF:i:18	Aq:i:71	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS54_65:4:137:319:642	137	seq1	1363	99	35M	*	0	0	CTTGTTGTTGGTTTTCTGTTTCTTTTTTTGATTTT	<<<<<<<<<27<<<<<<<<<<<<<<&;<<&3;;<%	MF:i:18	Aq:i:41	NM:i:2	UQ:i:9	H0:i:0	H1:i:1
+B7_610:3:148:340:479	147	seq1	1364	99	35M	=	1190	-209	TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG	<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:329:458:365	147	seq1	1364	99	35M	=	1186	-213	TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG	====:==9========>==7>==9>=7=>=>>=>>	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:91:267:655	147	seq1	1365	99	35M	=	1204	-196	TGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGT	;,:;5:<6:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:91:856:504	83	seq1	1366	99	35M	=	1520	189	GTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTT	<<<<<<<<<<<<<<7<<<<<<<7<<<&;<<<&&<&	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_108:2:170:326:433	83	seq1	1367	99	35M	=	1535	203	TTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGG	=====<=9===:=<:==2=======2:===9==/5	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:132:717:233	83	seq1	1368	99	35M	=	1529	196	TGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGA	<<<<<<<<<<<<;<<<<<<<<<<<7<<<<&-<4<1	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:14:420:712	83	seq1	1368	99	40M	=	1525	197	TGTTGGTTTTCTGTTTCTTTGTTTGATTTTTTTGAAGACA	<<<<<<<<<<<<;<<<<<<<;<<<-;<<<&,<&*8111:6	MF:i:18	Aq:i:66	NM:i:3	UQ:i:21	H0:i:1	H1:i:0
+EAS114_39:4:43:1047:1626	147	seq1	1369	99	35M	=	1523	189	GTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAA	<<<<<<<<<<<<<<<<<<<:<<<:<<<<:+;-4:(	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:20:413:1334	147	seq1	1370	99	35M	=	1215	-190	TTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAG	88878777;:;:1:;9;;;6;;;6;9;;;;;296;	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:154:669:853	83	seq1	1371	99	35M	=	1193	-213	TGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGA	<::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:117:857:942	83	seq1	1372	99	35M	=	1527	190	GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC	<<<<<<<<<<<<<<<<<<<<<<<<<:6<;;7;9<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:145:144:796	147	seq1	1372	99	35M	=	1181	-226	GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC	;<<<;<<<<<<<<<;<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:88:162:587	147	seq1	1372	99	35M	=	1189	-218	GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC	386;;388-<8;<;68<<;;<;<6<<<8<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:73:108:1621	83	seq1	1373	99	35M	=	1532	194	GTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACA	<<<<<<<<71<<<<<<<<<+<<<<70:0<9<<61<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:127:153:861	147	seq1	1374	99	35M	=	1202	-207	TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT	:;:6;9<<1;<<95<<<9<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:152:765:744	147	seq1	1374	99	35M	=	1534	195	TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT	<<<<<<<<<<<<<<<<<<:<<<<<<<<&<7293<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:313:827:992	147	seq1	1379	99	35M	=	1197	-217	TGTTTCTTTGTTTGATTTGGTGGAAGACATAATCC	'187:1'<75<.*<<:5<..<<*<<917<<7<<17	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:7:268:263	89	seq1	1381	22	35M	=	1381	-35	TTGCGTTATTTGAGTTGGTGGAAGACATAATCCCA	',)*&2<$7+<<<'<-<7<<<<<<<7<<</4/;<<	MF:i:64	Aq:i:0	NM:i:4	UQ:i:22	H0:i:0	H1:i:0
+EAS51_64:3:7:268:263	149	seq1	1381	0	*	=	1381	35	TCGTACAGAAGTTTAATGGAGCCTTGGGACCTTAC	!!66'&+/&'8+2''1+'611'&6&+/&+.&+1'&	MF:i:-64
+EAS139_19:1:47:352:1492	147	seq1	1385	99	40M	=	1205	-220	TTTGTTTTGTATGGTGGAAGACATAATCCCACGCTTCCTA	+7+/7+/%%1'6+3++1;:</<<5<)27<<9<)9<<9<7<	MF:i:18	Aq:i:53	NM:i:3	UQ:i:14	H0:i:1	H1:i:0
+EAS139_11:5:61:38:1182	83	seq1	1388	99	35M	=	1205	-218	GTTTGATTTGGTGGAAGACATAATCCCACGCTTCC	9:;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:7:64:37:257	83	seq1	1389	99	35M	=	1215	-209	TTTGATTTGGTGGAAGACATAATCCCACGCTTCCT	;47<<47+9<4<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:266:556:252	147	seq1	1392	99	35M	=	1224	-203	GATTTGGTGGAAGACATAATCCCACGCTTCCTATG	.8558<72<(<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:321:271:138	147	seq1	1394	99	35M	=	1193	-236	TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA	261:5969==9=:=<==<=================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:19:752:816	147	seq1	1394	99	35M	=	1212	-217	TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA	+<<+<--/<<<<4<2<<<<45<<<:<<<<<<+<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:306:388:342	83	seq1	1398	99	35M	=	1211	-222	GGGGAAGACATAATCCCACGCTTCCTATGGAAAGG	9/<9;<<<;<;<<7<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:14	H0:i:1	H1:i:0
+EAS114_39:1:71:636:533	147	seq1	1398	99	35M	=	1232	-201	GTGGAAGACATAATCCCACGCTTCCTATGGAAAGG	,51(<<8<:<<<<<<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:131:779:345	83	seq1	1399	99	35M	=	1237	-197	TGGAAGACATAATCCCACGCTTCCTATGGAAAGGT	<<7<<<<<<<<:<<<<<<<<<<<<<;<<<<<<;<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:68:64:783	83	seq1	1402	99	35M	=	1214	-223	AAGACATAATCCCACGCTTCCTATGGAAAGGTTGT	<<9<8<6<<<<<;<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:16:823:343	147	seq1	1403	99	35M	=	1223	-215	AGACATAACCCCACGCTTCCTATGGAAAGGTTGTT	<<<:<<<;+;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS219_FC30151:5:72:1426:1883	147	seq1	1405	99	35M	=	1226	-214	ACATAATCCCACGCTTCCTATGGAAAGGTTGTTGG	;9<;<;0<;<;<<<<;<<<;:<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:166:979:531	83	seq1	1410	99	35M	=	1245	-200	ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT	81<<<3<*<<:<<<<<<<8<<<<<<<<<<<<:<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:63:930:152	83	seq1	1410	99	35M	=	1243	-202	ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT	;:4:8;:::;=:8;=;========;=:========	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:137:895:681	147	seq1	1418	99	35M	=	1232	-221	CTTCCTATGGAAAGGTTGTTGGGAGATTTTTAATG	4;5+6;<<<<<<<<<9;<4<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:87:89:696	147	seq1	1419	99	36M	=	1245	-210	TTCCTATGGAAAGGTTGTTGGGAGATTTTTAATGAT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:104:744:280	147	seq1	1421	64	36M	=	1262	-195	CATATGGAAAGGTTGTTGGGATTTTTTTAATGATTC	'&+74*0<'/.47:8<<<<;<7''6/1<<<.<<68<	MF:i:18	Aq:i:21	NM:i:3	UQ:i:33	H0:i:0	H1:i:0
+EAS56_57:2:259:42:969	83	seq1	1426	99	35M	=	1265	-196	GGAAAGGTTGTTGGGAGATTTTTAATGATTCCTCA	<<<6<<<<<<-<<<<<<;<<;<6<<<<<<<;<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:18:1498:1475	83	seq1	1427	99	35M	=	1260	-202	GAAAGGTTGTTGGGAGATTTTTAATGATTCCTCAA	:<4<*7<<<<<<<:<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:328:614:638	147	seq1	1428	99	35M	=	1243	-220	AAAGGTTGTTGGGAGATTTTTAATGATTCCTCAAT	<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:159:71:155	147	seq1	1428	99	35M	=	1237	-226	AAAGGTTGTTGGGAGATTTTTAATGATTCCTCGAT	5;;9<<:<;:<<<<7<<7;<3<<<:<<<;<<<<<;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_39:1:73:302:1574	147	seq1	1429	99	35M	=	1233	-231	AAGGTTGTTGGGAGATTTTTAATGATTCCTCAATG	7<88;;<;;<;;<<<<<<<<<<<<<<<<<<<<<1<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:200:712:439	83	seq1	1435	99	35M	=	1286	-184	GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA	<;<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<<7	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:259:869:641	147	seq1	1435	99	35M	=	1272	-198	GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA	99=:=9=99<=========<=<<============	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:74:570:695	83	seq1	1436	99	35M	=	1240	-231	TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT	.;:8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:58:369:244	83	seq1	1436	99	35M	=	1266	-205	TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT	<<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:216:292:528	147	seq1	1438	99	35M	=	1269	-204	GGGAGATTTTTAATGATTCCTCAATGTTAAAATGT	;:;;8<<<<<<<<<<<<<:<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:185:868:496	83	seq1	1442	99	35M	=	1278	-199	GATTTTTAATGATTCCTCAATGTTAAAATGTCTAT	:;;<;;<<<<<<<<;4<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:277:194:143	147	seq1	1444	99	35M	=	1262	-217	TTTTTAATGATTCCTCAATGTTAAAATGTCTATTT	;<<;<<<;8;<0<7<<<<<<<<<<<<7<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:267:71:603	147	seq1	1446	99	36M	=	1281	-201	TTTAATGATTCCTCAATGTTAAAATGTCTATTTTTG	9;;<;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:218:173:667	147	seq1	1448	99	35M	=	1298	-185	TAATGATTCCTCAATGTTAAAATGTCTATTTTTGT	<<<<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:70:843:706	147	seq1	1449	99	35M	=	1306	-178	AATGATTCCTCAATGTTAAAATGTCTATTTTTGTC	<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:47:720:789	147	seq1	1455	90	35M	=	1278	-212	TCCTCAATGTTAAAATGTCTATTTTTGTCTTGACA	/)040<.878<<<<;8<;<9<9;<<<<<<<<<<93	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:102:511:946	147	seq1	1461	26	35M	=	1291	-205	ATGTAAAAGTGACTGTTATTGTCTTGACACCCAAC	<%-4:6<:/&46;/*;<*84<0<'<&*<2<<<<<<	MF:i:-126	Aq:i:26	NM:i:5	UQ:i:78	H0:i:0	H1:i:0
+EAS112_34:8:103:812:255	147	seq1	1461	99	35M	=	1272	-224	ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC	7:777:7<<::7<7<7<<:7<7<:<<<<<<<<<7<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:179:735:569	83	seq1	1461	99	35M	=	1286	-210	ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC	<5<3:<<<<5;8<<<55;<:</:<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:52:1779:1664	147	seq1	1462	99	35M	=	1297	-200	TGTTAAAATGTCTATTTTTGTCTTGACACCCAACT	6;;:;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:153:543:671	147	seq1	1465	99	35M	=	1301	-199	TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT	;;;;;=;==================;=========	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:38:1071:155	147	seq1	1465	99	35M	=	1274	-226	TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT	<<62<<<<<<3<<<<</<<<<<<<%<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:67:1864:477	83	seq1	1465	99	35M	=	1270	-230	TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:14:1256:204	147	seq1	1467	99	35M	=	1288	-214	AAATGTCTATTTTTGTCTTGACACCCAACTAATAT	66777:;;37;;:;;0;:;;;;):;;:7;;;;;;;	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:316:176:543	147	seq1	1469	99	35M	=	1305	-199	ATGTCTATTTTTGTCTTGACACCCAACTAATATTT	<<)/3<<<&<*<<0<<8<<82</5<<<<<88<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:36:688:722	147	seq1	1469	99	35M	=	1295	-209	ATGTCTATTTTTGTCTTGACACCCAACTAATATTT	<;;<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:11:706:1030	147	seq1	1469	92	35M	=	1306	-198	ATGTCTATTTTTGTCTTGACACCCAACTAATATTT	+<5069+9<<<<+<;<<<<;<<77<7<<;<<;<<<	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:289:132:526	147	seq1	1472	99	36M	=	1289	-219	TCTATTTTTGTCTTGACACCCAACTAATATTTGTCT	;<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:50:950:562	147	seq1	1473	99	35M	=	1301	-207	CTATTTTTGTCTTGACACCCTACTAATATTTGTCT	<<3<<<8<;<<<<<<+<<8<&<<<<7<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS188_4:5:8:377:655	147	seq1	1473	99	35M	=	1299	-209	CTATTTTTGTCTTGACACCCAACTAATATTTGTCT	;<8;;:<;<<:<;<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:322:631:245	83	seq1	1474	99	36M	=	1297	-213	TATTTTTGTCTTGACACCCAACTAATATTTGTCTGA	<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:33:1193:664	83	seq1	1474	99	40M	=	1301	-213	TATTTTTGTCTTGACACCCAACTAATATTTGTCTGAGCAA	;;;;;;<;;-9<<<:</+9<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:253:59:242	147	seq1	1478	99	35M	=	1302	-211	TTTGTCTTGACACCCAACTAATATTTGTCTGAGCA	<<<:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:42:1223:1087	147	seq1	1479	99	35M	=	1293	-221	TTGTCTTGACACCCAACTAATATTTGTCTGAGCAA	;:<<<:<7<<<;;<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:90:1403:1635	147	seq1	1480	99	35M	=	1311	-204	TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA	86878;;;8;788;;;;;;;;;;;;;8;5;;;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:7:92:288:1354	83	seq1	1480	99	40M	=	1321	-199	TGTCTTGACACCCAACTAATATTTGTCTGAGCAAAACAGT	::::;;;<<<<9;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:63:1265:820	147	seq1	1480	99	35M	=	1320	-195	TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA	<<<<<<3<<1<<<<<<<7<<<<<<<<<<<<<<<+<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:102:884:63	83	seq1	1481	99	35M	=	1341	-175	GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA	<;7;;<<8<;8;<<<8<<<<<<8<<<8;<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:50:1339:1154	83	seq1	1481	99	35M	=	1305	-211	GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA	7;7;8;<5<:86<<;<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:30:117:411	83	seq1	1482	99	36M	=	1309	-209	TCTTGACACCCAACTAATATTTGTCTGAGCAAAACA	;88<<<<<:<7<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:150:508:757	83	seq1	1483	99	35M	=	1336	-182	CTTGACACCCAACTAATATTTGTCTGAGCAAAACA	6;;;<8<6;8<<8<<<<<;<<<<;<<<<;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:5:6:1067:91	83	seq1	1483	99	35M	=	1325	-193	CTTGACACCCAACTAATATTTGTCTGAGCAAAACA	3<;<<:;9;<<7;;<;<<<;<<<;<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:71:85:629	83	seq1	1484	99	35M	=	1324	-195	TTGACACCCAACTAATATTTGTCTGAGCAAAACAG	,,1<1<7&%<9+:<<9<<9<<<<<<<<5<<<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:319:165:698	147	seq1	1485	99	35M	=	1287	-233	TGACACCCAACTAATATTTGTCTGAGCAAAACAGT	;5;2;<:;<<:<<<<<<<<<;:;<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:8:60:182:718	83	seq1	1485	99	35M	=	1295	-225	TGACACCCAACTAATATTTGTCTGAGCAAAACAGT	<<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:82:932:400	147	seq1	1486	97	35M	=	1313	-208	GACACCCAACTAATATTTGTCTGAGCAAAACAGTC	<<;<<72<<7<<<<<<<<<<;<<<+7<<<<<<<<<	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:23:502:103	83	seq1	1486	99	35M	=	1294	-227	GACACCCAACTAATATTTGTCTGAGCAAAACAGTC	4:386:6<:::<:<:4:+<::4<<<6<<<<<<<66	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:139:331:63	147	seq1	1486	99	35M	=	1327	-194	GACACCCAACTAATATTTGTCTGAGCAAAACAGTC	7===================:=:============	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:53:156:845	147	seq1	1487	99	35M	=	1311	-211	ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT	171(*00,0;;&;7=77=;5;;(;1:=5=======	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:47:471:858	83	seq1	1487	99	35M	=	1335	-187	ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT	/;9<<63<<<<3<;<<<<<<<<<<<<<<<<<<<9<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:9:203:653	83	seq1	1488	99	35M	=	1296	-227	CACCCAACTAATATTTGTCTGAGCAAAACAGTCTA	37))&<8<<<<<7<4<;<777<<:<<<<<<<<;<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:1:199:760:42	83	seq1	1489	24	35M	=	1318	-206	ACCCAATTAATATTTTTCTTAGCAAAACAGTCTAG	58*5.<+<<<<,4<<**<90**9<<<<<<4<<<<<	MF:i:18	Aq:i:24	NM:i:3	UQ:i:34	H0:i:0	H1:i:0
+EAS218_1:4:37:1626:862	83	seq1	1489	99	35M	=	1321	-203	ACCCAACTAATATTTGTCTGAGCAAAACAGTCTAG	:663<<3<<<<<<<<<<:<<<<7<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:191:948:257	83	seq1	1493	99	35M	=	1325	-203	AACTAATATTTGTCTGAGCAAAACAGTCTAGATGA	:;;;;<<<<<<5<5<<<<<<<<7<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:171:343:758	147	seq1	1494	99	36M	=	1331	-199	ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAGA	:+;;<<<<<;<;:<<<;;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:9:1595:1826	147	seq1	1494	99	35M	=	1316	-213	ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAG	;76;;6:9<9<963;<<7<<<<<<<;<;<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:6:7:1547:1933	83	seq1	1497	99	35M	=	1308	-224	AATATTTGACTGAGCAAAACAGTCTAGATGAGAGA	<<<<<<<<-<<<<<:<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS51_64:3:67:782:132	147	seq1	1498	99	35M	=	1343	-190	ATATTTGTCTGAGCAAAACAGTCTAGATGAGAGAG	;;<;;;<<;;<<<;<<<;<<<;<<<<<<<<<<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:249:986:224	147	seq1	1499	99	35M	=	1325	-209	TATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGA	<<<3<;<;;<<;8<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:61:702:720	83	seq1	1500	99	35M	=	1320	-215	ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA	<<<4<4+0;<<:<<<<<<<<-<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:113:43:634	83	seq1	1500	99	35M	=	1340	-195	ATTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAA	;9;1;<5:<<<%<<<<;<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS56_53:7:22:22:934	83	seq1	1500	99	35M	=	1332	-203	ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA	<+72::72<<60<<<<<<<96<<<<0<<<<1<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:36:678:316	147	seq1	1500	99	35M	=	1328	-207	ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA	<<72.2,;;<)6<<<<:<<;;<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:102:825:507	83	seq1	1501	99	35M	=	1330	-206	TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC	<05<<<<<<<7<<<<<<<<<<<<<7<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:261:504:780	83	seq1	1501	99	35M	=	1337	-199	TTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAAC	80;8(;0==8+====;==49===============	MF:i:18	Aq:i:43	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS51_78:7:270:448:491	147	seq1	1501	99	35M	=	1313	-223	TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC	7;;;;+2;<<+<<<<<<<<7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:51:506:878	83	seq1	1501	99	36M	=	1314	-223	TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACT	<970;49;<;+<<<:<<<;;<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:73:936:1509	83	seq1	1502	99	40M	=	1322	-220	TTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT	99;66:<<;-<<<<:<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:41:576:1016	83	seq1	1503	99	35M	=	1320	-218	TGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTT	:<;<<<<<6<<<<;<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:123:610:472	147	seq1	1504	99	35M	=	1333	-206	GTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTC	:<::+<<9<<9<<<<=<<<<<=<<<<<<<<?<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:308:354:124	147	seq1	1507	99	35M	=	1331	-211	TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT	%+<)2<<<<<<<<8<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:11:1274:1230	83	seq1	1507	99	35M	=	1327	-215	TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT	.<<<<<<<<<<<<<<<<5<<<<<<<<<<5<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:169:292:652	147	seq1	1510	99	35M	=	1306	-239	GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA	79919-<-<<<<<<<<<<<<<<<<<<<6<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:18:376:416	83	seq1	1510	99	35M	=	1326	-219	GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA	70<<<<<<<7<7<<<2<<<<<<<<<<8<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:194:168:684	147	seq1	1512	99	36M	=	1340	-208	AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT	;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:73:273:488	83	seq1	1512	99	35M	=	1318	-229	AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGG	</<<:<<9;;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:324:515:230	83	seq1	1512	99	34M	=	1339	-207	AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAG	7<<1<<<7<+<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:1:209:345:87	83	seq1	1513	99	35M	=	1360	-188	AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT	<<;<<<<5<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:73:42:1038	83	seq1	1513	99	35M	=	1349	-199	AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:209:778:588	83	seq1	1514	99	36M	=	1326	-224	AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT	;8;98;;;<3<<<<<<<<<;<<;<<<<<;<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:1:115:683:296	147	seq1	1514	99	35M	=	1320	-229	AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTC	<<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:92:213:217	147	seq1	1515	99	35M	=	1333	-217	ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT	<<<<<:<<<<<<<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:177:562:806	147	seq1	1515	99	35M	=	1356	-194	ACAGTGTAGATGAGAGAGACCTTCCCTGGAGGTCT	)2<9;'/:<5<<<:<<:<:&5:&<8,<<+:<&<<<	MF:i:18	Aq:i:35	NM:i:2	UQ:i:11	H0:i:0	H1:i:1
+EAS1_103:3:320:505:814	147	seq1	1515	99	35M	=	1350	-200	ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT	<2<;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:9:206:901	147	seq1	1517	99	35M	=	1344	-208	AGTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGA	<<<<<<<<<<<<<.<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:71:707:568	83	seq1	1518	99	35M	=	1332	-221	GTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGAT	;9;<;<<<<<;<<<<<;<<<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:91:856:504	147	seq1	1520	99	35M	=	1366	-189	CTAGATGAGAGAGAACTTCCCTGGAGGTCTGATGG	:::<<:<<<<<<<<<<<<<<<<<<<<<:<:<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:77:48:860	147	seq1	1521	99	35M	=	1348	-208	TAGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC	;8;8;<9<9<<<<<<<<<4<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:16:434:204	83	seq1	1522	99	34M	=	1340	-216	AGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC	<:7:<<<<<<<<<<<9<<<+<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:43:1047:1626	83	seq1	1523	99	35M	=	1369	-189	GATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGT	<<4<<<<<<<<<<<:<<<;<<<<<:<7<<;<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:81:1723:1820	147	seq1	1524	99	35M	=	1335	-224	ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT	;6;;;<<<<<<<<<<<2<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:63:267:545	83	seq1	1524	99	35M	=	1354	-205	ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:90:406:631	83	seq1	1525	99	35M	=	1335	-225	TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTT	<<<:<:<<<-<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:14:420:712	147	seq1	1525	99	40M	=	1368	-197	TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCC	1::::<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:2:434:715	83	seq1	1527	99	35M	=	1363	-199	AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT	<<<<<<<<<:;<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:117:857:942	147	seq1	1527	99	35M	=	1372	-190	AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT	<<;<<<<<<<9<<<8<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:70:348:972	83	seq1	1528	99	35M	=	1343	-220	GAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTC	<99<-7<<7<<<87<<<)<<<<<<8<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:132:717:233	147	seq1	1529	99	35M	=	1368	-196	AGAGAACTTCCCTGGAGGTCTGATGGAGTTTCTCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS188_7:4:21:443:404	147	seq1	1529	99	35M	=	1345	-219	AGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCC	=9=9=9==:==========================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:148:286:316	83	seq1	1531	99	35M	=	1347	-219	AGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCT	;::::;9/:<9<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:85:1224:625	147	seq1	1532	99	35M	=	1331	-236	GAACTCCCCTGGAGGTCTGATGGCGTTTCTCCCTC	17;;7&-;<;<;:<6<<:;<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS221_1:8:73:108:1621	147	seq1	1532	99	35M	=	1373	-194	GAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTC	<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:73:182:444	147	seq1	1533	99	35M	=	1354	-214	AACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCG	:1<4;;::<<;<<<<;<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:152:765:744	83	seq1	1534	99	35M	=	1374	-195	ACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGT	6<;6<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:170:326:433	147	seq1	1535	99	35M	=	1367	-203	CTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGTC	:44<<<<<<<<<<:6<<<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:8:4:841:340	73	seq2	1	99	36M	*	0	0	TTCAAATGAACTTCTGTAATTGAAAAATTCATTTAA	<<<<<<<<;<<<<<<<<;<<<<<;<;:<<<<<<<;;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:4:142:943:582	73	seq2	1	99	35M	*	0	0	TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA	<<<<<<;<<<<<<:<<;<<<<;<<<;<<<:;<<<5	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:43:859:229	153	seq2	1	66	35M	*	0	0	TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA	+37<=<.;<<7.;77<5<<0<<<;<<<27<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:286:923:549	73	seq2	2	99	35M	*	0	0	TCAAATGAACTTCTGTAATTGAAAAATTCATTTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:117:578:853	73	seq2	5	99	35M	*	0	0	AATGAACTTCTGTAATTGAAAAATTCATTTAAGAA	<;<9<<<<<;<<;<<<<<<<<<<<,<98;<;;&92	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:289:472:86	137	seq2	6	99	35M	*	0	0	ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:302:997:951	73	seq2	6	69	35M	*	0	0	ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA	<<<<<<<<<<;<<:<<52<<:;;<6<<;<:<2:9/	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:13:1729:1844	73	seq2	6	99	35M	*	0	0	ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA	<<<;;<;7<<<<4<<<<762;6<<<<<<<;6;618	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:43:239:977	137	seq2	7	99	36M	*	0	0	TGAACTTCTGTAATTGAAAAATTCATTTAAGAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;7;<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:233:191:520	73	seq2	7	99	35M	*	0	0	TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<8<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:75:555:1591	137	seq2	7	99	35M	*	0	0	TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:43:656:1866	137	seq2	7	99	35M	*	0	0	TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;:;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:100:563:301	137	seq2	8	99	35M	*	0	0	GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;8;;;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:126:526:276	137	seq2	8	84	35M	*	0	0	GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:161:366:544	137	seq2	11	99	35M	*	0	0	CTTCTGTAATTGAAAAATTCATTTAAGAAATTACA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:326:652:890	73	seq2	12	99	35M	*	0	0	TTCTGTAATTGAAAAATTCATTTAAGAAATTACAA	<<<<<<<<<<2<<<<<<<<<<<<<<+<8:<<9998	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:238:441:727	73	seq2	16	99	35M	*	0	0	GTAATTGAAAAATTCATTTAAGAAATTACAAAATA	<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;;<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:64:507:478	137	seq2	17	99	35M	*	0	0	TAATTGAAAAATTCATTTAAGAAATTACAAAATAT	<<<<<;<<<<<<<<<<<<<<<;;;<<<;<<8;<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:8:118:440:850	137	seq2	18	99	35M	*	0	0	AATTGAAAAATTCATTTAAGAAATTACAAAATATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<949<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:7:270:995:918	137	seq2	24	84	35M	*	0	0	AAAATTCATTTAAGAAATTACAAAATATAGTTGAA	<<<<<<<<<<<<<:<<<<<<8<8<8<<<<:<;4;4	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:305:819:245	73	seq2	25	98	35M	*	0	0	AAATTCATTTAAGAAATTACAAAATATAGTTGAAA	8<<<<8<;<<<<<;<8<<8<8<<<<8<<<899<<+	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_26:7:13:172:720	73	seq2	26	99	35M	*	0	0	AATTCATTTAAGAAATTACAAAATATAGTTGAAAG	============:3<==:====<=9=3===;==83	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_63:7:34:334:825	73	seq2	30	99	35M	*	0	0	CATTTAAGAAATTACAAAATATAGTTGAAAGCTCT	<<<<<<<<<<<<<<<<<<<<<<<<3;<<<<6<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:32:1379:738	137	seq2	33	99	35M	*	0	0	TTAAGAAATTACAAAATATAGTTGAAAGCTCTAAC	;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_19:5:70:318:1631	137	seq2	34	99	40M	*	0	0	TAAGAAATTACAAAATATAGTTGAAAGCTCTAACAATAGA	<<<<<<;<<<<<<<<<<<<;9:<<<<<<<<<<<<<:::78	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:285:241:560	147	seq2	37	99	35M	=	200	198	GAAATTACAAAATATAGTTGAAAGCTCTAACAATA	<<<<<<<<<<;<<<<;<<<<<<<<<<<<;<;;;<.	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:168:389:889	83	seq2	37	99	36M	=	205	204	GAAATTACAAAATATAGTTGAAAGCTCTAACAATAG	<<<<<<<<<<<<<<<<<<<<;<<<<<<<;9;;<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:127:725:381	147	seq2	39	99	35M	=	209	204	AATTACAAAATATAGTTGAAAGCTCTAACAATAGA	<<<<<<<<<<<<<<<<<<<<<;<<<<;;;;;<<8:	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_93:5:66:372:343	147	seq2	40	99	35M	=	228	223	ATTACAAAATATAGTTGAAAGATCTAACAATAGAC	<<<<<<<<<<8<<<<<6<<<8&8<<<<<58<:<::	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS56_65:6:67:800:450	83	seq2	41	99	35M	=	221	215	TTACAAAATATAGTTGAAAGCTCTAACAATAGACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:90:1906:1528	147	seq2	41	99	35M	=	222	216	TTACAAAATATAGTTGAAAGCTCTAACAATAGACT	<<<<<<<<<<<<<<<:<<<:<<<<;<<<<<;:7:;	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:117:284:589	147	seq2	43	99	35M	=	210	202	ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA	==================================0	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:26:211:481	83	seq2	43	99	35M	=	222	214	ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA	<<<<<<<<<<<<<<<<<<<<<<<7<<<<<:<7<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:85:923:726	83	seq2	43	99	35M	=	199	191	ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA	<<<<<<<7<<<<<<<<<<<55<<<9<*<<<991<4	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:107:395:312	147	seq2	44	99	35M	=	224	215	CAAAATATAGTTGAAAGCTCTAACAATAGACTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<;<;;<:<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_597:7:5:753:806	147	seq2	45	99	35M	=	197	187	AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<7:-<;;3;;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_103:3:277:921:474	147	seq2	45	99	35M	=	241	231	AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC	<<<<<<<<<<<<<<<:<<<<<<<<<<<5<<;;;;;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_63:4:38:28:122	147	seq2	46	99	35M	=	227	216	AAATATAGTTGAAAGCTCTAACAATAGACTAAACC	<<<<<<;<<<<<<<;<<<<6<<<<<<:<<<<;;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS221_3:8:50:1203:1094	147	seq2	46	99	35M	=	223	212	AAATATAGTTGAAAGCTCTAACAATAGACTAAACC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_591:2:223:583:968	83	seq2	47	88	36M	=	215	204	AATATAGTTGAAAGCTCTAACAATAGACTAAACCAA	<<<<<<<29<<<<4<<<<<<<<<<<7<<7<..<<47	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_39:1:28:350:895	147	seq2	48	95	35M	=	215	202	ATATAGTTGAAAGCTCTAACAATAGACTAAACCAA	<<<<<<<<;<;<<<<<<<<<;;<<;<<<<<;;<;8	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_45:7:69:1130:832	83	seq2	50	94	35M	=	231	216	ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC	;;2<;<;;<;9;<;;;;;;;7;8;;7;;;;77437	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS188_7:3:296:224:724	147	seq2	50	99	35M	=	234	219	ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC	<<<<;<<<<<<7;<<<<<6<<<06<<<<<<2(<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_595:4:319:250:718	147	seq2	52	99	35M	=	240	223	AGTTGAAAGCTCTAACAATAGACTAAACCAAGCAG	<<<<<<<<<<<;<<5<5;<851;85;)9;;8594;	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS54_73:3:203:419:243	147	seq2	54	99	35M	=	237	218	TTGAAAGCTCTAACAATAGACTAAACCAAGCAGAA	<<<<<<<<<<<<<<<9<;<8<<<;<<<;<<<4<77	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:21:1601:1666	147	seq2	56	99	40M	=	228	212	GAAAGCTCTAACAATAGACTAAACCAAGCAGAAGAAAGAG	7<<<<<<<<:<<7<<<:<<<<<<4<<44<<914<;:5:::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:158:943:467	147	seq2	57	99	35M	=	225	203	AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA	<<<<<;<<<<<<<<<<<<<<;;<<<<<<<<<;8<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:54:91:1232	83	seq2	57	99	35M	=	246	224	AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:29:833:612	147	seq2	58	99	35M	=	224	201	AAGCTCTAACAATAGACTAAACCAAGCAGAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<;;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:1:189:503:110	147	seq2	63	79	35M	=	229	201	CTAACAATAGACTAAACCAAGCAGAAGAAAGAGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:25	H0:i:2	H1:i:0
+EAS114_28:2:114:938:216	83	seq2	63	99	36M	=	218	191	CTAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_95:5:257:654:116	83	seq2	64	99	35M	=	231	202	TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT	<<<<<<<<<<<<<<<<<<<<<<;:<<<<<<<<<88	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_97:3:277:144:848	147	seq2	64	99	35M	=	228	199	TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT	<<<<<<<<<;<<<<<<<<<<<<<<<<<3<<9;;6;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_108:4:75:166:463	83	seq2	64	99	35M	=	250	221	TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<++3	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:4
+B7_610:5:102:915:87	83	seq2	65	99	35M	=	222	192	AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC	<<<<<<<<<<<<<<<<<<<<;<<<<<3<<;<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:3	H1:i:0
+EAS54_71:3:78:855:352	147	seq2	65	99	35M	=	240	209	AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC	<<<<<<<<;<<<<<<<<<;<<<<<<<<;<;<<:<:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:3	H1:i:0
+EAS56_57:2:206:873:186	147	seq2	66	99	35M	=	227	196	ACAATAGACTAAACCAAGCAGAAGAAAGAGGTTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;53	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_93:6:238:514:194	147	seq2	68	99	35M	=	265	232	AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<;<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:3:285:489:327	83	seq2	68	99	35M	=	233	200	AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS54_67:1:15:381:715	83	seq2	72	99	35M	=	237	200	GACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTT	;=====;===9==;===9;;;=4;9=====;====	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:199:818:124	83	seq2	73	99	35M	=	266	228	ACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTTG	<<<<<<<<<<<<<<<<<;<<;<<;7<<<<<<9<9;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:182:1002:639	147	seq2	77	99	35M	=	246	204	AACCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGA	<<<<<<<<<<<<<<<<<<<<<9-<<<<4<;<;;<;	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:3:945:2005	147	seq2	77	99	35M	=	262	220	AACCAAGCAGAAGAAAGAGGCTCAGAACTTGAAGA	<<<<<<<<<<<<<<<<<<<<%<<<<<<;<<<<<<<	MF:i:18	Aq:i:44	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+B7_591:5:254:542:848	83	seq2	79	99	36M	=	233	190	CCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAA	<<<;<<<<<<<<<<<<<<<;4<;8<<<;;9<9;8;9	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:71:517:742	83	seq2	81	99	35M	=	266	220	AAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAAG	<<<<<<<<<<<<;<<<<<<<<<<<<<48:4<<<<3	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:254:617:73	147	seq2	83	99	35M	=	266	218	GCAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTC	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<6;:;4%	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:13:1507:1146	83	seq2	84	99	35M	=	278	229	CAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTCT	;<9;;;;<<;;;;<<;<;;;;<;;<<;<;<99777	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:32:686:735	83	seq2	84	78	35M	=	255	206	CAGAAGAAAGAGGTTCANANNNTGANGACAAGTCT	<<<<<<<<<<<<<<<<<!<!!!<<<!<<<<<<<<<	MF:i:-126	Aq:i:78	NM:i:5	UQ:i:0	H0:i:0	H1:i:0
+EAS56_57:3:112:729:591	83	seq2	86	99	35M	=	283	232	GAAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:17:1222:783	147	seq2	87	99	35M	=	251	199	AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCGT	<<<<<<<)<<<16<<;<<<6<4<:<4<+://<7)<	MF:i:18	Aq:i:59	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS188_7:6:46:122:479	83	seq2	87	99	35M	=	248	196	AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:313:531:169	147	seq2	89	99	36M	=	250	197	GAAAGAGGTTCAGAACTTGAAGACAAGTCTCTTATG	<<<<<<<<<<<<<;<<<<<<<<<<<:<<:<;<<;<2	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:148:170:895	83	seq2	91	99	35M	=	247	191	AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA	<<<<<<<<<<9<<<<<6<<<<<<<<<<<<<<<<6<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:34:380:815	147	seq2	91	99	35M	=	283	227	AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:210:809:735	147	seq2	93	99	35M	=	291	233	GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:40:925:442	147	seq2	93	99	35M	=	271	213	GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT	;<;<<<<<<<<<<<3;<7;:<;;<<<;<<:<32<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:169:256:888	147	seq2	94	99	35M	=	270	210	AGGTTCAGAACTTGAAGACAAGTCTCTTATGAATT	<<<<<<<<<<<<<<<<<<<<<<;;<;<<;<<:;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:117:156:84	83	seq2	95	99	35M	=	285	225	GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:35:522:294	147	seq2	95	99	35M	=	272	212	GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA	===============================:=:=	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:41:653:1568	147	seq2	95	99	35M	=	266	206	GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA	;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:178:276:693	147	seq2	96	99	36M	=	259	199	GTTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:223:440:667	83	seq2	97	99	35M	=	282	220	TTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC	<<<<<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:194:470:416	83	seq2	98	99	35M	=	265	202	TCAGAACTTGAAGACAAGTCTCTTATGAATTAACC	<<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:61:1000:1534	147	seq2	104	99	35M	=	286	217	CTTGAAGACAAGTCTCTTATGAATTAACCCAGTCA	<<<<4:<:<1)<<<<<<<+<:44<</7<<<)4:<)	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:145:383:182	147	seq2	105	99	35M	=	291	221	TTGAAGACAAGTCTCTTATGAATTAACCCAGTCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:63:816:921	147	seq2	106	99	35M	=	291	220	TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<4<846	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:77:1780:693	83	seq2	106	99	40M	=	276	210	TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGACAAAA	<<<<<<<<<<<<;<<:<<;<<<<<<<<<<<<;<<<;;:69	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:215:861:605	147	seq2	107	94	36M	=	262	191	NAAGACAAGTCTCTTATGAATTAACCCAGTCAGACA	!+++++++++++++++++++++++++++++++++++	MF:i:18	Aq:i:19	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS221_3:2:22:1623:709	83	seq2	107	99	35M	=	287	215	GAAGACAAGTCTCTTATGAATTAACCCAGTCAGAC	<<<<<<<<<7<<<<<<<:<<<<<<<<:85:<:2<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:54:436:1452	147	seq2	108	99	35M	=	275	202	AAGACAAGTCTCTTATGAATTAACCCAGTCAGACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:42:333:516	147	seq2	109	99	35M	=	296	222	AGACAAGTCTCTTATGAATTAACCCAGTCAGACAA	<<<<<5<*<2<<<<<<<<<<<<<<<<<<<<<<<</	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:119:730:190	83	seq2	114	99	35M	=	301	222	AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA	<<<9<;;<<<;<<<<<<<8<<<1<<918<;;;<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:63:727:203	83	seq2	114	99	35M	=	278	199	AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:27:577:849	147	seq2	114	99	35M	=	316	237	AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA	<<<<<<<<<<<<<<<<<<<<;:<<<;<<<<<<;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:5:5:259:250	83	seq2	115	99	35M	=	269	189	GTCTCTTATGAATTAACCCAGTCAGACAAAAATAA	<<<<<<<<<<<<<<<<<<<<;<<<;5<<5<;7<::	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:17:989:186	83	seq2	120	91	35M	=	299	214	TTATGAATTAACCCAGTCAGACAAAAATAAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<:<<;<7;::::	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS114_45:2:33:1445:1357	83	seq2	121	85	35M	=	299	213	TATGAATTAACCCAGTCAGACAAAAATAAAGAAAA	;;<;<<<<<<;;;<9:;:;;;;;:;:;;;;99777	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:7
+EAS221_3:4:30:1452:1563	147	seq2	122	94	35M	=	313	226	ATGAATTAACCAAGTCAGACAAAAATAAAGAAAAA	<<<<<<<<<<<<<<:<<<<1<<<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_45:1:77:1000:1780	147	seq2	123	66	35M	=	279	191	TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA	;;;:;;;;;;;/;;;7:4;;7;;;;;;;;;77777	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:6	H1:i:47
+EAS114_45:4:48:310:473	83	seq2	123	66	35M	=	298	210	TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA	<<<;<<;;;<<;;<;;;;;;;;;;;;;;;;89799	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:6	H1:i:47
+B7_591:2:279:124:41	83	seq2	124	69	36M	=	307	219	GAATTAACCCAGTCAGACAAAAANNAAGAAAAAAGA	<<<<<<<7/<8<<<<<<<<<<4*!!<<7<7<<5<<3	MF:i:18	Aq:i:0	NM:i:2	UQ:i:0	H0:i:0	H1:i:0
+EAS112_32:8:89:254:332	147	seq2	124	76	35M	=	291	202	GAATTAACCCAGTCAGACAAAAATAAAGAAAAAAG	==================;=========;=7;;<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:4	H1:i:36
+B7_597:7:103:731:697	83	seq2	125	72	35M	=	304	214	AATTAACCCAGTCAGACAAAAATAAAGAAAAAAGA	<<<<<<<<<<<<<<<<<<:<:<<6<<<<<<<:<;:	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:9	H1:i:55
+EAS139_11:2:71:83:58	147	seq2	148	77	9M2I24M	=	349	236	AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:77	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS192_3:4:63:5:870	147	seq2	148	75	9M2I24M	=	330	217	AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT	<<;<<<<<<<<<<<<<<<<<;<<<<<<<<<;;<<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS139_19:2:29:1822:1881	147	seq2	150	74	7M2I31M	=	328	218	AGAAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAGAAG	<<<<<<<<<<<<4<<<<<<<<<<<<<<:<<<:<<;:::::	MF:i:-126	Aq:i:74	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS221_3:2:100:1147:124	147	seq2	150	99	35M	=	345	230	AAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS192_3:8:6:104:118	147	seq2	154	99	35M	=	323	204	AAGAATTTTAAAAATGAACAGAGCTTTCAAGAAGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<=<<<<<<	MF:i:18	Aq:i:27	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_593:6:185:96:948	83	seq2	160	99	36M	=	324	200	TTTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT	<<<<<<<<<;6<<<<<<<<<;<<<;;<<<<<<<;<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:7:213:309:373	147	seq2	161	99	35M	=	317	191	TTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT	<;<<<<<<;<7<<<<<-<<<<<<<<<<<<<<4<7<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:30:466:652	83	seq2	163	98	35M	=	332	204	AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA	<<<<<<<<<<<<<<<<<<<<<<<<;<<<4;7<<<7	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:156:21:69	147	seq2	163	99	35M	=	362	234	AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA	<<<<<<<<<<<<<<<<<<<<<<<:<4<<<:<;<;;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:197:52:58	147	seq2	165	99	35M	=	323	193	AAATGAACAGAGCTTTCAAGAAGTATGAGATTATG	<<<<<<<<<<<<<<<<<<9<<<<2<<<<<<;<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:214:946:229	147	seq2	165	99	35M	=	339	209	AAATGAACAGAGCTTTCAAGAAGTATGATATTATG	<<<<<<<<<<<<<<<<<::<;;;<;<;7<:<<7<2	MF:i:18	Aq:i:65	NM:i:1	UQ:i:27	H0:i:1	H1:i:0
+EAS192_3:4:293:168:240	83	seq2	167	99	35M	=	340	208	ATGAACAGAGCTTTCAAGAAGTATGAGATTATGTA	<<<<;<<<;;;<;<<;;;<<;;<<::::<<;;+;7	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:208:118:673	83	seq2	169	76	35M	=	332	198	GAACAGAGCTTTCAAGAAGTATGAGATTATGTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:3:71:478:175	147	seq2	171	99	35M	=	317	181	ACAGAGCTTTCAAGAAGTATGAGATTATGTAAAGT	<<<<<<<<<<<;<<<<<;<<<<<<<<<<;<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:177:24:389	147	seq2	175	99	35M	=	365	225	AGCTTTCAAGAAGTATGAGATTATGTAAAGTAACT	<<<<<<<<<<<<<<<<<<<<<<<<7<;;<;9969;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:14:1211:1332	147	seq2	178	99	35M	=	351	208	TTTCAAGAAGTATGAGATTATGTAAAGTAACTGAA	;;.;;;;;;;3;;;;;6;;;;;;8;;;;;;63777	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:324:238:736	147	seq2	180	99	35M	=	367	222	TCAAGAAGTATGAGATTATGTAAAGTAACTGAACC	===================================	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:9:648:712	83	seq2	182	99	35M	=	358	211	AAGAAGTATGAGATTATGTAAAGTAACTGAACCTA	<9<;<<<<<<<;<<<<<8<<<<9<<;<<8)<:1<:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:41:1308:619	147	seq2	184	99	35M	=	360	211	GAAGTATGAGATTATGTAAAGTAACTGAACCTATG	<6+<*<<<<<<<:<<<<<<<:<<&<<<<1<6<11:	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:328:537:640	83	seq2	185	99	35M	=	352	202	AAGTATGAGATTATGTAAAGTAACTGAACCTATGA	<;<<<<<<;<<<<<<<<<:;<<8<<<;:<<<;<;9	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:86:697:941	147	seq2	187	99	35M	=	341	189	GTATGAGATTATGTAAAGTAACTGAACCTATGAGT	=====================<=<==<<====;=5	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:224:592:744	83	seq2	188	99	35M	=	383	230	TATGAGATTATGTAAAGTAACTGAACCTATGAGTC	<<<<<<<<<<<<<<<<;<<<<<7<<<<<<<&<*<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:135:354:66	83	seq2	188	99	35M	=	356	203	TATGAGATTATGTAAAGTAACTGAACCTATGAGTC	<<<<<<<<<<<<<<<<;<<<<<<<<<<;<<2<;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:71:311:202	147	seq2	188	99	35M	=	379	226	TATGAGATTATGTAAAGTAACTGAACCTATGAGTC	<<<<<<<<<<<<<<<<:4<<<<<<<<<<<<8;4;:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:50:30:15	83	seq2	192	39	35M	=	358	201	AGATTATGTAAAGTAACTTAACCTATGAGTCCAAG	+:79.68872.:9&:92/.299169/5+/6/3/&2	MF:i:18	Aq:i:10	NM:i:3	UQ:i:45	H0:i:0	H1:i:1
+EAS192_3:5:287:334:110	73	seq2	196	73	35M	=	196	0	TATGTAAAGTAACTGAACCTATGAGTCACAGGTAT	<<<<<<<<<<<<<<<<<<4;<<<<<<<::6<55:.	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:287:334:110	133	seq2	196	0	*	=	196	0	GATGAATACTAAGATTGATGTAGCAGCTTTTGCAA	.5+7)09<))&-&:33953<-./&&&)((;+3399	MF:i:-64
+B7_597:7:5:753:806	83	seq2	197	99	35M	=	45	-187	ATGTAAAGTAACTGAACCTATGAGTCACAGGTATT	;:<:<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:149:572:877	147	seq2	197	99	36M	=	334	173	ATGTAAAGTAACTGAACCTATGAGTCACAGGTATTC	=>7><>;>+>>/;>>=>=>=:>><>=<<==;)<=8;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:85:923:726	147	seq2	199	99	35M	=	43	-191	GTAAAGTAACTGAACCTATGAGTCACAGGTATTCC	<:<<<%3<<1<<86<<-<<<<<<<<<<<<6<<1<<	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:285:241:560	83	seq2	200	99	35M	=	37	-198	TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT	:<<<<;<<,<<<<5<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:41:461:436	147	seq2	200	74	35M	=	389	224	TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT	<<<<<<<<<<<<<<<<<<<:<<<<<<<<;<;;;:;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:6:25:949:33	83	seq2	201	99	35M	=	383	217	AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG	=;===/8========*==&;6=&=&:=6&:=::67	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:60:590:1760	83	seq2	201	99	35M	=	376	210	AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG	<:<<<<<2<<<<:<::<<<::<<<<<6<<<<<<<6	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:86:693:234	147	seq2	202	82	35M	=	388	221	AAGTAACTGAACCTATGAGTCACAGGTATTCCTGA	;;;;;;;;;;;;;;;;9;;;;;;;;99;;&70777	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:4:223:776	147	seq2	203	93	35M	=	387	219	AGTAACTGAACCTATGAGTCACAGGTATTCCTGAG	<<<<<<<<<<<<<<<<<<<<<<<<<9<<<:;<;2<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:3:88:84:1558	83	seq2	203	95	35M	=	394	226	AGTAACTGAACCTATGAGTCACAGGTATTCCTGTG	<<;<<<<<<<<<<<<;;<<<<<<<::<<<<<<7&<	MF:i:18	Aq:i:22	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_597:2:168:829:88	147	seq2	205	99	35M	=	369	199	TAACTGAACCTATGAGTCACAGGTATTCCTGAGGA	<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<9;4;2	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:168:389:889	147	seq2	205	99	36M	=	37	-204	TAACTGAACCTATGAGTCACAGGTATTCCTGAGGAA	;<<;;56;==================8========8	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:81:685:141	83	seq2	207	85	34M	=	382	210	ACTGAACCTATGAGTCACAGGTATTCCTGAGGAA	<<<<<<<<<<<<<<<<<<<<<;;<<;<<<',7,7	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:26:1312:1400	83	seq2	207	99	40M	=	385	218	ACTGAACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA	<<<<;<<<:<<:<;<:<<<;:;<<<<<<:<8<1;;:::88	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:127:725:381	83	seq2	209	99	34M	=	39	-204	TGAACCTATGAGTCACAGGTATTCCTGAGGAAAA	+<<.<<;<;<<<3;<;<<<<<<6<8;<<<<<<<1	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:19:736:559	83	seq2	209	99	35M	=	370	196	TGAACCTATGAGTCACAGGTATTCCTGAGGAAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:117:284:589	83	seq2	210	99	35M	=	43	-202	GAACCTATGAGTCACAGGTATTCCTGAGGAAAAAG	==8==;==================;==========	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:120:596:847	147	seq2	211	83	35M	=	410	234	AACCTATGAGTCACAGGTATTCCTGAGGAAAAAGA	<<<<<<<<<<<<<;<<<9<<<<<<<;:<62;58;2	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_610:5:51:904:391	147	seq2	212	97	35M	=	401	224	ACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA	<<<<<<<<<<<<<<<<<;<<<<<;:;<2<6;;;;;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:96:1314:1448	147	seq2	213	93	35M	=	388	210	CCTATGAGTCACAGGTATTCCTGAGGAAAAATAAA	<<<<<<<<<<<<<<<<<<<<<<<<5<4<<<<-<<<	MF:i:18	Aq:i:18	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS139_19:3:73:1158:535	147	seq2	213	99	40M	=	377	204	CCTATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTG	<<<<<<<<<<<<<<<<<<<<<<8<;;<<<<<9<<9::8:8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:223:583:968	147	seq2	215	88	36M	=	47	-204	TATGAGGCACAGGTATTCCTGAGGAAAAAGAAAAAG	1<';<<&%-:<<<<<:66%<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_97:3:160:173:889	147	seq2	215	99	35M	=	379	199	TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA	<<<<<<<<<<<<<<<<<<<<;0<7<<;<<<;7<09	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:28:350:895	83	seq2	215	95	35M	=	48	-202	TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA	:<;<<<:;<-<<<<<4;77<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:4:45:707:147	147	seq2	216	99	35M	=	424	243	ATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAG	<<<<<<<<<<<<&<<<<:<<9<<<9<<<<75;;;<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:18:1757:95	83	seq2	216	45	35M	=	374	193	ATGAGTCGCAGGTATTCCTGAGGAAAAAGAAAAAG	<<<<<<<<<<<<<<<<<<<1<:<<<<<<:<<<;:<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS51_66:6:310:747:415	147	seq2	217	99	35M	=	387	205	TGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGT	<<<<<<<<<<<<<<<<<<:<<<<<;<<<<<;<;<;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:114:938:216	147	seq2	218	99	36M	=	63	-191	GAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGA	<<<<7<6<<<<<<<6<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:179:629:513	147	seq2	220	99	35M	=	409	224	GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG	<<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<;<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:88:55:1187	83	seq2	220	66	35M	=	391	206	GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG	;;<;;;<<99<<;;<;;;;;:;49;:;;;;87898	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:119:38:945	83	seq2	221	99	35M	=	428	242	TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA	<<<<<<<<<<<<<<<8<<<<<8<<<8<;<<7<:<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:67:800:450	147	seq2	221	99	35M	=	41	-215	TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA	9-<9<;<<<<9;5<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:102:915:87	147	seq2	222	99	35M	=	65	-192	CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA	;<8<;;<<<<7;<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:113:367:659	147	seq2	222	72	35M	=	390	203	CACAGGTATTCCTGAGGAAAAAGAAAAAGCGAGAA	=9====8==========:=:=====9=:=&====5	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS218_1:2:26:211:481	147	seq2	222	99	35M	=	43	-214	CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA	:<:<<<<<<9:5<<<<<<<<<<<<<<:<:<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:90:1906:1528	83	seq2	222	99	35M	=	41	-216	CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA	:<<<<<<<<<3:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:13:100:876	147	seq2	223	73	36M	=	397	210	ACAGGGATTCCTGAGGAAAAAGAAAAAGTGAGAAGT	<8<<<*<2<7<<<6<<<<<<6<<8<<<<5<<<<4<9	MF:i:18	Aq:i:30	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+EAS56_63:5:117:570:971	147	seq2	223	99	35M	=	413	225	ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG	<<<<<<<<<<<<<;;;<<<<6<7;9;<:;<;<;;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:50:1203:1094	83	seq2	223	99	35M	=	46	-212	ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG	<7<<<<<5:+63<<<<<<<<<<<<<<<<2<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:107:395:312	83	seq2	224	99	35M	=	44	-215	CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT	;<;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:29:833:612	83	seq2	224	99	35M	=	58	-201	CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT	<<;<<<;<::<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:158:943:467	83	seq2	225	99	35M	=	57	-203	AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT	<:<<;;<:5<<<<<<<<<<<<<<<<<<;<<<;<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:201:768:529	147	seq2	225	99	35M	=	396	206	AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT	==========================1=======;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:11:994:584	83	seq2	226	97	35M	=	417	226	GGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTT	<<<<<<<<<<<7<<<<<<<<<<<<<6<<<<<<3<6	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:206:873:186	83	seq2	227	99	35M	=	66	-196	GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG	;<<;--7<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:4:38:28:122	83	seq2	227	99	35M	=	46	-216	GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG	;9;9;-1<<<<<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:66:372:343	83	seq2	228	99	35M	=	40	-223	TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG	;<1;89<<<<<;<9<<<<9<<<;8<9<;<<<<<;8	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:277:144:848	83	seq2	228	99	35M	=	64	-199	TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG	<<<)63<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:21:1601:1666	83	seq2	228	99	40M	=	56	-212	TATTACTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA	-;;3&1<<<<<<<<<<<<1<<<</<<<<<</<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_57:1:189:503:110	83	seq2	229	79	35M	=	63	-201	ATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGA	=;;6:==============================	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:5:257:654:116	147	seq2	231	99	35M	=	64	-202	TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA	0+37<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:69:1130:832	147	seq2	231	94	35M	=	50	-216	TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA	6)377;3;;;;;;;;;1;;;;;;;;;;;;;;;;;;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:254:542:848	147	seq2	233	99	36M	=	79	-190	CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC	,:4<8<<<<<<<<<<<<<;:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:285:489:327	147	seq2	233	99	35M	=	68	-200	CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA	9;;<<8<<<<<<<<<<<<;<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:163:611:211	147	seq2	234	99	35M	=	405	206	TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC	============8===============;=6;;<;	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:296:224:724	83	seq2	234	99	35M	=	50	-219	TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC	8<<<5<<<<<<<<<<<<<<<<<<<<7<<<<<;<9<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:58:271:612	83	seq2	236	99	35M	=	415	214	AGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTA	<;<<<<<<<<<7<<<<<<<<<<<<<<+47<<;<::	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:15:381:715	147	seq2	237	99	35M	=	72	-200	GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT	<<<<<<<<<<<<<<9<<<<<<97;<<<<<<<<9<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:203:419:243	83	seq2	237	99	35M	=	54	-218	GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:41:1281:1785	83	seq2	237	99	35M	=	399	197	GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT	<<<<<<<<<<<<<<<<<<<<<;<<<;<<<<<<<8<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:218:858:445	83	seq2	239	99	35M	=	421	217	AAAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT	;===5=;=======;==3======9;,79==;===	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:4:319:250:718	83	seq2	240	99	35M	=	52	-223	AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG	<;:<<<<;<<<:<<<<<<49:<<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:92:493:891	83	seq2	240	99	35M	=	408	203	AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG	<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<8	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:78:855:352	83	seq2	240	99	34M	=	65	-209	AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT	2<<<<<<<9<<4<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:277:921:474	83	seq2	241	99	35M	=	45	-231	AAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:41:199:388	83	seq2	243	99	35M	=	403	195	AGAAAAAGTGAGAAGTTTGGAAAAACTATTTGAGG	;;<<<<<;;<<<<<<;;<;;<<;;<<<<<<99999	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:307:481:625	83	seq2	245	99	36M	=	410	201	AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:134:126:465	83	seq2	245	99	35M	=	434	224	AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA	<<<<<<<<<<<<<;<<<<<<<<<<<<<5<<:<<41	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:44:153:969	147	seq2	245	95	35M	=	447	237	AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA	*:::7<77<:<<<<:<<(597:<:<9//7<529/0	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:182:1002:639	83	seq2	246	99	35M	=	77	-204	AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG	<<;;9;9<<<<<<;<7;<;<<<<;;<<<;<<7;<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:54:91:1232	147	seq2	246	99	35M	=	57	-224	AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG	;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:204:737:61	147	seq2	247	99	35M	=	437	225	AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT	<<<<<<<<<<<<<<<<<<<<<<<<<:<<9<+4:<0	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:148:170:895	147	seq2	247	99	35M	=	91	-191	AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT	<<9<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:46:122:479	147	seq2	248	99	35M	=	87	-196	AAGTGAGAAGTTTGGAAGAACTATTTGAGGAAGTA	<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS219_1:7:16:1343:1621	83	seq2	248	99	35M	=	426	213	AAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGTA	<<<<<<<<8<<<<;<<<;<;<<<<<<<:;4;71:;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:313:531:169	83	seq2	250	99	36M	=	89	-197	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT	98;<;;<<;8<<<<<<<<<<<8<<<<<<<<8<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:75:166:463	147	seq2	250	99	35M	=	64	-221	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT	<<<<<==============================	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:130:260:553	83	seq2	250	99	34M	=	439	224	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGCAC	<<<<<1<<<<<<<<<<6<<81</<4*2;7:+90(	MF:i:18	Aq:i:42	NM:i:2	UQ:i:31	H0:i:1	H1:i:0
+EAS56_59:2:60:677:921	83	seq2	250	96	35M	=	393	178	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:60:1037:1146	83	seq2	250	99	35M	=	447	232	GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT	<<<<<<<<<<<<<<<<<<<<<<<<<;<:;;;;;;<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:17:1222:783	83	seq2	251	99	35M	=	87	-199	TGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT	6<<<8<69<8199<7<<<6<<<<<<<<<1:<:<<:	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:96:491:1891	147	seq2	253	99	35M	=	409	191	AGAAGTTTGGAAAAACTATTTGAGGAAGTAATTGG	<:<<<<<::<<<<<<<<<<<<<<<<:<<::7<<:7	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:75:615:555	83	seq2	255	99	35M	=	416	196	AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG	<<<<<<<<<<<<<<<<<<<<<;<;<<<29<;.484	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:32:686:735	147	seq2	255	78	35M	=	84	-206	AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG	<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:65:85:1547	147	seq2	257	99	35M	=	434	212	GTTTGGAAAAACTATTTGAGGAAGTAATTGGGGAA	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<:<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:94:1655:1921	83	seq2	258	85	35M	=	447	224	TTTGGAAAAACTATTTGAGGAAGTAATTGGGGAAA	<<<8<<<<<<<<<8<<8;8<;<;<;;<<9+868<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_610:7:177:469:800	83	seq2	259	99	35M	=	433	209	TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA	<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<<;<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:178:276:693	83	seq2	259	99	36M	=	96	-199	TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAAC	:;<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:14:697:541	83	seq2	259	99	35M	=	432	208	TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA	<<<<<<<<<<<<<<<<<<<:<<<<<<<;;;;8;;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:37:156:134	147	seq2	261	99	35M	=	443	217	GGAAAAACTATTTGAGGAAGTAATTGGGGAAAACC	;;;;;;;;;;9;;;;;;;;;;;;;;;9;;;77679	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:215:861:605	83	seq2	262	94	36M	=	107	-191	GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC	;<<<<<;:<7:<<<;<<<<<<<;:<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:3:945:2005	83	seq2	262	99	35M	=	77	-220	GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCT	7<<<<;;<<;<<<<<7<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:52:751:360	147	seq2	263	99	35M	=	443	215	AAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC	<<<<<<<<<<<<<<<<<<<<<<<:76<<<<;9:;:	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:238:514:194	83	seq2	265	99	35M	=	68	-232	AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT	<<6<<<<:9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:194:470:416	147	seq2	265	99	35M	=	98	-202	AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT	<<<7<<;<<<<<<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:71:517:742	147	seq2	266	99	35M	=	81	-220	AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT	<<<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:254:617:73	83	seq2	266	99	35M	=	83	-218	AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT	<<:<<<9;<<<;;<:<-<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:199:818:124	147	seq2	266	99	35M	=	73	-228	AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:41:653:1568	83	seq2	266	99	35M	=	95	-206	AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT	977979;:;<;;;;;;<<5;<;<;<<<;;;;;;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:211:84:84	83	seq2	268	99	35M	=	440	207	CTATTTGAGGAAGTAATTGGGGAAAACCTCTTTAG	<<<<<<<<<<<<<<<<:<<:<<:<<<44<4<<9<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:152:355:962	147	seq2	269	99	35M	=	456	222	TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	<;<<<<<;8<<<<<<<<<;5;;88<<3<<<<<&0;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:285:395:450	83	seq2	269	99	35M	=	458	224	TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	<<<<<<<;<<<;<<<<<;:<:7<;<;7<7<<;;7<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:15:568:42	89	seq2	269	69	35M	=	269	-35	TTTTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	!!;:<8<;<<<8<<<<<<<<8<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:2	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:15:568:42	149	seq2	269	0	*	=	269	35	TTTTTTTTTTTGTTTTTTTTTTTTTTTTTTTTATA	!!!!!!!!!++++!!!!!!!!!!!!!!!!!!!,!,	MF:i:-64
+EAS192_3:8:6:237:885	83	seq2	269	99	35M	=	433	199	TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<;;;<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:5:5:259:250	147	seq2	269	99	35M	=	115	-189	TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	8<83;<<<<<<<<<<5<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:206:994:556	73	seq2	270	75	35M	=	270	0	ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<<;<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:206:994:556	133	seq2	270	0	*	=	270	0	NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	MF:i:-64
+EAS54_71:4:169:256:888	83	seq2	270	99	34M	=	94	-210	ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT	&<<:<;<<;;<8<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:317:72:221	147	seq2	270	99	35M	=	422	187	ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC	===========;=======;;:==6=;=====;==	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:40:925:442	83	seq2	271	99	35M	=	93	-213	TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT	=;=================================	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:158:909:321	147	seq2	271	99	35M	=	453	217	TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:35:522:294	83	seq2	272	99	35M	=	95	-212	TTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:176:971:874	147	seq2	273	76	35M	=	432	195	TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG	<<<<<<<<<<<<<:<;<<<<<<<<<<<<<5<<<<7	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:226:869:36	83	seq2	273	99	35M	=	461	223	TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG	:<<<<,:<;:.:<<:<<717,;2171717717116	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:106:595:322	147	seq2	274	99	35M	=	440	201	GAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<::	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:54:436:1452	83	seq2	275	99	35M	=	108	-202	AGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:77:1780:693	147	seq2	276	99	40M	=	106	-210	GGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGAT	:**::799<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:147:423:584	83	seq2	277	99	35M	=	451	209	GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;96	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:188:782:483	147	seq2	277	99	35M	=	431	189	GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<7<;77	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:78:1314:1275	83	seq2	277	99	35M	=	469	227	GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG	<<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<<<8	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:63:727:203	147	seq2	278	99	35M	=	114	-199	AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA	<<;7<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:13:1507:1146	147	seq2	278	99	35M	=	84	-229	AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA	88788;,;:-:2;;;;;;;;:;:;;;;;;;;;;;;	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:77:1000:1780	83	seq2	279	66	35M	=	123	-191	AGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAG	777774;;4-7;;;;;;:;;;:;;;<;;;;<<<<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:93:490:901	147	seq2	280	99	35M	=	445	200	GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA	<<<<<<<<<<<<<;<<<<<<<;<<<<<:<<1+4-8	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:227:657:95	83	seq2	280	99	35M	=	458	213	GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<85	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:57:324:546	147	seq2	281	99	36M	=	458	213	TAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT	<<<<<<<<<<<<<<<<<<<<<:<<<8:8<<;::;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:223:440:667	147	seq2	282	99	35M	=	97	-220	AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT	<<;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:26:274:1078	147	seq2	282	99	40M	=	458	216	AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC	<<<2<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;:::::	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:196:511:896	147	seq2	283	99	35M	=	446	198	ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT	<<<<<<<<<<<<<<<<<<<<<<<<;<<<4<88;<<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:112:729:591	147	seq2	283	99	35M	=	86	-232	ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT	;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:34:380:815	83	seq2	283	99	35M	=	91	-227	ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT	;;;;<<<<<<;<<<<;<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:117:156:84	147	seq2	285	99	35M	=	95	-225	TGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAG	<;;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:61:1000:1534	83	seq2	286	99	35M	=	104	-217	GGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGA	<<;<<<<;;<<;6;<<<;<4;<<7<<<<<;<<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:22:1623:709	147	seq2	287	99	35M	=	107	-215	GGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC	<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:7:682:201	147	seq2	288	99	35M	=	452	199	GGAAAACCTCTTTAGTCTTGCTAGAGATTTAGACA	<<<<<<<7<<7<<<<77&;-9<97<76<;<<993<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:91:89:666	153	seq2	289	60	35M	*	0	0	GAAAACCTCTTTAGTCTTGCTAGAGATTTAGACAT	74752;;4;;;;;;;;7);;;4;;;;)4;;;;;13	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:46:13:880	83	seq2	290	99	35M	=	445	190	AAAACCTCTTTAGTCTTGCTAGAGATTTAGACATC	<<<<<<<<<<<<<<<<<<<<;<7<3<<<9<+;;<9	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:187:715:521	147	seq2	291	99	35M	=	451	195	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<<<<<<<<<<<<<<<<<<<:<<<<<<<;<<;<;;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:210:809:735	83	seq2	291	99	35M	=	93	-233	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:145:383:182	83	seq2	291	99	35M	=	105	-221	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:8:89:254:332	83	seq2	291	76	35M	=	124	-202	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<<<<<:<;<<<<<<<<9<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:63:816:921	83	seq2	291	99	35M	=	106	-220	AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT	<<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:280:662:939	83	seq2	294	99	35M	=	442	183	CCTCTTTAGTCTTGCTAGAGATTTAGACATCTAAA	<<<<<<<<<<<<<;<<<;;7<<<<<<<<<<<<:8<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:250:628:423	147	seq2	295	99	36M	=	489	230	CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG	<<<<<<<<<<<<<<<<<<:;<<<<:<<<<;;;;;;4	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:255:549:422	147	seq2	295	99	35M	=	456	196	CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT	<<<<<<<<<<<<<<<<;<<<<<<<:<<<<<<;;;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:2:491:1886	89	seq2	295	75	35M	*	0	0	CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT	<<:<8:<<<:<<<<<<<<<<<9<<<<<<<<<<<<:	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:267:821:860	147	seq2	296	99	35M	=	451	189	TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG	;<<<<<8<<<<<8<<;<8<<<<<5<;<<<<<2;<5	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:42:333:516	83	seq2	296	99	35M	=	109	-222	TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG	<<<<<<<<7<63<7<<<<<<<<<<<7<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:119:161:322	83	seq2	297	99	35M	=	479	217	CTTTAGTCTTGCTAGAGATTTAGACATCTAAATGA	<<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<</6	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:48:310:473	147	seq2	298	66	35M	=	123	-210	TTTAGTCTTGCTAGAGATTTAGACATCTAAATGAA	77999;;6;;;;;;;;;;;;;;;9;;;;;;;;;;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:159:273:253	153	seq2	299	76	35M	*	0	0	TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA	<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:181:392:500	83	seq2	299	99	35M	=	470	206	TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA	<<<<<:<<<2<<<<;5<<<<29+<<)</65<7.24	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:17:989:186	147	seq2	299	91	35M	=	120	-214	TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA	87;38$<3=/<==============9=========	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:33:1445:1357	147	seq2	299	85	35M	=	121	-213	TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA	88888;;;;;;;:;;;;;;;:;9;;;;;;;;;;;;	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:119:730:190	147	seq2	301	99	35M	=	114	-222	AGTCTTGCTAGAGATTTAGACATCTAAATGAAAGA	;;;3;<<:<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:62:969:12	83	seq2	303	99	35M	=	464	196	TCTTGCTAGAGATTTAGACATCTAAATGAAAGAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:103:731:697	147	seq2	304	72	35M	=	125	-214	CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC	:::;3:<<<<<<<:<<<<<<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:111:142:21	147	seq2	304	99	35M	=	479	210	CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC	<<<<<<<<:<:<<<<<<<<<<<<<<<<<<<<;<;9	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:7:319:280:57	83	seq2	306	99	35M	=	467	196	TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC	;==========;=====6;=========;=<;6;;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:76:205:587	147	seq2	306	99	35M	=	483	212	TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:279:124:41	147	seq2	307	69	36M	=	124	-219	GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA	:17<8<<<:&<<<<<<:;'<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:10:349:1147	153	seq2	307	74	40M	*	0	0	GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA	:/:::<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:16	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:22:490:2011	83	seq2	307	99	35M	=	485	213	GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:46:173:214	147	seq2	308	99	35M	=	487	214	CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<;<3<<<<<<;	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:283:577:398	83	seq2	308	99	35M	=	488	215	CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA	<<<<<<<<<<<<<<<<<<<9<<<<<<<<<;<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:27:280:592	83	seq2	310	99	36M	=	484	210	AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGA	<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<5<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:3:11:1238:1728	147	seq2	310	99	35M	=	475	200	AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAG	<<7<<<<<;<<<<<<<<<<<<;<<<;<<<<<<;;<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:118:121:760	89	seq2	311	77	36M	*	0	0	GAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA	:<<<;;<<<<6<;<<<;<<<<;<<<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:7:318:679:883	153	seq2	313	75	35M	*	0	0	GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT	<<;4<<;<:<<7<<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:30:1452:1563	83	seq2	313	94	35M	=	122	-226	GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT	<<39<<<59<<:<<+<<<6<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:189:130:136	83	seq2	314	79	35M	=	494	215	ATTTAGACATCTAAATGAAAGAGGCTCAAAGAATG	==<<=================<<====<<=;=6==	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:27:577:849	83	seq2	316	99	35M	=	114	-237	TTAGACATCTAAATGAAAGAGGCTCAAAGAATGCC	5:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:3:71:478:175	83	seq2	317	99	35M	=	171	-181	TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA	<<<<;<96<<<<;<<<<<<<<<77<<<<<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:38:999:463	83	seq2	317	39	35M	=	503	221	TAGACATCTAAATGAAAGNNGCNNNAAGAATGCCA	7<<<<<<<<:07<<:<<7!!<<!!!::<88<<<<4	MF:i:-126	Aq:i:39	NM:i:5	UQ:i:0	H0:i:0	H1:i:0
+EAS54_71:8:215:830:609	89	seq2	317	71	33M	*	0	0	AAGACATCTAAATGAAAGAGGCTCAAAGAATGC	+<)<:<<:<<<<<<<<<9<<<<<;<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:1	UQ:i:11	H0:i:1	H1:i:0
+EAS188_7:7:213:309:373	83	seq2	317	99	35M	=	161	-191	TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA	<<<86<82<<<<<<<<<<<<<<<9<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:45:1339:1807	153	seq2	319	64	35M	*	0	0	GACATCTAAATGAAAGAGGCTCAAAGAATGCCAGG	77797;;:;::&:;;0:;8;;4;;:;;6;;;;;;;	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:197:52:58	83	seq2	323	99	35M	=	165	-193	TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA	<7;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:8:6:104:118	83	seq2	323	99	35M	=	154	-204	TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:185:96:948	147	seq2	324	99	36M	=	160	-200	CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATA	6<;;<;<<;<<<<<747<<<<<<<<77<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:61:346:384	147	seq2	324	68	35M	=	496	207	CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT	<<;<<<<<<<<9<;<<9;<6<2;<6<<<;9*558;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:177:800:714	147	seq2	324	76	35M	=	497	208	CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT	<<<<<<<<<<<<<<<<<<<<<;<<<;<;<<<<<;<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:329:339:408	83	seq2	325	99	36M	=	515	226	TAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:214:565:337	83	seq2	326	99	35M	=	481	190	AAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC	<;<<<<<<<<<<<<<<;<<<<9<<<<<;;;;<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:296:401:60	89	seq2	327	68	35M	*	0	0	AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA	<<*<<<<7<<)<<3<<<9<<<<<<<<<<<<<<;<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:88:1413:14	89	seq2	327	76	35M	*	0	0	AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA	<<<<<<<<<<<;;;<<<<<<;<;;<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:34:649:318	147	seq2	328	65	35M	=	481	188	ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACAT	9<<3<<<9<<<<<<<<<7<<9<<0<<.0<*:77,;	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:29:1822:1881	83	seq2	328	74	40M	=	150	-218	ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA	;87;;<<<;<5<5<<<<<<<;<<<<<<<<<<<<:<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:187:199:369	153	seq2	329	74	35M	*	0	0	TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT	;<><<<<<<<<7<<<<<<<<=<<<<<<<<<<<<<<	MF:i:32	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:23:268:529	153	seq2	329	71	35M	*	0	0	TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT	7;<<<<<<57;-<<<<<<:<77<<<<<<<;<;<<<	MF:i:32	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:315:219:7	153	seq2	330	69	35M	*	0	0	GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG	7==::<2=8<<<=====>888<=2=>==>,>,>>8	MF:i:32	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:63:5:870	83	seq2	330	75	35M	=	148	-217	GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG	:<;<;<<<4:;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:243:557:560	147	seq2	331	75	36M	=	499	204	AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA	<<<<<<<9<<<<<<<<<<<<<<<<<<;<<89<<9<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:270:430:269	147	seq2	331	99	36M	=	519	224	AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;7;:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:6:284:442:747	89	seq2	331	75	35M	*	0	0	AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC	<;<<<<<:<;<<<<<<<<;<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:71:31:1973	89	seq2	331	76	35M	*	0	0	AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC	<<<<<7<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:30:466:652	147	seq2	332	98	35M	=	163	-204	AAGAGGCTAAAAGAATGCCAGGAAGATACATTGCA	<<<<<;3;&<<<<<<<</6<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS56_61:3:208:118:673	147	seq2	332	76	35M	=	169	-198	AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA	<<<<<;;<;<<<<<<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:95:1530:28	147	seq2	332	74	35M	=	490	193	AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA	;;;;;;;;;;:;;;;;;;8;;;;;;;;;;;77747	MF:i:18	Aq:i:9	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:104:965:517	73	seq2	333	77	35M	=	333	0	AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA	<<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<;<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:104:965:517	133	seq2	333	0	*	=	333	0	NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	MF:i:-64
+EAS54_65:7:155:629:357	147	seq2	333	99	35M	=	521	223	AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA	<<<<<<<<8<8<<6<<<<<<<<;<9<5<;<;;941	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:149:572:877	83	seq2	334	99	36M	=	197	-173	GAGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA	6<94693<;<<<<;;<<<<<<<<<<;9<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:53:544:889	83	seq2	335	76	35M	=	495	195	AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA	<<<<<<<<;<<<<<<<<<<<<<<<<<;<<<<<;<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:226:370:91	83	seq2	335	99	35M	=	482	182	AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA	8<<<;<8<8<;<<<8<<;7<7;8784<<,;864<&	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:119:651:88	147	seq2	337	99	35M	=	527	225	GCTCAAAGAATGCCAGGAAGATACATTGCAAGACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:20:592:496	147	seq2	338	75	35M	=	498	195	CTCAAAGAATGCCAGGAAGATACATTGCAAGACAG	<<<<<<<<<<<<<<<<<<<<<<<<<==<<<<<<:<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:214:946:229	83	seq2	339	99	35M	=	165	-209	ACAAAGAATGCCAGGAAGATACATTGCAAGACAGA	)+<<<*<<77;8<;7<<8<4<;<88<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS188_7:5:163:982:695	83	seq2	339	77	35M	=	499	195	TCAAAGAATGCCAGGAAGATACATTGCAAGACAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:14:1872:1521	147	seq2	339	62	35M	=	500	196	TCAAAGAATGCCAGGAAGATACATTGCAAGTCAGA	7<<<<77<<<3<3<7.'<<<<<7<67<+.0%4*<4	MF:i:18	Aq:i:2	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS192_3:4:293:168:240	147	seq2	340	99	35M	=	167	-208	CAAAGAATGCCAGGAAGATACATTGCAAGACAGAC	+;;;;<8<<86<<<<<<<;;8;7;<;<8<8;<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:86:697:941	83	seq2	341	99	35M	=	187	-189	AAAAAAATCCCGGAAGATACATTGCAAGACAGACT	1<<%<<<1:<58<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:4	UQ:i:67	H0:i:0	H1:i:0
+EAS54_71:4:14:88:306	83	seq2	341	99	34M	=	521	215	AAAGAATGCCAGGAAGATACATTGCAAGACAGAC	<<<<<<8<<<<<<;<<<3<<<8<<;<;;<15<:6	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:183:697:555	147	seq2	341	84	35M	=	505	199	AAAGAATGCCAGGAAGATACATTGCCAGACAGACT	=====================:===&==:;==5;;	MF:i:18	Aq:i:37	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS56_57:3:41:739:907	147	seq2	344	99	35M	=	520	211	GAATGCCAGGAAGATACATTGCAAGACAGACTTCA	<<<<<<<<<<<<<<<<<<<<<<<<;<9<<<;;;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:100:1147:124	83	seq2	345	99	35M	=	150	-230	AATGCCAGGAAGATACATTGCAAGACAGACTTCAT	<<<<96<<<<<<<<<<<<<<<<<<<<<<:<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:127:828:697	83	seq2	346	99	35M	=	552	241	ATGCCAGGAAGATACATTGCAAGACAGACTTCATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:62:125:888	147	seq2	347	99	35M	=	504	192	TGCCAGGAAGATACATTGCAAGACAGACTTCATCA	<<<<<<<<<<<<<<<<<<<::<<<:7<::<:;<<:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:1:1598:843	147	seq2	347	99	40M	=	500	193	TGCCAGGAAGATACATTGCAAGACAGACTTCATCAAGATA	<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<8<4:8::	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:71:83:58	83	seq2	349	77	35M	=	148	-236	CCAGGAAGATACATTGCAAGACAGACTTCATCAAG	8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:88:1454:418	147	seq2	349	99	35M	=	522	208	CCAGGAAGATACATTGCAAGACAGACTTCATCAAG	:<<:<<<<<<<<<<<::::<:<:<9<5<<<<<<8:	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:36:649:554	147	seq2	350	99	35M	=	523	208	CAGGAAGATACATTGCAAGACAGACTTCATCAAGA	<<<<<4<<8<<<<<<8<6<<88<<<<<<<-;<;0;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:189:831:878	147	seq2	351	99	35M	=	555	239	AGGAAGATACATTGCAAGACAGACTTCATCAAGAT	:<<<2<<<<<<<<<<:8<8<<<<<<<<<<87489;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:14:1211:1332	83	seq2	351	99	35M	=	178	-208	AGGAAGATACATTGCAAGACAGACTTCATCAAGAT	978961;;991;97;<;;<;<<;;;;;<;;<:8:<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:4:328:537:640	147	seq2	352	99	35M	=	185	-202	GGAAGATACATTGCAAGACAGACTTCATCAAGATA	;:<<;<<<<<::<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:85:361:418	83	seq2	353	99	36M	=	517	200	GAAGATACATTGCAAGACAGACTTCATCAAGATATG	<<<<<<<<<<<<<;<<<<<<<<<<<<<<;4;<<<<3	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:329:437:643	83	seq2	354	99	36M	=	540	222	AAGATACATTGCAAGACAGACTTCATCAAGATATGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<<<1	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:135:354:66	147	seq2	356	99	35M	=	188	-203	GATACATTGCAAGACAGACTTCATCAAGATATGTA	;;;;7<<<<:<<<<;<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:9:648:712	147	seq2	358	99	35M	=	182	-211	TACATTGCAAGACAGACTTCATCAAGATATGTAGT	*;0;;;95<<<<7<<<;;<<<;;<<<<;<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:36:1184:994	147	seq2	358	99	35M	=	518	195	TACATTGCAAGACAGACTTCATCAAGATATGTAGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<8<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:50:30:15	147	seq2	358	10	35M	=	192	-201	TACATTGCAAGACAGTCGTCAGCAAGATATGTAGT	1-%-22&&)&11,&/&&176<&<<<222<,6,<<<	MF:i:18	Aq:i:10	NM:i:3	UQ:i:26	H0:i:0	H1:i:0
+EAS51_66:4:322:350:374	147	seq2	360	99	35M	=	546	221	CATTGCAAGACAGACTTCATCAAGATATGTAGTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:41:745:603	147	seq2	360	99	35M	=	536	211	CATTGCAAGACAGACTTCATCAAGATATGTAGTCA	<<<<<<<<<<<<:<<<<<<<<<<<<<<<6<:8<<:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:138:186:459	147	seq2	360	97	35M	=	518	193	CATTGCAAGACAGACTTCATCAAGATATGTAGTCA	<*<<7<<0<7<<+<-:<<&<:6:4:0-:<<2.:5<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:41:1308:619	83	seq2	360	99	35M	=	184	-211	CATTGCAAGACAGACTTCATCAAGATATGTAGTCA	0<9476<<<<<0<<<2<&<0<.<<<<<<<<<.<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:125:884:276	147	seq2	362	99	35M	=	541	214	TTGCAAGACAGACTTCATCAAGATATGTAGTCATC	<<<<<<<<<<<8<<<<<<<<<<<<<<<<<<;;<<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:156:21:69	83	seq2	362	99	35M	=	163	-234	TTGCAAGACAGACTTCATCAAGATATGTAGTCATC	<:3:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:66:1381:181	147	seq2	362	99	40M	=	544	222	TTGCAAGACAGACTTCATCAAGATATGTAGTCATCAGACT	<<6<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<::4:7	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:11:1261:1200	147	seq2	362	99	35M	=	558	231	TTGCAAGACAGACTTCATCAAGTTATGTAGTCATC	<<<<<<<<<<<;<<<<<<<<;<<<;<:<<8<<:<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_99:5:191:885:623	147	seq2	363	99	35M	=	551	223	TGCAAGACAGACTTCATCAAGATATGTAGTCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:53:783:78	83	seq2	363	99	35M	=	561	233	TGCAAGACAGACTTCATCAAGATATGTAGTCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<7;<:;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:177:24:389	83	seq2	365	99	35M	=	175	-225	CAAGACAGACTTCATCAAGATATGTAGTCATCAGA	+<<;<9<<<9<<;<<7<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:58:684:520	83	seq2	367	99	35M	=	538	206	AGACAGACTTCATCAAGATATGTAGTCATCAGACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:71:187:824	83	seq2	367	99	35M	=	534	202	AGACAGACTTCATCAAGATATGTAGTCATCAGACT	;===;======3==;==========4=;=7;;3;6	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:324:238:736	83	seq2	367	99	35M	=	180	-222	AGACAGACTTCATCAAGATATGTAGTCATCAGACT	<<<9<<<70,<<4<<<<<7<4<7<<<<<0<<<<<7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:19:306:982	83	seq2	368	99	35M	=	538	205	GACAGACTTCATCAAGATATGTAGTCATCAGACTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:168:829:88	83	seq2	369	99	35M	=	205	-199	ACAGACTTCATCAAGATATGTAGTCATCAGACTAT	<,,;<838883;;;<<<<<;<8<8;<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:122:589:134	147	seq2	369	99	35M	=	562	228	ACAGACTTCATCAAGATATGTAGTCATCAGACTAT	<<:<<:<:<<<<<:<8<<<<<<<:<::<<<4:<;;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:3:303:970:243	147	seq2	370	99	35M	=	564	229	CAGACTTCATCAAGATATGTAGTCATCAGACTATC	<<<<<<<<<<<<<<<<<<<<;;<<<<<<<<<8<8<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:2:19:736:559	147	seq2	370	99	35M	=	209	-196	AAGACTTCATCAAGATATGTAGTCATCAGACTATC	)<7<2;;4<<4<<<<;<<<<<<<<<<7<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS51_66:3:246:711:981	83	seq2	371	99	35M	=	559	223	AGACTTCATCAAGATATGTAGTCATCAGACTATCT	<<<<<<<<;<<<<:;<<;;<:<<<4<<:4;00<;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:89:1164:573	83	seq2	371	99	35M	=	560	224	AGACTTCATCAAGAGATGTAGTCATCAGACTATCT	<:<<;<2<<<<<<<&:2<;<;<<<<;,+;:<<4:<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS220_1:8:18:1757:95	147	seq2	374	45	35M	=	216	-193	CTTCATCAAGATATGTAGTCATCAGACTATCTAAA	<<<6<&:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:284:597:682	83	seq2	375	99	35M	=	557	217	TTCATCAAGATATGTAGTCATCAGACTATCTAAAG	<<<<<<<9<<<<<;<<6<<<<<;<9<<<<<<1;;9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:10:394:392	83	seq2	376	99	35M	=	542	201	TCATCAAGATATGTAGTCATCAGACTATCTAAATT	<<<<<<<<<<<<<<<<<<<:<<<<<<;<<;;:6&;	MF:i:18	Aq:i:68	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_97:5:28:538:148	147	seq2	376	99	35M	=	557	216	TCATCAAGATATGTAGTCATCAGACTATCTAAAGT	<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<+771;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:60:590:1760	147	seq2	376	99	35M	=	201	-210	TCATCAAGATATGTAGTCATCAGACTATCTAAAGT	<8<-<<<<<<<82<<<4<<<<<<<<<<<<<8<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:73:1158:535	83	seq2	377	99	40M	=	213	-204	AATAAAGATATGTAGTCATCAGACTATCTAAAGTCAACAT	+;6+;<;<<<<<<<<<0<<;<<<;<<<8<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:2	UQ:i:20	H0:i:1	H1:i:0
+EAS188_7:3:182:104:921	83	seq2	378	99	35M	=	575	232	ATCAAGATATGTAGTCATCAGACTATCTAAAGTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:160:173:889	83	seq2	379	99	35M	=	215	-199	TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA	;)<</<8<<<<<<</<;<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:71:311:202	83	seq2	379	99	35M	=	188	-226	TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA	;6<;<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:315:201:673	147	seq2	381	45	36M	=	542	197	AAGATATGTAGTCATCAGACTATCTAAAGTCAACAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<<:;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:228:915:631	147	seq2	381	66	35M	=	547	201	AAGATATGTAGTCATCAGACTATCTAAAGTCAACA	=================;==========4======	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:228:736:747	147	seq2	381	68	35M	=	542	196	AAGATATGTAGTCATCAGACTATCTAAAGTCAACA	<<<<<<<<<;<<<<<<<;;<<;<<<<;::<;;7;7	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:263:689:572	83	seq2	381	68	35M	=	553	207	AAGATATGTAGTCATCAGACTATCTAAAGTCAACA	<<<<;<<<<<;<<<<<<&;;<<<;<<:<+;;7;;7	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:5:81:685:141	147	seq2	382	85	35M	=	207	-210	AGATATGTAGTCATCAGACTATCTAAAGTCAACAT	;+;(;)..=3.1=.7=;=8;==<4====;======	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:2	H1:i:2
+EAS114_32:1:208:971:600	147	seq2	382	99	35M	=	559	212	AGATATGTAGTCATCAGACTATCTAAAGTCAACAT	<<<<<<<<<<<<<<<<<8<<:<<<0;44<<:4<:<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:7:1864:1569	83	seq2	382	99	35M	=	561	214	AGATATGTAGTCATCAGACTATCTAAAGTCAACAT	<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<8<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:224:592:744	147	seq2	383	99	35M	=	188	-230	GATATGTAGTCATCAGACTATCTAAAGTCAACATG	6<6<<<<<<9+<6-<<<:<:<:<<<<<:<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:6:25:949:33	147	seq2	383	99	35M	=	201	-217	GATATGTAGTCATCAGACTATCTAAAGTCAACATG	-<4<666<<-7<5<<<<<(<<<<<<<<<<<<<<-<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:2	H1:i:1
+EAS54_73:5:271:874:367	147	seq2	384	99	35M	=	560	211	ATATGTAGTCATCAGACTATCTAAAGTCAACATTA	<<<<<<<<<<<<<<4<;<;<:<;4<4<<99<7<+%	MF:i:18	Aq:i:51	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS139_19:4:26:1312:1400	147	seq2	385	99	40M	=	207	-218	TATGTAGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	::77:<;:+6<+<<<;<<74<<<;<<;<<<<<<<<<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:2
+EAS51_66:6:310:747:415	83	seq2	387	99	35M	=	217	-205	TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG	;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:2	H1:i:6
+EAS56_57:6:4:223:776	83	seq2	387	93	35M	=	203	-219	TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG	<;9<;<0<<;<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:2	H1:i:6
+EAS114_28:3:32:492:907	83	seq2	387	95	36M	=	571	220	TGTAGTCATCAGACTATCTAAAGTCAACATGAAGGA	<<<<<<<<<<<<<<<<<<<;<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS114_26:4:110:840:431	147	seq2	388	93	35M	=	567	214	GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA	=====================5:======54=+3+	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS114_45:6:86:693:234	83	seq2	388	82	35M	=	202	-221	GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA	83997;<;;;;98;;3*6<<;<:8;;;;;<;;<<<	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:3	H1:i:13
+EAS139_11:8:96:1314:1448	83	seq2	388	93	35M	=	213	-210	GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA	<<<<7<<:<<<<<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:3	H1:i:8
+EAS114_30:6:41:461:436	83	seq2	389	74	35M	=	200	-224	TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA	;<986<;6<<<<<<<;<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:3	H1:i:13
+EAS221_3:8:55:932:613	147	seq2	389	77	35M	=	568	214	TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA	<<<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:3	H1:i:10
+EAS1_97:5:219:174:684	147	seq2	390	71	35M	=	560	205	AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	<<<<<<<<<<<8<8<<<7<<;<<<<<2<;&;;;;9	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:2	H1:i:14
+EAS56_57:5:24:284:360	147	seq2	390	76	35M	=	567	212	AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	<<<<<<<<<<<<<<<<<;<<<<<<<;<9;<;99;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:2	H1:i:14
+EAS114_26:1:113:367:659	83	seq2	390	72	35M	=	222	-203	AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	<<5<0&9;<3<<<<<9<<<<4<;<9<9<<<<7<3<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:3	H1:i:17
+EAS114_32:5:109:199:592	147	seq2	390	72	35M	=	576	221	AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA	<<<<<<<<<<<;:<;;<<:;6<<;:;:<<+;;;<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:2	H1:i:14
+EAS114_45:4:88:55:1187	147	seq2	391	66	35M	=	220	-206	GTCATCAGACTATCTAAAGTCAACATGAAGGAAAA	7769,7;;;;;;;;;;;;;;9;;;;;;;;;;;;;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:2	H1:i:7
+EAS56_59:2:60:677:921	147	seq2	393	96	35M	=	250	-178	CATCAGACTATCTAAAGTCAACATGAAGGAAAAAA	========9==;======8==>=============	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:4	H1:i:13
+EAS114_39:3:88:84:1558	147	seq2	394	95	35M	=	203	-226	ATCAGACTATCTAAAGTCAACATGAAGGAAAAAAA	;;<<;<<;<<5<<<<<<;<<:<<<;<<<<<<;<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:2	H1:i:3
+EAS56_59:2:201:768:529	83	seq2	396	99	35M	=	225	-206	CAGACTATCTAAAGTCAACATGAAGGAAAAAAATT	3<:<9<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:13:100:876	83	seq2	397	73	36M	=	223	-210	AGAATATATAAAGTCAACATGAAGGAAAAAAATTCT	;9<$<<<$<<<<<<<<75<<<<<<<9<9<<<<<<<<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:6	H0:i:1	H1:i:1
+EAS139_11:4:26:137:1382	83	seq2	397	99	35M	=	579	217	AGACTATCTAAAGTCAACATGAAGGAAAAAAATTC	<<<<<<7<<<77<<<<<<</<<+<<<<<<7<+<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_67:3:197:261:624	83	seq2	398	99	35M	=	587	224	GACTATCTAAAGTCAACATGAAGGAAAAAAATTCT	<<<<<<<<<<<;<<<<<<<;<<;<<<<<<;<<<9<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS218_4:3:41:1281:1785	147	seq2	399	99	35M	=	237	-197	ACTATCTAAAGTCAACATGAAGGAAAAAAATTCTA	<6<<<6<<<<<<:<<6<:<<<<<<<<<<<<6<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+B7_610:5:51:904:391	83	seq2	401	97	35M	=	212	-224	TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA	;<96<<<<<<7<<7<<<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_63:7:137:139:248	147	seq2	401	97	35M	=	569	203	TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA	<<<<<<<<<9<<<<<<<<<<;<<<<<<<;;<;<;<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:3	H1:i:2
+B7_610:7:15:696:693	147	seq2	403	34	35M	=	570	202	TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT	2:+:7<<3<<<<<6+36<<<<<<<6<<6&<<;<.7	MF:i:18	Aq:i:10	NM:i:0	UQ:i:0	H0:i:2	H1:i:1
+EAS114_45:2:41:199:388	147	seq2	403	99	35M	=	243	-195	TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT	84898;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:163:611:211	83	seq2	405	99	35M	=	234	-206	TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA	<<<<9<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:1:114:19:769	147	seq2	405	90	35M	=	572	202	TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA	<<<<<*2;6;<<<4.;;<&;;<.<40)<);5-/7;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS51_64:7:92:493:891	147	seq2	408	99	35M	=	240	-203	AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA	<383<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:5:996:2000	147	seq2	408	99	35M	=	575	202	AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_93:1:179:629:513	83	seq2	409	99	35M	=	220	-224	GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA	<;,<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:84:1505:1037	83	seq2	409	99	35M	=	586	212	GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA	<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<::)	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS221_1:6:96:491:1891	83	seq2	409	99	35M	=	253	-191	GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA	:;5<<7<;:<<;<<<<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:307:481:625	147	seq2	410	99	36M	=	245	-201	TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA	;4<<4<;;<<;;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+B7_610:5:120:596:847	83	seq2	410	83	35M	=	211	-234	TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAG	;/<<:<;<<<<<<<<<<<<<;;<<<<<;<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_45:3:3:864:1888	83	seq2	411	99	35M	=	579	203	CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA	;<<;;<<;;;<;;<<;<;<<;<<;8<<:<;79799	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:34:1614:558	83	seq2	411	99	35M	=	569	193	CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA	<<<<<<<<<<<7<<<<<8<<<<<<2<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:5:117:570:971	83	seq2	413	99	35M	=	223	-225	ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA	<,<9<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:1
+EAS112_34:8:45:800:733	147	seq2	413	99	35M	=	607	229	ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA	<<<</<<<<<<<<<<<<<<<2<9<<<<<5*5;599	MF:i:18	Aq:i:34	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS219_FC30151:7:87:1289:83	147	seq2	413	99	35M	=	585	207	ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA	<<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<<<:	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_39:4:58:271:612	147	seq2	415	99	35M	=	236	-214	ATGAAGGAAAAAAATTCTAAAATCAGCAAGAGCAA	;:2=<<;<<<<<<:67:<<:<<<<<<<<<<<<,<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:11	H0:i:0	H1:i:2
+EAS1_108:1:33:779:821	147	seq2	416	99	35M	=	579	198	TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS112_34:6:75:615:555	147	seq2	416	99	35M	=	255	-196	TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA	;<<<;<<<<<<<<<:;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS188_7:6:11:994:584	147	seq2	417	97	35M	=	226	-226	GAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAAG	<<<<;<<<<<<<;<:<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS114_26:7:218:858:445	147	seq2	421	99	35M	=	239	-217	GAAAAAAATTCTAAAATCAGCAAGAGAAAAGCATA	;<<<<<<<8;:<<<<<<;<<:<<<<<<<<<<<<;<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS54_81:2:317:72:221	83	seq2	422	99	35M	=	270	-187	AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC	=========:======;==;===============	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:70:766:2016	147	seq2	422	99	35M	=	607	220	AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS56_53:4:45:707:147	83	seq2	424	99	35M	=	216	-243	AAAAATTCTAAAATCAGCAAGAGAAAAGCATACAG	<<<<<<;3<<<<<4;<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:16:1343:1621	147	seq2	426	99	35M	=	248	-213	AAATTCTAAAATCAGCAAGAGAAAAGCATACAGTC	;<<9;7=====;;==<==================<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:184:912:258	83	seq2	428	99	35M	=	582	189	ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:119:38:945	147	seq2	428	99	35M	=	221	-242	ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT	=;;8=====:========<================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:95:235:746	147	seq2	430	99	35M	=	598	203	TCTAAAATCAGCAAGAGAAAAGCATACAGACATCT	<<<<;<<<<<<<<79<<<<<<<<<<<<<<*;;;<9	MF:i:18	Aq:i:72	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+EAS1_99:2:188:782:483	83	seq2	431	99	35M	=	277	-189	CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA	7<<<<<<4<;;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:39:348:594	147	seq2	431	99	35M	=	600	204	CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA	<<;<<<<<<<<<;<;;<<<<<<<<<<;<<<:<:<:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:176:971:874	83	seq2	432	76	9M1D26M	=	273	-195	TAAAATCAGAAGAGAAAAGCATACAGTCATCTATA	<<<<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:3:14:697:541	147	seq2	432	99	35M	=	259	-208	TAAAAGCAGCAAGAGAAAAGCATACAGTCATCTAT	8<<<<&6<;8<<<<<<<<<<<<;<<<<;<<<<<<8	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+B7_610:7:177:469:800	147	seq2	433	99	35M	=	259	-209	AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA	=<<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:131:518:588	147	seq2	433	99	35M	=	607	209	AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<1<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:8:6:237:885	147	seq2	433	99	35M	=	269	-199	AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA	<<<<1:<;:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:134:126:465	147	seq2	434	99	35M	=	245	-224	AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA	<<;:&<3)<<7<:<<<<.:<<<<<8<<<<<<<<<<	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:104:402:732	147	seq2	434	99	35M	=	610	211	AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA	=========================7=;===;=:=	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:65:85:1547	83	seq2	434	99	35M	=	257	-212	AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA	<<<<<<;:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:2:85:686:696	147	seq2	435	99	35M	=	594	193	AATCAGCAAGAGAAAAGCATACAGTCATCTATAAA	==================<=====:==<=<;=:==	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:144:242:602	147	seq2	436	99	36M	=	611	211	ATCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG	========================;=====<;;<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:204:737:61	83	seq2	437	99	35M	=	247	-225	TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG	(7=72=;==2=====<===<<==============	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:124:253:889	147	seq2	437	99	35M	=	598	196	TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG	<<<<<<6<<:<<<<<<<<<<<<<;;<<;<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:310:155:312	147	seq2	438	99	35M	=	606	203	CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA	;<<<;<<<8<<<<<<<<<<<<;<<<<<8<<<<8<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:78:692:671	83	seq2	438	99	35M	=	610	207	CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA	<<<<<<<<<<<<<;<<<<<<<:<<:<<<:8<<0;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:130:260:553	147	seq2	439	99	35M	=	250	-224	AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA	<*;<<7<);<<;9;<5<*<9<;<<;;<7<<<<<1<	MF:i:18	Aq:i:42	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:60:163:1612	147	seq2	439	99	35M	=	617	213	AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA	<<<<<<<<<21<<<<<<<<<3<--<+<<<+<<63<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:106:595:322	83	seq2	440	99	35M	=	274	-201	GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA	;+<<<<<<<<<<<<<<<<<<;<<7<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:211:84:84	147	seq2	440	99	35M	=	268	-207	GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA	6:<<:<<<<<<9<<<<<<<<<<<;<<<;;;<;<3;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:280:662:939	147	seq2	442	99	35M	=	294	-183	AAGAGAAAAGCATACAGTCATCTATAAAGGAAATC	<<;<;<<<<<:<<<;<<<;<<;<<<<<<<<<<<;<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:52:751:360	83	seq2	443	99	35M	=	263	-215	AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC	<-<9<<<<<6<<<8<<;;<<9<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:234:167:381	147	seq2	443	99	35M	=	625	217	AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;;7<;;	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:37:156:134	83	seq2	443	99	35M	=	261	-217	AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC	99998<<<<:<<<<<<<;<<><<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:93:490:901	83	seq2	445	99	35M	=	280	-200	AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA	<<<<<<<;<<<;<<<;<<;<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:96:489:453	83	seq2	445	99	35M	=	625	215	AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;:	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:46:13:880	147	seq2	445	99	35M	=	290	-190	AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA	=&====8==========0=================	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:167:905:852	147	seq2	445	99	36M	=	647	238	AGAAAAGCATACAGTCATCTATAAAGAAAATCCCAT	<<<7<<<<<<<<<<<<<<:<:<<:::&.<:<66:3<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS219_FC30151:3:13:674:1717	147	seq2	445	99	35M	=	623	213	AGAAAAGCATGCAGTCATCTATAAAGGAAATCCCA	<<<<<<<<<<%<<<<<<<<<<<<<<<<<<<;:;;;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS51_62:7:196:511:896	83	seq2	446	99	35M	=	283	-198	GAAAAGCATACAGTCATCTATAAAGGAAATCCCAT	8<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:154:118:488	147	seq2	447	99	35M	=	624	212	AAAAGCATACAGTCATCTATAAAGGAAATCCCATC	<<<<<<<<<<<<<<<<<<<<<<:7<<<<7<:;;::	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:44:153:969	83	seq2	447	95	35M	=	245	-237	AAAAGCATACAGTCATCTATAAAGGAAATCCCATC	<<5<:7<72<51<7<*79<<<<<5<<<<<<<<<2<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:215:246:640	83	seq2	447	99	36M	=	624	213	AAAAGCATACAGTCATCTATAAAGGAAATCCCATCA	<<<<<<<<<<9<;<<<<<<<<<<9;<<<<<<3;<;3	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:94:1655:1921	147	seq2	447	85	35M	=	258	-224	AAAAGCATACAGTCATCTATAAAGGAAATCCCATC	<<<<;:===<==;<==<;================;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:60:1037:1146	147	seq2	447	99	35M	=	250	-232	AAAAGCATACAGTCATCTATAAAGGAAATCCCATC	<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:1:23:536:229	83	seq2	448	99	35M	=	614	201	AAAGCATACAGTCATCTATAAAGGAAATCCCATCA	<<<<<<<<<<<<<<<<<:<8<:<<;<<<<<<7<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:130:865:838	147	seq2	448	99	35M	=	649	236	AAAGCATACAGTCATCTATAAAGGAAATCCCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:<;3	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:239:1001:406	83	seq2	450	99	35M	=	634	219	AGCATACAGTCATCTATAAAGGAAATCCCATCAGA	<<<<<<7<<<<<<<<8<;<<<7<<<<36<<3<:33	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:3:147:423:584	147	seq2	451	99	35M	=	277	-209	GCATACAGTCATCTATAAAGGAAATCCCATCAGAA	27<;<3<<<+<<;<<<;;-4<<<<<;<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:187:715:521	83	seq2	451	99	35M	=	291	-195	GCATACAGTCATCTATAAAGGAAATCCCATCAGAA	<7<:<9<<<<<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:172:196:746	83	seq2	451	99	35M	=	620	204	GCATACAGTCATCTATAAAGGAAATCCCATCAGAA	<<<<<<<<9<<<<9<<<<<<<<<;<<<<6<<<<;<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:267:821:860	83	seq2	451	99	34M	=	296	-189	GCATACAGTCATCTATAAAGGAAATCCCATCAGA	$&<<<.<:;6<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS56_61:7:7:682:201	83	seq2	452	99	35M	=	288	-199	CATACAGTCATCTATAAAGGAAATCCCATCAGAAT	0:8;5<8<1:78<<<<<<<<<<<<:8<<2<<<<:<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:3:82:13:897	147	seq2	453	99	35M	=	606	188	ATACAGTCATCTATAAAGGAAATCCCAGCAGAATA	<<<<;<<<<<<;<;<;5<51;<1<<<<%<<<<,58	MF:i:18	Aq:i:41	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS56_53:6:180:695:621	83	seq2	453	99	35M	=	637	219	ATACAGTCATCTATAAAGGAAATCCCATCAGAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:158:909:321	83	seq2	453	99	35M	=	271	-217	ATACAGTCATCTATAAAGGAAATCCCATCAGAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:237:497:165	83	seq2	454	99	35M	=	619	200	TACAGTCATCTATAAAGGAAATCCCATCAGAATAA	8===<8===========37=<===7=;7=8=====	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:152:355:962	83	seq2	456	99	35M	=	269	-222	CAGTCATCTATAAAGGAAATCCCATCAGAATAACA	&<.9.<;+;<;<<<<<<<<<<::<<:<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS192_3:4:255:549:422	83	seq2	456	99	35M	=	295	-196	AAGTCATCTATAAAGGAAATCCCATCAGAATAACA	&<;;+<;4;<<<<<<<<<<<;<;<<;<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:2
+EAS220_1:4:100:20:1199	147	seq2	456	99	35M	=	614	193	CAGTCATCTATAAAGGAAATCCCATCAGAATAACA	7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:71:408:741	147	seq2	457	99	35M	=	637	215	AGTCATCTATAAAGGAAATCCCATCAGAATAACAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:285:395:450	147	seq2	458	99	35M	=	269	-224	GTCATCTATAAAGGAAATCCCATCAGAATAACAAT	8)3<8+;<)<<<<<<<<97:7<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:4:854:140	83	seq2	458	72	35M	=	638	215	GTCATCTATAAAGGAAATCCCATCAGAATAACAAT	<<<6<<<:<6<<<:36:<<<<3<<8:.6<38::4<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:227:657:95	147	seq2	458	99	35M	=	280	-213	GTCATCTATAAAGGAAATCCCATCAGAATAACAAT	;3;<);<<<<<<<<<<<<18<<<<<<<<<<<<<<<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:57:324:546	83	seq2	458	99	36M	=	281	-213	GTCATCTATAAAGGAAATCCCATCAGAATAACAATG	;;5<;,<<<;;<<<<<<<97<<<<<<<<<<9<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:26:274:1078	83	seq2	458	99	40M	=	282	-216	GTCATCTATAAAGGAAATCCCATCAGAATAACAATGGGCT	9:*:64<<;<<<<<<<<<;8;<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:107:636:642	147	seq2	458	99	35M	=	630	207	GTCATCTATAAAGGAAATCCCATCAGAATAACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:226:869:36	147	seq2	461	99	35M	=	273	-223	ATATATAAAGGAAATCCCATCAGAATAACAATGGG	<0/)</<<<:<<<<<)<<7<<<<<+55<<1<<<:<	MF:i:18	Aq:i:59	NM:i:1	UQ:i:14	H0:i:1	H1:i:0
+EAS192_3:4:312:915:751	83	seq2	461	99	35M	=	621	195	ATCTATAAAGGAAATCCCATCAGAATAACAATGGG	<2<<<<<<<8;<<<<<<<<:<<<<8<<<<<84,4:	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:96:899:106	83	seq2	462	99	35M	=	636	209	TCTATAAAGGAAATCCCATCAGAATAACAATGGGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:62:969:12	147	seq2	464	99	35M	=	303	-196	TATAAAGGAAATCCCATCAGAATAACAATGGGCTT	<<;<;<::<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:67:56:806	83	seq2	464	99	35M	=	637	208	TATAAAGGAAATCCCATCAGAATAACAATGGGCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<:7:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:37:611:267	83	seq2	464	99	35M	=	610	181	TATAAAGGAAATCCCATAAGAATAACAATGGGCTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_93:7:319:280:57	147	seq2	467	99	35M	=	306	-196	AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC	<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:96:720:940	147	seq2	467	99	35M	=	654	222	AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC	<<<<<<;<<<<<<<<<<;9<<8<<6<;:;<;;.;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:2:59:286:290	83	seq2	467	99	35M	=	628	196	AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC	<<<<<<<<;<<<;<<<<<<<<<<<<<;;;<<;7;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:236:841:20	147	seq2	467	99	35M	=	652	220	AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC	<<<<<<<<<<<<<<<<<7<<<<:<<9<<<<;<:<9	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:49:656:507	83	seq2	468	99	35M	=	637	204	AAGGAAATCCCATCAGAATAACAATGGGCTTCTCA	<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:78:1314:1275	147	seq2	469	99	35M	=	277	-227	AGGAAATCCCATCAGAATAACAATGGGCTTCTCAG	<<<<<<<<6:<<<<<<<<<<<<<<<<<<<<<<<1<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:6:181:392:500	147	seq2	470	99	35M	=	299	-206	GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC	/5<<;(88<<<;<;<<6<<<<<7<<<<<<<7<<<<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:133:8:379	147	seq2	470	99	35M	=	653	218	GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC	<<<<<<<<<<<<<<<<<<<<<<<<8;<<8<<<:6<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:198:929:684	147	seq2	471	99	35M	=	624	188	GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA	<7<<<<;<<<<<<<<<<<<;<<<<<:<<<<::<:7	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:181:582:435	83	seq2	471	99	35M	=	629	193	GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;::	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:214:784:690	83	seq2	472	99	35M	=	657	220	AAATCCCATCAGAATAACAATGGGCTTCTCAGCGG	<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<4<44	MF:i:18	Aq:i:30	NM:i:1	UQ:i:19	H0:i:1	H1:i:0
+EAS114_39:3:11:1238:1728	83	seq2	475	99	35M	=	310	-200	TCCCATCAGAATAACAATGGGCTTCTCAGCGGAAA	:677<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS112_34:4:12:273:89	147	seq2	477	99	35M	=	631	189	CCATCAGAATAACAATGGGCTTCTCAGCGGAAACC	==========<====:=========+===4414;;	MF:i:18	Aq:i:71	NM:i:1	UQ:i:28	H0:i:1	H1:i:0
+EAS56_63:2:119:161:322	147	seq2	479	99	35M	=	297	-217	ATCAGAATAACAATGGGCTTCTCAGCAGAAACCTT	<83<;<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_30:2:111:142:21	83	seq2	479	99	35M	=	304	-210	ATCAGAATAACAATGGGCTTCACAGCGGAAACCTT	;88<:<;;<6<;;<<<:<<<<;<<<<<<<<;<<<<	MF:i:18	Aq:i:28	NM:i:2	UQ:i:53	H0:i:0	H1:i:0
+EAS1_99:1:34:649:318	83	seq2	481	65	35M	=	328	-188	AAGAATAACAATGGGCTTCACAGCGGAACCCTTAC	)<7<<3<<<<<<+<1<;<8&<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:65	NM:i:3	UQ:i:59	H0:i:0	H1:i:0
+EAS114_30:6:214:565:337	147	seq2	481	99	35M	=	326	-190	CAGAATAACAATGGGCTTCTCAGCAGAAACCTTAC	;;<;<1<9<<<8<<<<<;<<<<<<8<<<;<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:226:370:91	147	seq2	482	99	35M	=	335	-182	AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA	<':<6<;<<<;2<;<-7;;;<<<<<<<;;;<<7;<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS139_11:6:13:682:680	83	seq2	482	99	35M	=	685	238	AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA	<<<<<<<<<<<<<:<<<<<<<<<<;<;<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_593:2:273:348:37	147	seq2	483	99	36M	=	688	241	GAATAACAATGGGCTTCTCAGCAGAAACCTTACACG	<<<<<<<9<49<<<;<<<<*<<19<15;<</5<;.5	MF:i:18	Aq:i:41	NM:i:1	UQ:i:13	H0:i:1	H1:i:0
+EAS139_11:8:76:205:587	83	seq2	483	99	35M	=	306	-212	GAATAACAATGGGCTTCTCAGCGGAAACCTTACGA	8<<5<<<<<<<<<<<<<<<<<<<<<<<<<7<<</<	MF:i:18	Aq:i:28	NM:i:2	UQ:i:41	H0:i:0	H1:i:0
+B7_591:2:27:280:592	147	seq2	484	99	36M	=	310	-210	AATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC	<<<<<<<<<<<8<<<<<<<<7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_99:7:171:196:287	147	seq2	485	99	35M	=	658	208	ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC	<<<<<<<<<<<<<<<<<<<<<;6<<<<<<2:8<0:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:2:224:579:433	147	seq2	485	99	35M	=	662	212	ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC	<<<<<<<<<<<<<<<<<:<<<<<<<<<<<8<+8;:	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:22:490:2011	147	seq2	485	99	35M	=	307	-213	ATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC	<7<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_65:6:46:173:214	83	seq2	487	99	35M	=	308	-214	AACAATGGGCTTCTCAGCAGAAACCTTACAAGCCA	<<2<<<<<<<<<<<5<<5<7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:4	H1:i:6
+EAS1_103:4:164:79:134	83	seq2	488	99	35M	=	656	203	ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_32:2:283:577:398	147	seq2	488	99	35M	=	308	-215	ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG	;8;;&<<<;<;67<;<;<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:1	UQ:i:27	H0:i:0	H1:i:2
+EAS54_67:5:149:639:910	147	seq2	489	99	35M	=	669	215	CAATGGGCTTCTCAGCAGAAACCTTACAAGCCAGA	<<<<<<<<<<<<<<<<<<<<<<<<7<;;<<;<<;<	MF:i:18	Aq:i:42	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:250:628:423	83	seq2	489	99	36M	=	295	-230	CAATGGGCTTCTCAGCGGAAACCTTACAAGCCAGAA	+<<4;;9;;7.;7<;7<;<<<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_108:1:242:419:512	147	seq2	490	94	35M	=	672	217	AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA	<<8<<<<<<<<<<<<<<<<<<<<<<<<;<8<(<30	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_45:1:95:1530:28	83	seq2	490	74	35M	=	332	-193	AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA	77741(9;;994;5;;4;;1;;;;;1;<;<<<<;<	MF:i:18	Aq:i:9	NM:i:0	UQ:i:0	H0:i:42	H1:i:45
+EAS192_3:6:326:887:180	147	seq2	492	73	35M	=	672	215	TGGGCTTCTCAGCAGAAACCTTACAAGCCAGAAGC	;<<<<<;<<<<<<<<<8<<<<<<<<<<<<0<;;<+	MF:i:18	Aq:i:0	NM:i:1	UQ:i:25	H0:i:3	H1:i:7
+EAS1_99:1:86:871:319	83	seq2	494	71	35M	=	651	192	GGCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGA	<<<<<:<<<:<:<<<<<<<<<<<<8<<:<1;<::)	MF:i:18	Aq:i:0	NM:i:1	UQ:i:25	H0:i:0	H1:i:4
+EAS56_57:1:189:130:136	147	seq2	494	79	35M	=	314	-215	GGCTTCTCAGCAGAAACCTTACAAGCCAGAAGAGA	823;23<7<57<7<<<<<;<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:63	H1:i:85
+EAS51_64:7:140:752:822	83	seq2	495	76	35M	=	667	207	GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT	<<<<<<<<<<<<<<<<<7<<<<<<<<<<<<<;<:;	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:0	H1:i:5
+EAS56_57:5:53:544:889	147	seq2	495	76	35M	=	335	-195	GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT	,<;<<<;<<<<<<<<<:;;<<<<<;;<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:2	H1:i:32
+EAS54_65:4:61:346:384	83	seq2	496	68	35M	=	324	-207	CAACTAAGAAGAAACCTTACAAGCCAGAAGAGATT	7&$+&,<<+;;<;;<<6<<8<<<;<<;<<<<<<<<	MF:i:18	Aq:i:0	NM:i:3	UQ:i:19	H0:i:1	H1:i:53
+EAS54_81:8:177:800:714	83	seq2	497	76	35M	=	324	-208	TTCTCAGCAGAAACCTTACAAGCCAGAAGAGATTG	=;3=+=<:=<========8================	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:29	H1:i:85
+B7_597:6:20:592:496	83	seq2	498	75	35M	=	338	-195	TCTCAGCGGAAACCTTACAAGCCAGAAGAGATTGG	97<7;<;<;<<<<;<9<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:5	H1:i:48
+B7_591:5:243:557:560	83	seq2	499	75	36M	=	331	-204	CTAAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT	69&<;&<&<<;6.<<<+<<<;;<<<<<<<<;<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:1	H1:i:9
+EAS188_7:5:163:982:695	147	seq2	499	77	35M	=	339	-195	CTCAGCAGAAACCTTACAAGCCAGAAGAGATTGGA	<:<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:7	H1:i:42
+EAS139_19:1:1:1598:843	83	seq2	500	99	40M	=	347	-193	TCAGCGGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT	1)::6::<<;<98<<<<<<9<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:1	UQ:i:25	H0:i:1	H1:i:0
+EAS139_19:6:78:1029:512	147	seq2	500	99	40M	=	656	196	TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT	<0:;<<<<<<<<<:<<:;<<<;<7<<;<7;;;:6;::672	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:14:1872:1521	83	seq2	500	62	35M	=	339	-196	TCATCAAAAACCTTACAAGCCAGAAGAGATTGGAT	/1<%73&7<1<3577,<<<7/733<<<<<<<<1<<	MF:i:18	Aq:i:2	NM:i:2	UQ:i:9	H0:i:1	H1:i:8
+EAS221_3:6:51:1486:1131	147	seq2	500	77	35M	=	685	220	TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT	<<<<<<<<<;<<<<<<<<<1<5<<8<<<'<;<<;1	MF:i:18	Aq:i:3	NM:i:0	UQ:i:0	H0:i:22	H1:i:22
+EAS192_3:6:45:183:25	147	seq2	501	95	35M	=	672	206	CAGCGGAAACCTTACAAGCCAGAAGAGATTGGATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<86;<;:;	MF:i:18	Aq:i:23	NM:i:1	UQ:i:27	H0:i:0	H1:i:2
+B7_597:4:38:999:463	147	seq2	503	39	35M	=	317	-221	GCGGAAACCTTACAAGCCAGAAGAGATTGGATCTA	.*:&<<0<0!<<+<<<<<<<<<<<<<0<<<<<<<<	MF:i:18	Aq:i:39	NM:i:2	UQ:i:25	H0:i:0	H1:i:1
+EAS114_45:1:30:1882:1210	147	seq2	503	82	35M	=	665	197	GCAGAAACCTTACAAGCCAGAAGAGATTGGATCTA	;;::;;;;:;;;;;:;;;;;;9;;:7;;8:77777	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_108:6:222:579:961	147	seq2	504	99	35M	=	679	210	CAGAAACCTTACAAGCCAGAAGAGATTGGATCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<7<<:7;;;68	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:92:875:345	147	seq2	504	99	35M	=	690	221	CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_63:8:62:125:888	83	seq2	504	99	35M	=	347	-192	CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA	,;3<<<8;;3<,<<<8;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+EAS221_1:2:23:127:880	83	seq2	504	99	35M	=	686	217	CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA	<<<<<<<<<<<<<<<<<<<;;<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS51_66:8:43:972:506	147	seq2	505	99	35M	=	686	216	AGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT	<;<<<<<<<<<<<<6;<;<<<<<<<<<<:;;<;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:183:697:555	83	seq2	505	84	35M	=	341	-199	AGAAATCTTAGAAGCCAGAAGAGATTGGATCTAAT	<<<;&,.;);&96<84<<81<<&<<<9<<8<8<<1	MF:i:18	Aq:i:37	NM:i:2	UQ:i:16	H0:i:0	H1:i:1
+EAS221_3:8:65:463:703	83	seq2	506	99	35M	=	693	222	GAAACCTTACAAGCCAGAAGAGATTGGATCTAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:7:101:752:996	147	seq2	508	99	35M	=	687	214	AACCTTACAAGCCAGAAGAGATTGGATCTAATTTT	<<<<<<<<<<<<<<<;<<<<<9<<<<<<;<<;;;;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:267:953:459	83	seq2	509	99	35M	=	667	193	ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT	<<<<<<<<<9<<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:33:1240:846	83	seq2	509	99	35M	=	685	211	ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT	<<<<<<<<<<<<7<<2<;<<;<<<;<<<:6:<<<:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:135:401:735	83	seq2	510	99	35M	=	703	228	CCTTACAAGCCAGAAGAGATTGGATCTAATTTTTG	<<<<<<<<<<<<<<<<<<<<<;<<<<<8<<<<<<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:3:186:68	83	seq2	512	99	35M	=	687	210	TTACAAGCCAGAAGAGATTGGATCTAATTTTTGTA	<<<<<<<<<<<<;<<<<<<<<<<<<;;<<<<<&%8	MF:i:18	Aq:i:71	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_78:7:164:727:977	147	seq2	513	99	35M	=	689	211	TACAAGCCAGAAGAGATTGGATCTAATTTTTCGAC	<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;;79;	MF:i:18	Aq:i:75	NM:i:1	UQ:i:26	H0:i:1	H1:i:0
+B7_589:1:110:543:934	147	seq2	514	99	35M	=	700	221	ACAAGCCAGAAGAGATTGGATCTAATTTTTGGACT	<<<<<<<<<<<<;<<<<<;;<<<;;<<<<<,,;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:329:339:408	147	seq2	515	99	36M	=	325	-226	CAATCCAGAAGAGATTGGATCTAATTTTTGGACTTC	7<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:1	UQ:i:27	H0:i:1	H1:i:0
+EAS56_59:5:325:544:349	147	seq2	515	99	35M	=	716	236	CAAGCCAGAAGAGATTGGATCTAATTTTTGGACTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6;;;<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:3:903:957	83	seq2	516	99	35M	=	661	180	AAGCCAGAAGAGATTGGATCTAATTTTTGGACTTC	<<<<<<<<<<<<<<<<;;<;<;<<<<<<66<;<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:85:361:418	147	seq2	517	99	36M	=	353	-200	AGCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT	;;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:138:186:459	83	seq2	518	97	35M	=	360	-193	GCCAGAAGAGATTGGAGCTAATTTTTGGACTTCTT	+/2/;<:<&7:7</<2&<<<&<<<<<<<<<8<<:3	MF:i:18	Aq:i:37	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS139_11:4:36:1184:994	83	seq2	518	99	35M	=	358	-195	GCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT	<84<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:270:430:269	83	seq2	519	99	36M	=	331	-224	CCAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA	28<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:295:882:282	147	seq2	520	99	35M	=	691	206	CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA	========================<6<======8;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:3:41:739:907	83	seq2	520	99	35M	=	344	-211	CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA	;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:272:240:950	147	seq2	520	97	35M	=	696	211	CAGCAGAGCTTGGATCTAATTTTTGGACTTCTTCA	6<<&:<<<&<::;&7<<<3<;<<;<:;:<8:<<(<	MF:i:18	Aq:i:25	NM:i:3	UQ:i:17	H0:i:0	H1:i:0
+EAS54_65:7:155:629:357	83	seq2	521	99	35M	=	333	-223	AGAAGAGATTGGATCTAATTTTTGGACTTCTTAAA	<<<<<<<<;<<<<<<<<<<<<6<<<<<<<<<;<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:14:88:306	147	seq2	521	99	35M	=	341	-215	AGAAGAGATTAGATCTAATTTTTGGACTTCTTAAA	<1;<;<;<4<&<<<:<<<:<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS1_108:5:115:193:231	147	seq2	522	99	35M	=	684	197	GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG	<<<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6<7	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:88:1454:418	83	seq2	522	99	35M	=	349	-208	GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG	<<<<<<<<<<6<96<<<1911<<<1<<<<<<<<<1	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:36:649:554	83	seq2	523	99	35M	=	350	-208	AAGAGATTGGATCTAATTTTTGGACTTCTTAAAGA	<<<<<888;<<<;<<<;<;<8<<<<8<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:119:651:88	83	seq2	527	99	35M	=	337	-225	GATTGGATCTAATTTTTGGACTTCTTAAAGAAAAA	<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:57:826:977	147	seq2	528	99	35M	=	693	200	ATTGGATCTAATTTTTGGACTTCTTAAAGAAAAAA	<<<<<<<<<<<<<<<<+<<<<<<<<6<9:6<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:285:417:147	83	seq2	529	99	35M	=	712	218	TTGGATCTAATTTTTGGACTTCTTAAAGAAAAAAA	<<<<<<<<<<<<<<<;8<<<<<<<<<;6<:<;<<;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:160:130:351	83	seq2	530	99	35M	=	697	202	TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA	<<<<<<<<<<<<<<<;<<<<4<<<<<;<<<:<<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:287:665:495	147	seq2	530	99	35M	=	702	207	TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA	==========================98====8=8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:71:187:824	147	seq2	534	99	35M	=	367	-202	TCTAATTTTTGGACTTCTTAAAGAAAAAAAAACCT	0040;<7<<<<0<7<<<;<7*<<<<<7<<771<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:70:445:1289	83	seq2	535	99	35M	=	702	202	CTAATTTTTGGACTTCTTAAAGAAAAAAAAACCTG	<<<<<<<<<<2<<<<<<<<<<:<<<<<<<;;;;<:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:7:41:745:603	83	seq2	536	99	35M	=	360	-211	TAATTTTTGGACTTCTTAAAGAAAAAAAAACCTGT	;<<;;<;<8<<<<<<<<<<<;<<;<<<<<<<<<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:197:759:975	147	seq2	537	99	35M	=	698	196	AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<;	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:140:253:322	83	seq2	537	99	35M	=	689	187	AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC	<<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:58:684:520	147	seq2	538	99	35M	=	367	-206	ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA	<85;;:<<<7<<7<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:19:306:982	147	seq2	538	99	35M	=	368	-205	ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA	<<<<<<<<<9<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:273:562:954	83	seq2	539	99	35M	=	722	218	TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:78:775:555	83	seq2	539	99	35M	=	691	187	TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA	6:<<<<:<<<<6:<<)::8<6<<:<<)<::63832	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:49:330:699	147	seq2	540	99	35M	=	722	217	TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAA	==;=================;======5;;;==5=	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:329:437:643	147	seq2	540	99	36M	=	354	-222	TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC	885<8;;<;3,8<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:125:884:276	83	seq2	541	99	35M	=	362	-214	TTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC	,;;3,<7<;7<<===;============;======	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:4:315:201:673	83	seq2	542	45	36M	=	381	-197	TTGGACTTATTAAAGAAAAAAAAACCTGTCAAACAC	;;;;<-;;&;;<<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_597:3:10:394:392	147	seq2	542	99	35M	=	376	-201	TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA	28-:;0-<0<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:1:228:736:747	83	seq2	542	68	35M	=	381	-196	TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA	<07<<&<;+<<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:267:394:437	147	seq2	544	99	35M	=	735	226	GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACG	<<<<<<<<<<;<;<<<<<;;<<<<<;<<:;8<;<8	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:66:1381:181	83	seq2	544	99	40M	=	362	-222	GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT	;;;+;;&<7<<<+<<<<<<<;<;8<<<;<<<<8<<<;<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:74:668:424	83	seq2	545	99	40M	=	707	202	GACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:322:350:374	83	seq2	546	99	35M	=	360	-221	ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA	<+;8&84<<<:<<<<<<<<<<;<<<<<<<;<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:307:208:477	147	seq2	546	99	35M	=	710	199	ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA	<<<<<<<;<<;<<<<<<<<<<<<<<<<;:<<<88;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:228:915:631	83	seq2	547	66	35M	=	381	-201	ATTATTAAAGAAAAAAAAACCTGTCAAACACGAAT	&-))-*===/=========9====4==========	MF:i:18	Aq:i:0	NM:i:2	UQ:i:13	H0:i:1	H1:i:0
+EAS1_93:5:246:177:525	83	seq2	549	98	35M	=	738	224	TCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT	<<<<<<<<<<<<<<<<<<<<<1<<<<<<;;;<8;;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:93:634:323	83	seq2	550	99	35M	=	721	206	CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT	<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<,<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:8:165:441:708	147	seq2	550	99	35M	=	737	222	CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT	=<===============================99	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:5:191:885:623	83	seq2	551	99	35M	=	363	-223	TTAAAGAAAAAAAAACCTGTCAAACACGAATGTTA	66<<<<<<<<<<<<<2<<<<9<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:127:828:697	147	seq2	552	99	35M	=	346	-241	TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT	;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:115:249:673	147	seq2	552	99	35M	=	743	226	TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<6<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:263:689:572	147	seq2	553	68	35M	=	381	-207	AAAGAAAAAAAAACCTGTCAAACACGAATGTTATG	<9<2<<<<<<<<<22;;02<<<9<<;9<9<<;<<3	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:99:1632:76	83	seq2	553	99	40M	=	705	192	AAAGAAAAAAAACCCTGTCAAACACGAATGTTATGCCCTG	<<<<<<<<<<<<*<<<<8<9<<<<<<<<<9;;;;<18:;:	MF:i:18	Aq:i:47	NM:i:1	UQ:i:9	H0:i:0	H1:i:1
+EAS54_71:7:250:698:842	147	seq2	554	99	35M	=	753	233	AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<24	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:41:314:1173	83	seq2	554	99	35M	=	718	199	AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC	<;<<<<<<<;;<<<<<-<<<;;;<;8<*;;<<<<'	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:189:831:878	83	seq2	555	99	35M	=	351	-239	AGAAAAAAAAACCTGTCAAACACGAATGTTATGCC	<9<<<<<<<<<<;9<:<<<<<6<<<<<<<;<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:216:47:302	83	seq2	557	99	35M	=	729	207	AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT	<<<<<<<<<<<7<<<<<<<<<<<<+<<<<<//6;<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:28:538:148	83	seq2	557	99	35M	=	376	-216	AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT	<<<<<<<<<<7;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:284:597:682	147	seq2	557	99	35M	=	375	-217	AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT	<<<<<<<<9;;7<;:<<<:<;<<<<<<<<;<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:11:1261:1200	83	seq2	558	99	35M	=	362	-231	AAAAAAAACCTGTCAAACACGAATGTTATGCCCTG	<<<<<<<:<<6<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:246:711:981	147	seq2	559	99	35M	=	371	-223	AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC	;;:;7<<:5:<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:1:208:971:600	83	seq2	559	99	35M	=	382	-212	AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC	<<<<<<<3*+<4/<<<<7<<<<0<<:<8<<<<0<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:219:174:684	83	seq2	560	71	35M	=	390	-205	AAAAAAACTGTCAAACACGAATGTTATGCCCTGCT	<<<<:;+9<<<;<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS51_66:7:4:234:610	147	seq2	560	84	35M	=	729	204	AAAAAACCTGTCAAACACGAATGTTATGCCCTCCT	<<<<<<<<7;<<<;7<7;7;7<;-<-<&<<<0%06	MF:i:18	Aq:i:22	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS54_73:5:271:874:367	83	seq2	560	99	35M	=	384	-211	AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT	<<<<<<5;<<<:<<<;<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:2:168:1878	83	seq2	560	37	35M	=	743	218	AAAAAACCTGGCAAACACGAATGTTATGACATGTN	;<:;;<:<;<;<;;;;:;<;:::&9:&:68&6&*!	MF:i:18	Aq:i:37	NM:i:5	UQ:i:61	H0:i:0	H1:i:1
+EAS221_1:6:89:1164:573	147	seq2	560	99	35M	=	371	-224	AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT	3<<<6<%7<<08<<4<3<<103<1<<<<<<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:53:783:78	147	seq2	561	99	35M	=	363	-233	AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA	<;;;;<<0<,<<<<<<<<<;<<<;<;<<<<;<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:30:570:902	147	seq2	561	99	35M	=	730	204	AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA	<<<<<<<<<<<;4<<:<<44<<<<<<<<<<<4<<+	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:7:1864:1569	147	seq2	561	99	35M	=	382	-214	AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:89:942:84	147	seq2	562	74	35M	=	759	232	AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:122:589:134	83	seq2	562	99	35M	=	369	-228	AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA	;<;4<<538<<;<<;<<<<';,:<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:77:1529:522	83	seq2	562	99	35M	=	722	195	AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA	<<;<<<<<<<<<<<4<<4<;;:;2:7<<<2*<;;8	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:48:805:860	83	seq2	563	78	35M	=	755	227	AAACCTGTCAAACACGAATGTTATGCCCTGCTAAA	<<<<<<<;<<<<<<<41;<<8<<<<<<<8+<4,+;	MF:i:18	Aq:i:13	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:144:492:61	83	seq2	564	99	35M	=	728	199	AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC	<<<;<<<<<<<<<<<;<<<<<<7:<<<<::;9;;6	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:3:303:970:243	83	seq2	564	99	35M	=	370	-229	AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC	<<0+<<<,<4<:<:<<<<<<<<<<<::<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:78:806:800	147	seq2	564	99	40M	=	717	193	AACCTGTCAAACACGAATGTTATGCCCTGCTAAACTAAGC	<<<<<<<<<<<<<<<<<<<4<<:<1<0<;<9;<:78::::	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:94:1440:2016	147	seq2	564	99	35M	=	751	222	AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC	<<<<<<<<<<<<<<<<<<<;<<;;;<<:<8:::75	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:103:443:166	147	seq2	565	99	35M	=	747	217	ACCTGTCAAACACGAATGTTATGCCCTGCTAAACT	<<<<<<<<<<<<<<<<<<<<;<<<<<<<1<-;;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:24:284:360	83	seq2	567	76	35M	=	390	-212	CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA	:;<;:<<<;<<<<<<<<<<<<<<<<<;;<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:3:166:626:836	147	seq2	567	99	35M	=	757	225	CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA	<<<<<<<<<<<<<<<<<<<<9<<<<<<<<;<;;;9	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:110:840:431	83	seq2	567	93	35M	=	388	-214	CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA	77<;7<<<<<<<<<4<<<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:116:738:142	83	seq2	568	99	35M	=	722	189	TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG	<<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<:;2	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:55:932:613	83	seq2	568	77	35M	=	389	-214	TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:137:139:248	83	seq2	569	97	35M	=	401	-203	GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC	;;;99<<<;<;;<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:34:1614:558	147	seq2	569	99	35M	=	411	-193	GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC	<<9<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:15:696:693	83	seq2	570	10	35M	=	403	-202	TCAAACACGAATGTTAATCCCTGCTAAACTAATCA	)6<:7<.7<6.<0&&<&3:&7<<7<0<<<<<<<<<	MF:i:18	Aq:i:10	NM:i:3	UQ:i:50	H0:i:0	H1:i:0
+EAS114_28:3:32:492:907	147	seq2	571	95	36M	=	387	-220	CAAACACGAATGTTATGCCCTGCTAAACTAAGCATC	8<;<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:1:114:19:769	83	seq2	572	90	35M	=	405	-202	AAACACGAATGTTATGCCCTGCTAAACTAAGCATC	5+;+3/6;<+;/8<8*/<7/59<97147<;;9<7<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:182:104:921	147	seq2	575	99	35M	=	378	-232	CACGAATGTTATGCCCTGCTAAACTAAGCATCATA	;<;<<<<<<:<<<<<:<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:5:996:2000	83	seq2	575	99	35M	=	408	-202	CACGAATGTTATGCCCTGCTAAACTAAGCATCATA	<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:109:199:592	83	seq2	576	72	35M	=	390	-221	ACGAATATTATGCCCTGCTAAACTAAGCATCATAA	;9<9<:&:<<<<;;<;;<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS219_1:3:90:219:528	147	seq2	576	75	35M	=	758	217	ACGAATGTTATGCCCTGCTAAACTAAGCATCATAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<9	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:94:294:387	147	seq2	578	99	35M	=	736	193	GAATGTTATGCCCTGCTAAACTAAGCATCATAAAT	<<<<<<<;<<<<<<<<<:<<<<<<<<<<<<;)7;;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:33:779:821	83	seq2	579	99	35M	=	416	-198	AATGTTATGCCCTGCTAAACTAAGCATCATAAATG	<<730<<<<9<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:5:43:114:617	147	seq2	579	99	35M	=	738	194	AATGTTATGCCCTGCTAAACTAAGCATCATAAATG	=============;=========;===========	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:23:944:377	83	seq2	579	75	36M	=	757	214	AATGTTATGCCCTGCTAAACTAAGCATCATAAATGA	<<<<<<<<9<<<<;<<<<<<<<<;<7<<<<;8;<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:3:864:1888	147	seq2	579	99	35M	=	411	-203	AATGTTATGCCCTGCTAAACTAAGCATCATAAATG	888588;;;;;;;;;;;;;;;;;;;;8;;;;;;;;	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:26:137:1382	147	seq2	579	99	35M	=	397	-217	AATGTTATGCCCTGCTAAACTAAGCATCATAAATG	<<-<8<<<<<<:<<<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:265:251:147	147	seq2	581	99	35M	=	754	208	TGTTATGCCCTGCTAAACTAAGCATCATAAATGAA	<<<<<<<<<<<<<<88<<<80:;<<<<<;:4;;:4	MF:i:18	Aq:i:50	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:5:184:912:258	147	seq2	582	99	35M	=	428	-189	GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG	<;;<<<<;:<<7<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:115:646:430	83	seq2	582	45	35M	=	768	217	GTTATGCCCTGCTAAACTTAGCATCATAAATGAAG	<7<<<<<<<<<<<<;<<<<<;<7<<<<;5;<;67<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_108:3:24:319:429	147	seq2	582	99	35M	=	740	193	GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG	<<<<<<<<<<<<<<<<;<<<<<<<<1<<-6<<</<	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:8:49:182:192	83	seq2	582	99	35M	=	750	203	GTTATGCCCTGCTAAACTGAGCATCATAAATGAAG	=====================;============<	MF:i:18	Aq:i:49	NM:i:1	UQ:i:28	H0:i:0	H1:i:1
+EAS114_45:1:100:979:1863	83	seq2	583	85	35M	=	757	209	TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG	;<;;;;;;;7;;;79;;77;9;;99;974;677-6	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:53:458:581	73	seq2	583	77	35M	=	583	0	TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:53:458:581	133	seq2	583	0	*	=	583	0	CTCAATTAATTGTTTTATAAAACCTGTGAGTTTTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<99<<<<<	MF:i:-64
+B7_589:6:108:958:42	147	seq2	584	81	35M	=	755	206	TATGCCCTGCTAAACTAAGCATCATAAATGAAGGG	<<<<<<<<<<<<<<<<<<<<1<<<<<<9<<;<5<:	MF:i:18	Aq:i:9	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:89:457:591	83	seq2	585	69	35M	=	770	216	ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG	<<<<<<<<<<<4<<<<<<<<<<<<8<7/4<<<<4+	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:87:1289:83	83	seq2	585	99	35M	=	413	-207	ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG	<<<::<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:1:84:1505:1037	147	seq2	586	99	35M	=	409	-212	TGCCCTGCTAAACTAAGCATCATAAATGAAGGGGA	<<966<<7<<<<7<<<<9<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:197:261:624	147	seq2	587	99	35M	=	398	-224	GCCCTGCTAAACTAAGCATCATAAATGAAGGGGAA	866;2:/;<<<;:<<<;<;;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:118:41:489	147	seq2	588	76	35M	=	779	226	CCCTGCTAAACTAAGCATCATAAATGAAGGGGAAA	<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<95:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:157:361:309	83	seq2	589	99	35M	=	747	193	CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<;<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_39:6:71:644:1792	147	seq2	589	84	35M	=	754	200	CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT	<<<<<<<;<<<<<<<<<<;<<<<<<<<<;<;:<:<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_589:2:9:49:661	147	seq2	591	99	35M	=	747	191	TGCTAAACTAAGCATCATAAATGAAGCGGAAATAA	<<<<<<<<<<<<<<<<;<<<<<<;:<<;;;7<9;9	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_71:2:85:686:696	83	seq2	594	99	34M	=	435	-193	TAAACTAAGCATCATAAATGAAGTGGAAATAAAG	:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS188_7:1:177:522:118	69	seq2	594	0	*	=	594	0	TCTCAATTAATTGTTTTATAAAACCTGTGAGTTTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<57<<<<	MF:i:-64
+EAS188_7:1:177:522:118	137	seq2	594	49	35M	=	594	0	TAAACTAAGCATCATAAATGAAGGGGAAATAAAGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:103:870:105	83	seq2	595	44	35M	=	778	214	AAACTAAGCATCATAAATGAAGGGGAAATAAAGTC	<<<<<<<<<<<<<<<<<<<<<<<<8<<<<<;<<7;	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS51_62:8:52:967:804	73	seq2	596	76	35M	=	596	0	AACTAAGCATCATAAATGAAGGGGAAATAAAGTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:8:52:967:804	133	seq2	596	0	*	=	596	0	TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT	===============<=======<<===<======	MF:i:-64
+EAS1_108:6:95:235:746	83	seq2	598	99	35M	=	430	-203	CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG	==&=;===7=3===8======;=;8===8=====;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:124:253:889	83	seq2	598	99	35M	=	437	-196	CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG	8<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:6:174:650:125	83	seq2	600	76	35M	=	770	201	AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:39:348:594	83	seq2	600	99	35M	=	431	-204	AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC	<<;;<;:<;<<<;<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:92:693:228	83	seq2	601	75	35M	=	770	200	AGCATCATAAATGAAGGGGAAATAAAGTCAAGTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;9<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:285:349:797	147	seq2	604	76	35M	=	773	200	ATCATAAATGAAGGGGAAATAAAGTCAAGTCTTTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:3:82:13:897	83	seq2	606	99	35M	=	453	-188	CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT	,<2<;<<;<<<<;;;<<;<<<<<<<;;;;<<<<<<	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:310:155:312	83	seq2	606	99	35M	=	438	-203	CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT	2;<<;<<;<<;;/<<<<<<;<<<<8<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:45:178:1321	147	seq2	606	77	35M	=	771	196	CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:193:420:78	83	seq2	607	99	35M	=	787	215	ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:131:518:588	83	seq2	607	99	35M	=	433	-209	ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG	<.<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:45:800:733	83	seq2	607	99	35M	=	413	-229	ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG	<7<<7&<<9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:34	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:70:766:2016	83	seq2	607	99	35M	=	422	-220	ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:2:1217:398	147	seq2	608	99	40M	=	780	212	TAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC	<<<<<<<<<<<<<;<<<<<<<7<<<3<<<<;<<<<9:7::	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:73:1458:1337	147	seq2	609	99	35M	=	806	232	AAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGAC	<<<<<;;;<<<<<<<<<<<<<<<<<<<;<<7;;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:104:402:732	83	seq2	610	99	35M	=	434	-211	AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:37:611:267	147	seq2	610	99	35M	=	464	-181	AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA	<<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:78:692:671	147	seq2	610	99	35M	=	438	-207	AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA	<<);<<;;<<<<<;<<<<<<<<<<<<<6<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:144:242:602	83	seq2	611	99	36M	=	436	-211	ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:6:1243:981	69	seq2	611	0	*	=	611	0	TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT	<<<<8<<8<<<<2<<<<<<<<8<55<<8*<<8<<<	MF:i:-64
+EAS219_FC30151:5:6:1243:981	137	seq2	611	68	35M	=	611	0	ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAA	<;<;;<<<;3;;3<<<;<<;<7%<<<.1<<<..<3	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:291:404:199	147	seq2	612	76	36M	=	777	197	TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:266:994:429	83	seq2	612	76	35M	=	769	188	TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG	=====================9=======4===:=	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:7:159:253:353	147	seq2	613	67	35M	=	778	196	GAAGGGGAAATAAAGTCAAGTCTTTCCTGACAGGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<0,%4(+,	MF:i:18	Aq:i:67	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS1_108:5:175:149:296	147	seq2	614	99	35M	=	811	232	AAGGGGAAATAAAGTCAAGCCTTTCCTGACAAGCA	<<<<<<<<<<<<<<<<<<<49<<<<<<<<<<<<;4	MF:i:18	Aq:i:45	NM:i:1	UQ:i:19	H0:i:0	H1:i:1
+EAS56_65:1:23:536:229	147	seq2	614	99	35M	=	448	-201	AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA	<<99<<<<<;<<<;2<<<<<<;<<<9<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:100:20:1199	83	seq2	614	99	35M	=	456	-193	AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA	:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:181:713:140	83	seq2	615	84	35M	=	793	213	AGGGGAAATAAAGTCAAGTATTTCCTGACAAGCAA	<7<<<<<<<<<<<<7<7<6+<<<5;<;<2<;;+;;	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS139_19:6:82:1051:921	147	seq2	616	99	40M	=	800	224	GGGGAAATAAAGTCAAGGCTTTCCTGACAAGCAAATGCTA	<<<<<9<799<<<<7::/<<<9<7:9:;2:7552+9''66	MF:i:18	Aq:i:41	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS192_3:3:309:187:267	147	seq2	616	99	35M	=	786	205	GGGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAA	<<<<<<<<<<<<<<<<<<<<<<<;<;<;<;68;;8	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:115:649:259	83	seq2	617	99	36M	=	782	201	GGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;<<9	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:261:267:597	147	seq2	617	86	35M	=	787	205	GGGTAATAAAGTCAAGTCTTTCCTGACAAGCAAAT	<<<<<<<<<;<<<<<7<<<<<<<<<:7<7<;44:;	MF:i:18	Aq:i:41	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_26:4:123:1001:580	147	seq2	617	43	35M	=	771	185	GGGAANTAAAGTCAAGTCTTTCCTGACAAGCAAAT	=====!=====================1.8131*=	MF:i:18	Aq:i:43	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+EAS139_11:7:60:163:1612	83	seq2	617	99	35M	=	439	-213	GGGAACTAAAGTCAAGTCTTTCCTGACAAGCAAAT	-<<<<)<<<<<<<<<<<<<<<<<<<<<8<<<<<<<	MF:i:18	Aq:i:59	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS54_65:4:325:795:213	147	seq2	618	99	35M	=	790	207	GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG	<<<<<<<;<<<<;;<<<<<<<<<<<<;:<</;/;;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:165:665:220	147	seq2	618	76	35M	=	779	196	GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG	<<<<<<<<<<<<<<<<<<<<<;<;;<<<;;<;<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:22:206:150	147	seq2	619	99	35M	=	792	208	GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC	==========================::=5&;<2<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:237:497:165	147	seq2	619	99	35M	=	454	-200	GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC	9=:=======2=27======<>&<=,==4>4=>>=	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:82:1540:77	147	seq2	619	99	35M	=	786	202	GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<:8	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:172:196:746	147	seq2	620	99	35M	=	451	-204	AAATAAAGTCAAGTCTTTCCTGACAAGCAAATGCT	<<<;><<+<<<<:<<<<2<;<<<;<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:97:892:419	147	seq2	621	99	35M	=	800	214	AATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:312:915:751	147	seq2	621	99	35M	=	461	-195	AATAAAGTCAAGTCTTTCCTGACAAGCAAAAGCTA	<:-<<<99:::);:7<4;8<<<<<<<;<2<+8<;<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS1_93:4:325:352:67	147	seq2	622	99	35M	=	794	207	ATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAA	==================<========<=<;-===	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:83:731:540	83	seq2	623	99	35M	=	804	216	TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG	<<<<<<<<<;<<<<<<<<<<<<<:<7<*;&;<;;9	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:74:329:459	147	seq2	623	99	35M	=	795	207	TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG	<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9;599	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:13:674:1717	83	seq2	623	99	35M	=	445	-213	TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:141:415:738	69	seq2	624	0	*	=	624	0	TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT	<<<<<<<<<<<<<<<<<<<<<<<;<<<<<;<8<<<	MF:i:-64
+EAS1_105:1:141:415:738	137	seq2	624	76	35M	=	624	0	AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA	<<<<<<<<<<<<<<<<<<<<<<:<<;<<;<<<<6:	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:154:118:488	83	seq2	624	99	35M	=	447	-212	AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA	<<<;58<<95:<<;<;<<<;<<<;;<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:198:929:684	83	seq2	624	99	35M	=	471	-188	AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA	<<;<<<<<:<<<<<<<<<<<<<<<<<;<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:215:246:640	147	seq2	624	99	36M	=	447	-213	AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT	;<<,<<<96<<:<:<9<6<97<<<<<9<<<<9<<9<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:234:167:381	83	seq2	625	99	35M	=	443	-217	AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT	<<;<;<<<<;<<<<7<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:96:489:453	147	seq2	625	99	35M	=	445	-215	AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT	;<;;;<<<<5:<<:<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:3:79:879:15	83	seq2	626	99	35M	=	790	199	AGTCAAGTCTTTCCTGACAAGCAAATGCTAAGATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<;<<1<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:2:59:286:290	147	seq2	628	99	35M	=	467	-196	TCAAGTCTTTCCTGACAAGCAAATGCTAAGATAAT	77<<<<7<<<97<<,7<<<;<<<;<9<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:5:263:511:936	83	seq2	629	99	35M	=	801	207	CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT	<<<<<<<<<<<<<<<<<;<<<<<;<<:<:<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:181:582:435	147	seq2	629	99	35M	=	471	-193	CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT	<<<<<<<<;<<<<<;<<4<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:107:636:642	83	seq2	630	99	35M	=	458	-207	AAGTCTTTCCTGACAAGCAAATGCTAAGATAATTC	<<<<<<<;<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:12:273:89	83	seq2	631	99	35M	=	477	-189	AGTCTTTCCTGACAAGCAAATGCTAAGATAATTCA	<:737<288<<<7<<<<<<<<<:9<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:239:1001:406	147	seq2	634	99	35M	=	450	-219	CTTTCCTGACAAGCAAATGCTAAGATAATTCATCA	0':.71;;:9==9=;====;=;=============	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:7:96:899:106	147	seq2	636	99	35M	=	462	-209	TTCCTGACAAGCAAATGCTAAGATAATTCATCATC	;;;;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:6:67:56:806	147	seq2	637	99	35M	=	464	-208	TCCTGACAAGCAAATGCTAAGATAATTCATCATCA	844:8;7<88;8<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:71:408:741	83	seq2	637	99	35M	=	457	-215	TCCTGACAAGCAAATGCTAAGATAATTCATCATCA	;7;<;<0<<<<<<<<:;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:6:180:695:621	147	seq2	637	99	35M	=	453	-219	TACTGAAAAGCAAATGCTAAGATAATTCATCATCA	;&377<&<<;7<<<<<7<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:2	UQ:i:10	H0:i:1	H1:i:0
+EAS114_30:6:49:656:507	147	seq2	637	99	35M	=	468	-204	TCCTGACAAGCAAATGCTAAGATAATTCATCATCA	%44;;<:<<;<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:3:4:854:140	147	seq2	638	72	35M	=	458	-215	CCTGACAAGCAAATGCTAAGATAATTCATCATCAC	:9':<;<<<;<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:85:1521:58	83	seq2	639	99	40M	=	813	214	CTGACAAGCAAATGCTAAGATAATTCATCATCACTAAACC	<<<<<<<<9<<<<<<<<<<<<<7<<<<<<<<<<<<;;:7:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:57:1064:925	137	seq2	640	76	35M	*	0	0	TGACAAGCAAATGCTAAGATAATTCATCATCACTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<	MF:i:32	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:323:196:855	147	seq2	642	99	35M	=	809	202	ACAAGCAAATGCTAAGATAATTCATCATCACTAAA	<<<<<<<7<<<<<<:<<<<<<<<<<<<<<<<<;7:	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:117:33:262	147	seq2	642	99	35M	=	814	207	ACAAGCAAATGCTAAGATAATTCATCATCACTAAA	<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:59:742:549	83	seq2	642	99	35M	=	816	209	ACAAGCAAATGCTAAGATAATTCATCATCACTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:55:562:403	147	seq2	643	99	36M	=	825	218	CAAGCAAATGCTAAGATAATTCATCATCACTAAACC	<<<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<;<;:	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:97:743:602	147	seq2	644	99	35M	=	821	211	AAGCAAATGCTAAGATAATTCATCATCACTAAACC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<:	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:167:905:852	83	seq2	647	99	36M	=	445	-238	CAAATGCTAAGATAATTCATCATCACTAAACCAGTC	+<<<9;7;<<+<<<<<39<;9<;9<<7<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:130:865:838	83	seq2	649	99	35M	=	448	-236	AATGCTAAGATAATTCATCATCACTAAACCAGTCC	;<:84<<<4<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:60:1420:660	147	seq2	649	99	35M	=	808	194	AATGCTAAGATAATTCATCATCACTAAACCAGTCC	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:180:89:582	83	seq2	650	99	36M	=	809	195	ATGCTAAGATAATTCATCATCACTAAACCAGTCCTA	<<<<<<<<<7<<<<<<<<<7<<<:<<<:<<::77:<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:86:871:319	147	seq2	651	71	35M	=	494	-192	TGCTAAGATAATTCATCATCACTAAACCAGTCCTA	7;+1;<:<<<<<<<<;<<;<<9<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:236:841:20	83	seq2	652	99	35M	=	467	-220	GCTAAGATAATTCATCATCACTAAACCAGTCCTAT	7;<<<;<<<<;;<<<<<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:133:8:379	83	seq2	653	99	35M	=	470	-218	ATAAGATAATTCATCATCACTAAACCAGTCCTATA	&=========='==7==0=2====28===00====	MF:i:18	Aq:i:70	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_105:8:96:720:940	83	seq2	654	99	35M	=	467	-222	TAAGATAATTCATCATCACTAAACCAGTCCTATAA	*<<<<;<<<9<<;,<;0<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:71:994:576	83	seq2	655	99	35M	=	805	185	AAGATAATTCATCATCACTAAACCAGTCCTATAAG	<<<<<<<<<<<<<<<<<<<<<<<;<<5<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:164:79:134	147	seq2	656	99	35M	=	488	-203	AGATAATTCATCATCACTAAACCAGTCCTATAAGA	<;<;<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:78:1029:512	83	seq2	656	99	40M	=	500	-196	AGATAATTCATCATCACTAAACCAGTCCTATAAGAAATGC	;;;;;<;;<<<.<<6;<<;<;8<<<<::<<<<<<<<;<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:1:214:784:690	147	seq2	657	99	35M	=	472	-220	GATAATTCATCATCACTAAACCAGTCCTATAAGAA	-<7<<7<:<<2<<<<;<<<<<;<<<<3<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS220_1:4:6:1178:1105	83	seq2	657	93	35M	=	830	208	GATAATTCATCATCACTAAACCAGTCCTATAAGAA	<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:171:196:287	83	seq2	658	99	35M	=	485	-208	ATAATTCATCATCACTAAACCAGTCCTATAAGAAA	<;;;98;<;&<;;<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:220:801:282	83	seq2	660	99	36M	=	837	213	AATTCATCATCACTAAACCAGTCCTATAAGAAATGC	<<<<<<<<<<<<<<<<<<<<<;<+<;<<<<<::<<:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS221_1:2:73:955:728	147	seq2	660	44	35M	=	823	198	AATTCATCATCACTAAACCAGTCCTATAAGAAATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:14	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS1_105:1:3:903:957	147	seq2	661	99	35M	=	516	-180	ATTCATCATCACTAAACCAGTCCTATAAGAAATGC	<%12<&<<<;<:<<<<<<<<<7<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_65:2:224:579:433	83	seq2	662	99	35M	=	485	-212	TTCATCATCACTAAACCAGTCCTATAAGAAATGCT	'<08/8<+<</<<:<<<<<8<<9<38<<<<<<<<;	MF:i:18	Aq:i:31	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:209:824:866	147	seq2	665	73	35M	=	828	198	ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:30:1882:1210	83	seq2	665	82	35M	=	503	-197	ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA	776778;5;;;;8;;7:8;;;;;;;<<<;;;;;<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:181:476:394	147	seq2	666	99	35M	=	847	216	TCATCACTAAACCAGTCCTATAAGAAATGCTCAAA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<:<<<:;;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:267:953:459	147	seq2	667	99	35M	=	509	-193	CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA	%<07<94========<<==================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:7:140:752:822	147	seq2	667	76	35M	=	495	-207	CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA	;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:322:391:742	83	seq2	667	99	35M	=	847	215	CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:149:639:910	83	seq2	669	99	35M	=	489	-215	TCACTAAACCAGTCCTATAAGAAATGCTCAAAAGA	<;49;<<;;<<<<8;<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:42	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:242:419:512	83	seq2	672	94	35M	=	490	-217	CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT	*:<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:45:183:25	83	seq2	672	95	35M	=	501	-206	CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT	;1<<;<<<;;;;<<<<<+<<<<<<<<<9<<<<<<<	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:326:887:180	83	seq2	672	73	35M	=	492	-215	CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT	8:<<:<5<<<;7<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:145:635:390	147	seq2	673	99	35M	=	860	222	TAAACCAGTCCTATAAGAAATGCTCAAAAGAATTG	<<<<<<<<<<<<<<<<<<:<<<<<<<8<<<::;;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:31:628:1820	147	seq2	675	98	35M	=	828	188	AACCAGTCCTATAAGAAATGCTCAAAAGAATTGTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:7:117:452:744	147	seq2	676	99	35M	=	850	209	ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA	<<<<<<<<<<;<<<;<<<<<<<<<<:<<<<<<<;;	MF:i:18	Aq:i:50	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:297:949:26	147	seq2	676	99	35M	=	842	201	ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:17:437:1378	147	seq2	676	99	35M	=	847	206	ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:222:579:961	83	seq2	679	99	35M	=	504	-210	AGTCCTATAAGAAATGCTCAAAAGAATTGTAAAAG	=58====;==8=======;================	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:98:995:929	147	seq2	680	99	35M	=	844	199	GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT	<;<;<8<;<<;1;<<<<<;<;;;08;<;<1&0+8<	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:76:1765:700	147	seq2	680	99	35M	=	866	221	GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT	;;6;;;;;;;;;6;;;;6;;;;;;;;;;;;88878	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:68:306:409	83	seq2	682	99	40M	=	856	214	CCTATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;:;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:115:193:231	83	seq2	684	99	35M	=	522	-197	TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA	=========7===========<=============	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:57:1675:720	83	seq2	684	99	35M	=	841	192	TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:13:682:680	147	seq2	685	99	35M	=	482	-238	ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA	<<<<<<<<<<:<5<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:6:51:1486:1131	83	seq2	685	77	35M	=	500	-220	ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA	<<<<<<<<<<,<6<<<<<<<<<<<<<<<<<<7<<<	MF:i:18	Aq:i:3	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:33:1240:846	147	seq2	685	99	35M	=	509	-211	ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA	<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:8:43:972:506	83	seq2	686	99	35M	=	505	-216	TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT	;<<<<<<<+;<;<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:23:127:880	147	seq2	686	99	35M	=	504	-217	TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT	<<<<<<<<<%<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:7:101:752:996	83	seq2	687	99	35M	=	508	-214	AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT	<<<<<<<<7<7<<<<<<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:6:3:186:68	147	seq2	687	99	35M	=	512	-210	AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT	<<;<<<<<&:,<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:273:348:37	83	seq2	688	99	36M	=	483	-241	AGAAATGCGCAAAAGAATTGTAAAAGTCAAAATTAA	9;7;;0<++1<<<;<7<+;;1<<<;<17<<<<<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS51_78:7:164:727:977	83	seq2	689	99	35M	=	513	-211	GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA	;<;<;<:<:<<<<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:6:140:253:322	147	seq2	689	99	35M	=	537	-187	GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA	=;===;54:====================>>===>	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:146:374:692	83	seq2	690	99	35M	=	874	219	AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA	<<<<<<<<<<<<<<<</<<<<<<<<<<<<<<<<<:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:1:92:875:345	83	seq2	690	99	35M	=	504	-221	AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA	<<<;<.;7<<<<<<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:45:601:439	147	seq2	691	99	35M	=	864	208	AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG	<<<<;<<<<<<<<<<<<<<<<4<<<<9<<<<<<;;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:5:295:882:282	83	seq2	691	99	35M	=	520	-206	AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG	<<:<8<-<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:78:775:555	147	seq2	691	99	35M	=	539	-187	AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG	<<-<%4/<<<<<<<<<<<<<<<<<5<<<0<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:255:796:239	83	seq2	692	99	35M	=	869	212	ATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGT	<<<<<<<<6<<<<<<<<<<<<<<<<;6<<<:<:<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:57:826:977	83	seq2	693	99	35M	=	528	-200	TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT	875:6<<<<<<<<<<<<<<<;<<<<<<;8<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:187:996:432	83	seq2	693	99	36M	=	860	203	TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:8:65:463:703	147	seq2	693	99	35M	=	506	-222	TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT	<<3<9<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:288:384:444	147	seq2	696	99	35M	=	855	194	TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:5:272:240:950	83	seq2	696	97	35M	=	520	-211	TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA	37<<<<<<<<<<<<<<<<<<<<<<;;<;<<<<<<;	MF:i:18	Aq:i:25	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:160:130:351	147	seq2	697	99	35M	=	530	-202	CAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAAT	4<;;<;<<<-<<<<<<<<<<;;<<<<;<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:189:530:40	147	seq2	698	99	36M	=	883	221	AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATAC	<<<<<<<<<<;<<<<<:<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:168:247:414	83	seq2	698	99	35M	=	876	213	AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA	<<<<<<<<<<<<<<<<*<<<<<<<<<;:6<<<<<;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:6:197:759:975	83	seq2	698	99	35M	=	537	-196	AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:29:411:1208	83	seq2	698	99	40M	=	882	224	AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC	<<<<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<;;;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:110:543:934	83	seq2	700	99	35M	=	514	-221	AAGAATTGTAAAAGTCAAAATTAAAGTTCAATACT	<<<<<5<<;<<<<<<;<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:3:287:665:495	83	seq2	702	99	35M	=	530	-207	GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA	===,9=;;====7=====5===;==1=========	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:70:445:1289	147	seq2	702	99	35M	=	535	-202	GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA	<<<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:172:827:592	147	seq2	703	99	35M	=	899	231	AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC	=;=======;==;===:==========;==9<<.3	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:135:401:735	147	seq2	703	99	35M	=	510	-228	AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC	<<::7<<<<<<::<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:39:208:644	83	seq2	704	99	35M	=	859	190	ATTGTAAAAGTCAAAATTAAAGTTCAATACTCACC	<;<<<<<;;:<<;;<<<<<<;;;;;;.<;<79997	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:99:1632:76	147	seq2	705	99	40M	=	553	-192	TTGTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATA	4641::<<4<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:52:1144:509	83	seq2	706	99	35M	=	867	196	TGTAAAAGTCAAAATTAAAGTTCAATACTCACCAT	<<<<<<<<<<<<<<<<<<<;<<<<<<<;<;<<;<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:116:157:612	83	seq2	707	99	35M	=	889	217	GTAAAAGTCAAAATTAAAGTTCAATACTCACCATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:36:481:1079	147	seq2	707	99	40M	=	881	214	GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::8	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:74:668:424	147	seq2	707	99	40M	=	545	-202	GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA	:::::<<96<<<<<;<<<;<<5<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:122:398:994	147	seq2	708	99	35M	=	871	198	TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA	<:<9<<<<<<4<<<;9<<<<<98<;<<<:;<;<;7	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:36:1231:1381	83	seq2	708	99	35M	=	891	218	TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:57:366:844	147	seq2	708	99	40M	=	877	209	TAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::7:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:307:208:477	83	seq2	710	99	35M	=	546	-199	AAAGTCAAAATTAAAGTTCAATACTCACCATCATA	<<<<<.<<<<<<<<<<<<;<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:3:285:417:147	147	seq2	712	99	35M	=	529	-218	AGTCAAAATTAAAGTTCAATACTCACCATCATAAA	<..)<<<<;<<<<7<;-<<;<<<<<;8<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:325:544:349	83	seq2	716	99	35M	=	515	-236	AAAATTAAAGTTCAATACTCACCATCATAAATACA	<<<<57<<<7<;6<<<<;<7<7;<<7<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:33:357:858	147	seq2	716	99	35M	=	870	189	AAAATTAAAGTTCAATACTCACCATCATAAATACA	<<<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:78:806:800	83	seq2	717	99	40M	=	564	-193	AAATTAAAGTTCAATACTCACCATCATAAATACACACAAA	::;9:<<<;<<:<<<<:<.<1:<<1<<<<<<;<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:41:314:1173	147	seq2	718	99	35M	=	554	-199	AATTAAAGTTCAATACTCACCATCATAAATACACA	<<2**<<82/<<<<<<<<<<9<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:82:963:128	147	seq2	719	99	35M	=	905	221	ATTAAAGTTCAATACTCACCATCATAAATACACAC	<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<<;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:240:719:799	83	seq2	720	99	35M	=	900	215	TTAAAGTTCAATACTCACCATCATAAATACACACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:93:634:323	147	seq2	721	99	35M	=	550	-206	TAAAGTTCAATACTCACCATCATAAATACACACAA	<<<<;<;<<<<;;<<2<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:12:1335:1372	147	seq2	721	99	40M	=	906	225	TAAAGTTCAATACTCACCATCATAAATACACACAAAAGTA	<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<99::.:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:116:738:142	147	seq2	722	99	35M	=	568	-189	AAAGTTCAATACTCACCATCATAAATACACACAAA	<:<7;+:<<:<<<;<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:2:49:330:699	83	seq2	722	99	35M	=	540	-217	AAAGTTCAATACTCACCATCATAAATACACACAAA	===/=;========;=;==================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:7:273:562:954	147	seq2	722	99	35M	=	539	-218	AAAGTTCAATACTCACCATCATAAATACACACAAA	;<<+;95<<<;5;<<;:<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:6:77:1529:522	147	seq2	722	99	35M	=	562	-195	AAAGTTCAATACTCACCATCATAAATACACACAAA	<<<;7;,<<<<<<.<,6<<6<<<<<<<;<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:67:1467:1447	147	seq2	722	99	35M	=	898	211	AAAGTTCAATACTCACCATCATAAATACACACAAA	<<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:251:819:772	83	seq2	726	99	36M	=	881	191	TTCAATACTCACCATCATAAATACACACAAAAGTAC	<3<<<9<9<3<</<<<<<<59<3<9<<</9/++*/'	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:144:492:61	147	seq2	728	99	35M	=	564	-199	AAATACTCACCATCATAAATACACACAAAAGTACA	+;;3;,:7<:;<<7<<<<<<<;;<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:11	H0:i:1	H1:i:0
+EAS54_73:7:200:65:291	83	seq2	728	99	35M	=	930	237	CAATACTCACCATCATAAATACACACAAAAGTACA	<<<<1<<<<<<<<<<<<<<<<<<<:<8<<<<:<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:130:609:467	83	seq2	728	99	35M	=	877	184	CAATACTCACCATCATAAATACACACAAAAGTACA	==8=====;==8==;=4=;;8=====;6=177.==	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:216:47:302	147	seq2	729	99	35M	=	557	-207	AATACTCACCATCATAAATACACACAAAAGTACAA	<<;<8<:<6<<<;<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:4:234:610	83	seq2	729	84	35M	=	560	-204	AAAAATCAACATCACAAATACACACAAAAGTACAA	<:+:'+&<+'<+'2&<:<7<2<':2<:<<7<7<<<	MF:i:18	Aq:i:22	NM:i:4	UQ:i:31	H0:i:0	H1:i:0
+EAS54_81:8:271:180:509	83	seq2	729	99	35M	=	896	202	AATACTCACCATCATAAATACACACAAAAGTACAA	=============================='====	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:41:530:663	147	seq2	730	99	35M	=	908	213	ATACTCACCATCATAAATACACACAAAATTACAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;;<<	MF:i:18	Aq:i:74	NM:i:1	UQ:i:22	H0:i:1	H1:i:0
+EAS114_39:4:30:570:902	83	seq2	730	99	35M	=	561	-204	ATACTCACCATCATAAATACGCACAAAAGTACAAA	<:<6:6<&:<<6<<<<<<<<.<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:13	H0:i:0	H1:i:1
+EAS1_105:1:87:430:995	83	seq2	731	67	35M	=	909	213	TACTCACCATCATAAATACACACAAAATTACAAAA	<<;<<7;;;<;<<777;7(77;;1;7;%117;,7(	MF:i:18	Aq:i:30	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS114_28:7:215:863:521	147	seq2	732	99	36M	=	890	194	ACTCACCATCATAAATACACACAAAAGTACAAAACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:267:394:437	83	seq2	735	99	35M	=	544	-226	AAACATCATAAATACACACAAAAGTACAAAACTCA	&<&,<8.<;<<<;<8<8<7<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:2	UQ:i:10	H0:i:1	H1:i:0
+EAS1_108:6:94:294:387	83	seq2	736	99	35M	=	578	-193	ACCATCATAAATACACACAAAAGTACAAAACTCAC	779=53=9===;=:=;=========;=========	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:38:332:54	147	seq2	737	99	36M	=	904	203	CCATCATAAATACACACAAAAGTACAAAACTCACAG	<;<<<<<<<<<<<<<<<<<<<<<<<<<<<0;;;<;;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:8:165:441:708	83	seq2	737	99	35M	=	550	-222	CCATCATAAATACACACAAAAGTACAAAACTCACA	6+<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:246:177:525	147	seq2	738	98	35M	=	549	-224	CATCATAAATACACACAAAAGTAAAAAACTCACAG	%<(4<2<<<<<:<;<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_26:5:43:114:617	83	seq2	738	99	35M	=	579	-194	AATCATAAATACACACAAAAGTACAAAACTCACAG	+=22=6=================9===========	MF:i:18	Aq:i:52	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS1_99:8:152:778:228	147	seq2	739	99	35M	=	915	211	ATCATAAATACACACAAAAGTACAAAACTCACAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:3:24:319:429	83	seq2	740	99	35M	=	582	-193	TAATAAATACACACAAAAGTACAAAACTCACAGGT	0%=3%=3====<=9=====89==93==9=6=====	MF:i:18	Aq:i:56	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS51_66:5:210:674:911	83	seq2	740	99	35M	=	904	199	TCATAAATACACACAAAAGTACAAAACTCACAGGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:88:451:1773	83	seq2	742	99	35M	=	902	195	ATAAATACACACAAAAGTACAAAACTCACAGGTTT	;;:::<:;:<<;:6::;:;;:::;;<;;;367177	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:2:168:1878	147	seq2	743	37	35M	=	560	-218	TAAATACACACAAAAGTAGAAAACGCACCAGTTTT	*3/6)9.;;;;;;;;5;;);;;3;(;;;+(;7.)3	MF:i:-126	Aq:i:37	NM:i:4	UQ:i:32	H0:i:0	H1:i:0
+EAS188_7:5:115:249:673	83	seq2	743	99	35M	=	552	-226	TAAATACACACAAAAGTACAAAACTCACAGGTTTT	:<<<;<<<;<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:178:187:610	83	seq2	744	99	35M	=	903	194	AAATACACACAAAAGTACAAAACTCACAGGTTTTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:2:9:49:661	83	seq2	747	99	35M	=	591	-191	TACACACAAAAGTACAAAACTCACAGGTTTTATAA	<<6<5<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:157:361:309	147	seq2	747	99	35M	=	589	-193	TACACACAAAAGTACAAAACTCACAGGTTTTATAA	:<-<5<0<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:103:443:166	83	seq2	747	99	35M	=	565	-217	TACACACAAAAGTACAAAACTCACAGGTTTTATAA	7<4<4<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:8:49:182:192	147	seq2	750	99	35M	=	582	-203	ACACAAAAGTACAAAACTCACAGGTTTTATAAAAC	<5<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:12:630:707	83	seq2	751	99	35M	=	915	199	CACAAAAGTACAAAACTCACAGGTTTTATAAAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:7:94:1440:2016	83	seq2	751	99	35M	=	564	-222	CACAAAAGTACAAAACTCACAGGTTTTATAAAACA	:<8<<<<9<<9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:206:741:810	147	seq2	753	99	35M	=	929	210	CAAAAGTACAAAACTCACAGGTTTTATAAAACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:-;<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:250:698:842	83	seq2	753	99	34M	=	554	-233	AAAAAGTACAAAACTCACAGGTTTTATAAAACAA	)<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:39	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+EAS54_81:6:265:251:147	83	seq2	754	99	35M	=	581	-208	AAAAGTACAAAACTCACAGGTTTTATAAAACAATT	<<<<::<8<<<;<;8<8<<<<<<<<:<<<<<<<<<	MF:i:18	Aq:i:50	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:71:644:1792	83	seq2	754	84	35M	=	589	-200	AAAAGTACAAAACTCACAGGTTTTATAAAACAATT	<<<<;<<<<<<:;/<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:6:108:958:42	83	seq2	755	81	35M	=	584	-206	AAAGTACAAAACTCACAGGTTTTATAAAACAATTA	<<<;;</<<<<;<<<<<<<<<<<<<<<<<<<<<<+	MF:i:18	Aq:i:9	NM:i:1	UQ:i:27	H0:i:0	H1:i:3
+B7_597:8:48:805:860	147	seq2	755	78	35M	=	563	-227	AAAGTACAAAACTCACAGGTTTTATAAAACAATTA	<<<;3<;7<<97<7<<<<7<4<<<<<<<<<<;8<+	MF:i:18	Aq:i:13	NM:i:1	UQ:i:27	H0:i:0	H1:i:3
+B7_591:3:179:496:161	147	seq2	756	99	36M	=	919	199	AAGTACAAAACTCACAGGTTTTATAAAACAATTAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+	MF:i:18	Aq:i:49	NM:i:2	UQ:i:53	H0:i:1	H1:i:0
+EAS56_59:3:166:626:836	83	seq2	757	99	35M	=	567	-225	AGTACAAAACTCACAGGTTTTATAAAACAATTAAT	<;;7<<<<<<;<7;<<<<<<<<<<<<7<<<<<<<+	MF:i:18	Aq:i:28	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS114_28:5:23:944:377	147	seq2	757	75	36M	=	579	-214	AGTACAAAACTCACAGGTTTTATAAAACAATTAATT	<;7;8<<<<:<;<:<<<<<<<<<<<<<;<<<<<<<;	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_45:1:100:979:1863	147	seq2	757	85	35M	=	583	-209	ATTACAAAACTCACAGGTTTTATAAAACAATTAAT	6&,*3;6;66;9(572692;;;79;4)9;96;59+	MF:i:18	Aq:i:23	NM:i:3	UQ:i:51	H0:i:0	H1:i:0
+EAS219_1:3:90:219:528	83	seq2	758	75	35M	=	576	-217	GTACAAAACTCACAGGTTTTATAAAACAATTAATT	;:<5<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_108:5:89:942:84	83	seq2	759	74	35M	=	562	-232	TACAAAACTCACAGGTTTTATAAAACAATTAATTG	===================>=>>>==>>===>==>	MF:i:-126	Aq:i:74	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_108:6:159:493:275	83	seq2	760	72	35M	=	939	214	ACAAAACTCACAGGTTTTATAAAACAATTAATTGA	=====3=============================	MF:i:-126	Aq:i:72	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS139_11:1:81:1019:558	147	seq2	760	77	35M	=	926	201	ACAAAACTCACAGGTTTTATAAAACAATTAATTGA	<<<<<<<<<<<6<<<<<<<<<<<<<<<<<<<<<7<	MF:i:-126	Aq:i:77	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS51_62:7:162:195:761	147	seq2	767	30	18M4I13M	=	922	190	TCACAGGTTTTATAAAACAATTAATTGAGACTACA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;;	MF:i:-126	Aq:i:30	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+B7_597:3:115:646:430	147	seq2	768	45	17M4I14M	=	582	-217	CACAGGTTTTATAAAACAATTAATTGAGACTACAG	5;5<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:45	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:6:243:209:110	147	seq2	768	48	17M4I14M	=	920	187	CACAGGTTTTATAAAACAATTAATTGAGACTACAG	<<<<<;<;<<<;<<<<<<<<<<<;<:;<<:;;+85	MF:i:-126	Aq:i:48	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_108:2:266:994:429	147	seq2	769	76	16M4I15M	=	612	-188	ACAGGTTTTATAAAACAATTAATTGAGACTACAGA	</<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:5:32:461:154	83	seq2	769	71	16M4I15M	=	945	211	ACAGGTTTTATAAAACAATTAATTGAGACTACAGA	<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<+<;;	MF:i:-126	Aq:i:71	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_39:6:7:492:1088	83	seq2	769	57	16M4I15M	=	926	192	ACAGGTTTTATAAAACAATTAATTGAGACTACAGA	<<<<<<<<<<<<<<<<<<<<<<<<7<:<<<<<<6;	MF:i:-126	Aq:i:57	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_95:6:174:650:125	147	seq2	770	76	15M4I16M	=	600	-201	CAGGTTTTATAAAACAATTAATTGAGACTACAGAG	===;===============================	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_59:6:89:457:591	147	seq2	770	69	15M4I16M	=	585	-216	CAGGTTTTATAAAACAATTAATTGAGACTACATAG	797<<9<<<<<<<3<7<<<<<<<<<<)<<<<<07<	MF:i:-126	Aq:i:69	NM:i:1	UQ:i:15	H0:i:0	H1:i:0
+EAS114_39:2:38:670:564	83	seq2	770	73	15M4I16M	=	930	195	CAGGTTTTATAAAACAATTAATTGAGACTACAGAG	<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;<5<;	MF:i:-126	Aq:i:73	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS188_7:4:92:693:228	147	seq2	770	75	14M4I17M	=	601	-200	AAGGTTTTATAAAAAAATTAATTGAGACTACAGAG	6=77=<<=======&====================	MF:i:-126	Aq:i:75	NM:i:1	UQ:i:28	H0:i:0	H1:i:0
+EAS218_1:4:61:1369:440	147	seq2	770	47	15M4I16M	=	964	229	CAGGTTTTATAAAACAATTAATTGAGACTACAGAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<8	MF:i:-126	Aq:i:47	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_26:4:123:1001:580	83	seq2	771	43	14M4I17M	=	617	-185	AGGTTTTATAAAACAATTAATTGAGACTACAGAGC	<.00..3<6<<<<<<<3;<<08<<<<<6<<<<<<<	MF:i:-126	Aq:i:43	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_39:4:10:1312:1558	147	seq2	771	76	14M4I17M	=	928	192	AGGTTTTATAAAACAATTAATTGAGACTACAGAGC	5<<<<<<<<<<<<<<<<<<<<<<<;;<<<<<;8;<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS220_1:8:45:178:1321	83	seq2	771	77	14M4I17M	=	606	-196	AGGTTTTATAAAACAATTAATTGAGACTACAGAGC	<<<<<<<<<<<<<<<<<:<<:<<<<<<<<<<<<<<	MF:i:-126	Aq:i:77	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_59:5:125:137:58	147	seq2	772	76	13M4I18M	=	932	195	GGTTTTATAAAACAATTAATTGAGACTACAGAGCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS192_3:3:285:349:797	83	seq2	773	76	12M4I19M	=	604	-200	GTTTTAAAAAACCAATAATTGAGACTACAGAGCAA	;;<<<7.:<<<..<.<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:1	UQ:i:13	H0:i:0	H1:i:0
+EAS114_45:5:56:1757:1319	147	seq2	775	67	10M4I21M	=	957	217	TTTATAAAACAATTAATTGAGACTACAGAGCAACT	;;;;9;;;;;;;;;;;;;4;9;98;;;;;9388&7	MF:i:-126	Aq:i:67	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+B7_591:3:291:404:199	83	seq2	777	76	8M4I24M	=	612	-197	TATAAAACAATTAATTGAGACTACAGAGCAACTAGG	<<<<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS54_65:7:159:253:353	83	seq2	778	67	7M4I24M	=	613	-196	ATAAAACAATTAATTGAGACTACAGAGCAACTAGG	<8<<<<:<<;;<<<<<<<<<<<;<<<<<<<<<<<<	MF:i:-126	Aq:i:67	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_57:1:122:38:103	147	seq2	778	79	7M4I24M	=	972	229	ATAAAACAATTAATTGAGACTACAGAGCAACTAGG	<<<<<<<<<<<<<<<<;<<<<<<<<3<<<<9<8;<	MF:i:-126	Aq:i:79	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS188_4:5:103:870:105	147	seq2	778	44	7M4I24M	=	595	-214	ATAAAACAATTAATTGAGACTACAGAGCAACTAGG	<<<<<<<<<<<<<=<:<;<<<<<<<<<<*<<<<<<	MF:i:-126	Aq:i:44	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_105:8:24:718:322	147	seq2	779	23	35M	=	953	209	ACAATTAATTGAGACTACAGACCAATTATGTAAAA	5/7<3+<;<1<<1<95<.&&.&&.<&)5)1)17<%	MF:i:-126	Aq:i:23	NM:i:3	UQ:i:18	H0:i:0	H1:i:0
+EAS51_64:6:118:41:489	83	seq2	779	76	35M	=	588	-226	ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA	<+<<;<<<38<<<<5<<3<<<<3<<8<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS56_61:3:165:665:220	83	seq2	779	76	35M	=	618	-196	ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA	<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS114_30:6:238:803:383	83	seq2	779	75	35M	=	954	210	ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA	<<<<<<<<<<<<;<<<<<;<;<<;<<;<<<9<;<<	MF:i:-126	Aq:i:75	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS1_105:3:232:364:583	83	seq2	780	71	35M	=	956	211	CAATTAATTGAGACTACAGAGCAACTAGGTAAAAA	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:-126	Aq:i:71	NM:i:0	UQ:i:0	H0:i:0	H1:i:0
+EAS139_19:2:2:1217:398	83	seq2	780	99	40M	=	608	-212	CAATTAATTGAGACTACAGAGCAACTAGGTAAAAAATTAA	+;;:9<<66<<<;+<<7<<<<;<<+;<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:3	UQ:i:73	H0:i:1	H1:i:0
+B7_593:2:81:435:410	83	seq2	782	99	36M	=	966	220	ATTAATTGAGACTACAGAGCAACTAGGTAAAAAATT	<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<;<<;;	MF:i:18	Aq:i:29	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+B7_593:3:115:649:259	147	seq2	782	99	36M	=	617	-201	ATTAATTGAGAATACAGAGCAACTAGGTAAAAAATT	;<;<<;<<<<;&<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:3	UQ:i:58	H0:i:0	H1:i:1
+EAS1_93:3:181:93:694	147	seq2	783	99	35M	=	954	206	TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT	++<<<<<<;<<<<<<:;8<<;<<<5;<;<<<+<<<	MF:i:18	Aq:i:28	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS114_30:1:188:863:790	147	seq2	783	98	35M	=	969	221	TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT	++<;<<;;;:<<<<:<:<<:1<<1<<<6:6;4;;4	MF:i:18	Aq:i:27	NM:i:2	UQ:i:54	H0:i:0	H1:i:0
+EAS1_93:2:313:711:530	147	seq2	784	99	35M	=	968	219	TAATTGAGACTACAGAGCAACTAGGTAAAAAATTA	+<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<:	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_589:7:154:26:712	83	seq2	786	99	35M	=	959	208	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC	<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:185:87:475	147	seq2	786	99	36M	=	949	199	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:69:1593:819	147	seq2	786	99	40M	=	977	231	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACATTAC	<<<<<<<<<<<<<<;<<<<<;;<:<<<<<:<<<<<:777:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:309:187:267	83	seq2	786	99	35M	=	616	-205	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC	<:0;<;<4<<7<<<<:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:82:1540:77	83	seq2	786	99	35M	=	619	-202	ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC	<48;<;</;<<<<<<:<<0<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:193:420:78	147	seq2	787	99	35M	=	607	-215	TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA	81<<;<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:261:267:597	83	seq2	787	86	35M	=	617	-205	TTGAGAATAAAGAGCAACTAGGTAAAAAATTAACA	*-1<9<+1<+<<<<:<<;9<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:41	NM:i:2	UQ:i:20	H0:i:0	H1:i:1
+EAS56_59:4:262:928:237	83	seq2	787	99	35M	=	971	219	TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:262:53:888	147	seq2	787	99	35M	=	965	213	TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA	<<<<<<<<;<<<<<<<<<<;<<;<;<;6<<;<;;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:138:211:582	83	seq2	788	99	35M	=	957	204	TGAGACTACAGAGCAAATAGGTAAAAAATTAACAT	<<;<<<<<<<<<<<<<&;<;<7<<;<<<<<<<5<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_597:7:113:408:211	83	seq2	789	99	35M	=	952	198	GAGACTACAGAGCAACTAGGTAAAAAATTAACATT	<<<<<<<<<<<<<<<:&<<<&:<<<<<<<<<<;:/	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:3:79:879:15	147	seq2	790	99	35M	=	626	-199	AGACTACAGAGCAACTAGGTAAAAAATTAACATTA	<;;5;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:325:795:213	83	seq2	790	99	35M	=	618	-207	AGACTACAGAGCAACTAGGTAAAAAATTAACATTA	<<<0<<;<<<<;<<;:<<<<<<<<<<<;<<<<<9<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:4:22:206:150	83	seq2	792	99	35M	=	619	-208	AAAAAAGAGCAACTAGGTAAAAAATTAACATTACA	8&)<)<<<<+<<+<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:3	UQ:i:21	H0:i:1	H1:i:0
+EAS56_59:5:181:713:140	147	seq2	793	84	35M	=	615	-213	CTACAGAGCAACAAGGTAAAAAATTAACATTACAA	78<+<7<-7;;;&<5<7<<<<7<<<<<<<<<<<7<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_589:7:76:306:561	147	seq2	794	89	35M	=	987	228	TACAGAGCAACTAGGTAAAAAATTAACATTACAAC	<<)<<<<<<8<<8<<<<<<<;;;<<1<<3;=7<<9	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:4:325:352:67	83	seq2	794	99	35M	=	622	-207	TACAGAGCAACTAGGTAAAAAATTAACATTACAAC	;<8<<<;;<<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:310:287:420	83	seq2	794	99	35M	=	965	206	TACAGAGCAACTAGGTAAAAAATTAACATTACAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:5:74:329:459	83	seq2	795	99	35M	=	623	-207	ACAGAGCAACTAGGTAAAAAATTAACATTACAACA	</<;<8/<<9<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:57:1342:1166	83	seq2	796	99	35M	=	964	203	CAGAGCAACTAGGTAAAAAATTAACATTACAACAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:3:542:428	147	seq2	797	99	35M	=	965	203	AGAGCAACTAGGTAAAAAATTAACATTACAACAGG	7<4<<<6<<,<9)<<<<6<,<<7<<7<<<<<<<<1	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:97:892:419	83	seq2	800	99	35M	=	621	-214	GCAACTAGGTAAAAAATTAACATTACAACAGGAAC	;8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:82:1051:921	83	seq2	800	99	40M	=	616	-224	GCAAATAGGTAAAAAATTAACATTACAACAGGAACAAAAC	3-::-7<;+:9<;<<<5<;9,::53-;:3<<<<9<<3<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS1_95:5:263:511:936	147	seq2	801	99	35M	=	629	-207	CAAATAGGTAAAAAATTAACATTACAACAGGAACA	+<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS114_26:7:157:876:302	147	seq2	801	99	35M	=	964	198	CAACTAGGTAAAAAATTAACATTACAACACGAACA	2<<;<<<22<<<<<<77<<<<22<7<<<<%-<<1<	MF:i:18	Aq:i:66	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS54_65:2:127:288:655	147	seq2	803	99	35M	=	999	231	ACTAGGTAAAAAATTAACATTACAACAGGAACAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:83:731:540	147	seq2	804	99	35M	=	623	-216	CTAGGTAAAAAATTAACATTACAACAGGAACAAAA	;7<:+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:82:843:1838	83	seq2	804	99	35M	=	999	230	CTAGGTAAAAAATTAACATTACAACAGGAACAAAA	;<<;:;;<<<;;<<<<;;<<;;;;;<;;;;68887	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:71:994:576	147	seq2	805	99	35M	=	655	-185	TAGGTAAAAAATTAACATTACAACAGGAACAAAAC	<<9;;<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:24:415:944	83	seq2	805	99	35M	=	974	204	TAGGTAAAAAATTAACATTACAACAGGAACAAAAC	<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:3:73:1458:1337	83	seq2	806	99	35M	=	609	-232	AGGTAAAAAATTAACATTACAACAGGAACAAAACC	<</<<<<<<<6:<::<<<1<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:142:353:398	147	seq2	807	99	35M	=	977	205	GGTAAAAAATTAACATTACAACAGGAACAAAACCT	=================================9=	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:46:522:426	147	seq2	807	99	35M	=	964	192	GGTAAAAAATTAACATTACAACAGGAACAAAACCT	=======================:==;<===78==	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:59:871:351	147	seq2	808	99	35M	=	963	190	GTAAAAAATTAACATTACAACAGGAACAAAACCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:6:235:505:553	147	seq2	808	99	35M	=	987	214	GTAAAAAATTAACATTACAACAGGAACAAAACCTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:;:	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:60:1420:660	83	seq2	808	99	35M	=	649	-194	GTAAAAAATTAACATTACAACAGGAACAAAACCTC	99<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:180:89:582	147	seq2	809	99	36M	=	650	-195	TAAAAAATTAACATTACAACAGGAACAAAACCTCAT	;<<<<<<4<<<:<<<<<<<<<6<<<<<<<<<<;<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:323:196:855	83	seq2	809	99	35M	=	642	-202	TAAAAAATTAACATTACAACAGGAACAAAACCTCA	&<<<<<<09<<7<7;<;<<0<<<<<;<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:295:547:216	147	seq2	809	99	35M	=	970	196	TAAAAAATTAACATTACAACAGGAACAAAACCTCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:126:361:250	83	seq2	810	99	35M	=	1002	227	AAAAAATTAACATTACAACAGGAACAAAACCTCAT	<<<<<<;9<<<<<<<<<<<<<<;;;<<<;<664;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:266:133:789	83	seq2	810	99	35M	=	988	213	AAAAAATTAACATTACAACAGGAACAAAACCTCAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:175:149:296	83	seq2	811	99	35M	=	614	-232	AAAAATTAACATTACAACAGGAACAAAACCTCATA	=;==26==;==;================7======	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:136:260:254	83	seq2	813	99	35M	=	988	210	AAATTAACATTACAACAGGAACAAAACCTCATATA	<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:85:1521:58	147	seq2	813	99	40M	=	639	-214	AAATTAACATTACAACAGGAACAAAACCTCATATATCAAT	:::86<<:<<8<<<<;<<8<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:164:719:947	83	seq2	813	99	35M	=	1005	227	AAATTAACATTACAACAGGAACAAAACCTCATATA	<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<<<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:50:257:341	147	seq2	813	99	35M	=	971	193	AAATTAACATTACAACAGGAACAAAACCTCATATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<6<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:5:117:33:262	83	seq2	814	99	35M	=	642	-207	AATTAACATTACAACAGGAACAAAACCTCATATAT	<<;;<<;<:8<7<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:8:90:706:1276	147	seq2	814	99	35M	=	980	201	AATTAACATTACAACAGGAACAAAACCTCATATAT	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:<:<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:116:966:193	147	seq2	815	99	35M	=	967	187	ATTAACATTACAACAGGAACAAAACCTCATATATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:59:742:549	147	seq2	816	99	35M	=	642	-209	TTAACATTACAACAGGAACAAAACCTCATATATCA	-<<<3<<<<6<<6<<<<<6<<<<6<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:74:213:877	83	seq2	816	99	35M	=	996	215	TTAACATTACAACAGGAACAAAACCTCATATATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_610:3:85:219:371	147	seq2	817	99	35M	=	967	185	TAACATTACAACAGGAACAAAACCTCATATATCAA	<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<;<;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:176:653:957	147	seq2	819	82	35M	=	982	198	ACATTACAACAGGAACAAAACCTCATATATCAATA	????????????<<???@<<<<<@<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:64:526:339	147	seq2	819	96	35M	=	1019	235	ACATTACAACAGGAACAAAACCTCATATATCAATA	<<<<<<<<;<<<<<<<<<<7<:<<<<<<<<<8:<:	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:97:743:602	83	seq2	821	99	34M	=	644	-211	ATTACAACAGGAACAAAACCTCATATATCAATAT	<(&<:<<&<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:2	H1:i:6
+B7_610:2:75:887:149	147	seq2	823	99	35M	=	1004	216	TACAACAGGAACAAAACCTCATATATCAATATTAA	<<<<<<<<<<<<<<;<<<<<<<;<<<<<<<;<;;;	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS221_1:2:73:955:728	83	seq2	823	44	35M	=	660	-198	TACAACAGGAACAAAACCTCATATATCAATATTAA	;<-<<6<;<<<6<<<<;7<6<<<<<<<<<<<<<<<	MF:i:18	Aq:i:14	NM:i:0	UQ:i:0	H0:i:3	H1:i:18
+EAS1_108:2:102:543:160	147	seq2	825	99	35M	=	977	187	CAACAGGAACAAAACCTCATATATCAATATTAACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<:<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_28:2:55:562:403	83	seq2	825	99	36M	=	643	-218	CAACAGGAACAAAACCTCATATATCAATATTAACTT	+<<&<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+B7_593:1:19:695:59	83	seq2	826	99	36M	=	988	198	AACAGGAACAAAACCTCATATATCAATATTAACTTT	<<<<<<<<<<<;<<<<<<<<<;<<;;<;<<7<<<<;	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS221_1:2:8:327:522	147	seq2	826	99	35M	=	1001	210	AACAGGAACAAAACCTCATATATCAATATTAACTT	<<<<<<<<<<:<<<<<<<<<<:<<<<<<<<<:<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS114_45:6:90:561:850	147	seq2	827	85	35M	=	1004	212	ACAGGAACAAAACCTCATATATCAATATTAACTTT	;;;;;;;;;;;;;;;;;;;;;;;;9;9;6;77777	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:2	H1:i:25
+EAS56_61:5:209:824:866	83	seq2	828	73	35M	=	665	-198	CAGCAACAAAACCTCATATATCAATATTAACTTTG	;<:&<<:<<<<;<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:1	UQ:i:5	H0:i:1	H1:i:7
+EAS139_11:2:31:628:1820	83	seq2	828	98	35M	=	675	-188	CAGGAACAAAACCTCATATATCAATATTAACTTTG	<<<<<<:<<<<:6<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS220_1:4:6:1178:1105	147	seq2	830	93	35M	=	657	-208	GGAACAAAACCTCATATATCAATATTAACTTTGAA	<:<<9<<<<::7<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:11
+EAS114_28:4:305:707:258	83	seq2	831	58	36M	=	992	197	GAACAAAACCTCATATATCAATATTAACTTTGAATA	9<<<<<<<<<<<<;<<-<<;;<;<<9<<;<<+99;7	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:2	H1:i:9
+EAS54_67:3:114:736:433	147	seq2	832	63	35M	=	998	201	AACAAAACCTCATATATCAATATTAACTTTGAATA	;<<9<8;<<<<8<8<;<<;;;0<<8;<;<<47;;;	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+B7_591:7:157:447:758	83	seq2	833	99	36M	=	994	197	ACAAAACCTCATATATCAATATTAACTTTGAATAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_591:4:159:508:571	83	seq2	834	84	36M	=	989	191	CAAAACCTCATATATCAATATTAACTTTGAATAAAA	<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS54_65:7:68:825:405	147	seq2	835	30	35M	=	1015	215	AAAACCTCATATATCAATATTAACTTTGAATAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;9	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+B7_593:3:102:856:670	83	seq2	836	99	36M	=	1025	225	AAACCTCATATATCAATATTAACTTTGAATAAAAAG	<<<<<<<;<<<;<<;:<<<<<<<<<<:;;<<;<<<7	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:260:827:289	147	seq2	836	99	35M	=	999	198	AAACCTCATATATCAATATTAACTTTGAATAAAAA	<<<<2<<<<;<<<<;<<<<<<:<<<&-<8<<88<3	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS114_28:1:220:801:282	147	seq2	837	99	36M	=	660	-213	AACCTCATATATCAATATTAACTTTGAATAAAAAGG	;7;87;===;==;====:===<==7===========	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:57:1675:720	147	seq2	841	99	35M	=	684	-192	TCATATATCAATATTAACTTTGAATAAAAAGGGAT	<,<<<<<<:<<<<<<<<:9<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:297:949:26	83	seq2	842	99	35M	=	676	-201	CATATATCAATATTAACTTTGAATAAAAAGGGATT	5<;<;<;:<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:1:76:34:691	89	seq2	843	58	35M	*	0	0	ATATATCAATATTAACTTTGAATAAAAAGGGATTA	<<<<<<16<<<<<916<<<499<966161919<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:5:98:995:929	83	seq2	844	99	35M	=	680	-199	TATAACAATATTAACTTTGAATAAAAAGGGATTAA	&<+<'7<<+<&<<<7+4<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:63	NM:i:1	UQ:i:6	H0:i:1	H1:i:0
+EAS139_19:3:58:923:1915	147	seq2	846	99	40M	=	1007	201	TATCAATATTAACTTTGAATAAAAAGGGATTAAATTCCCC	<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<:::::	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:181:476:394	83	seq2	847	99	35M	=	666	-216	AACAATATTAACTTTGAATAAAAAGGGATTAAATT	<+;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS112_32:7:322:391:742	147	seq2	847	99	35M	=	667	-215	ATCAATATTAACTTTGAATAAAAAGGGATTAAATT	<63<<<<9<<<:<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:8:17:437:1378	83	seq2	847	99	35M	=	676	-206	ATCAATATTAACTTTGAATAAAAAGGGATTAAATT	<<7<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:155:375:623	147	seq2	849	99	35M	=	1029	215	CAATATTAACTTTGAATAAAAAGGGATTAAATTCC	0<<<<<;<<<<<<<<<<<<<4<<8<<<<<<<<;<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:2:29:729:70	147	seq2	850	51	35M	=	1009	194	ANTATTANCTTTGANNAAAAAGGGATTAAATTCCC	:!<:<<8!::::5:!!:.77::33888633:8777	MF:i:-126	Aq:i:51	NM:i:3	UQ:i:0	H0:i:0	H1:i:0
+EAS54_65:7:117:452:744	83	seq2	850	99	35M	=	676	-209	AATATTAACTTTGAATAAAAAGGGATTAAATTCCC	<;;<;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:50	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:288:384:444	83	seq2	855	99	35M	=	696	-194	TAACTTTGAATAAAAAGGGATTAAATTCCCCCACT	;=9;;<====<=;=/=9;<========<=======	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:133:514:754	147	seq2	855	63	36M	=	1036	217	TAAATTTGAATAAAAAGGGATTAAATTCCCCCACTT	***&,,,+(*,*********+*)*(***(**((*)(	MF:i:18	Aq:i:19	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS139_19:5:68:306:409	147	seq2	856	99	40M	=	682	-214	AACTTTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG	::2:7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:3:155:758:710	147	seq2	859	98	35M	=	1048	224	TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG	=======8================6=:7===:=:=	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:39:208:644	147	seq2	859	99	35M	=	704	-190	TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG	78899;;;;4;;;;;;;;;;;;;;;;;;8;;8;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:16:438:245	89	seq2	860	65	35M	*	0	0	TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA	8*8<5'<77;;;;;7<7<<7-<;<<<;;<<<;;79	MF:i:32	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:145:635:390	83	seq2	860	99	35M	=	673	-222	TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA	+9;<<;<<<<<;;;<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:6:187:996:432	147	seq2	860	99	36M	=	693	-203	TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG	;<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:123:924:645	147	seq2	861	84	36M	=	1045	220	TGAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA	<<<<<<<<<<<<;<<<<<<;<<<<<<<6:<7<1<+<	MF:i:18	Aq:i:11	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:146:961:63	147	seq2	861	86	35M	=	1041	215	TGAATAAAAAGGGCTTAAATTCCCCCACTTAAGGG	<<+<<<<::+1<;&<<88<<<<;;.<0;;85(;(8	MF:i:18	Aq:i:37	NM:i:2	UQ:i:12	H0:i:0	H1:i:1
+EAS114_30:6:4:665:771	69	seq2	862	0	*	=	862	0	GTGCTTTATCTGATATCAATGCCGATAAACTGCCT	<<<<<<<<<<<<%<8<3:7:77<(7,:3(:&2:(0	MF:i:-64
+EAS114_30:6:4:665:771	137	seq2	862	71	35M	=	862	0	GAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA	<;<<;<18<;<8<<<<;<;;<<<<1<<<<6;;;;;	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:45:601:439	83	seq2	864	99	35M	=	691	-208	ATAAAAAGGGATTAAATTCCCCCACTTAAGAGATA	<8<<<<<<1<<<<<<<<)<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:4:126:966:514	147	seq2	865	99	35M	=	1027	197	TAAAAAGGGATTAAATTCCCCCACTTAAGAGATAT	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:76:1765:700	83	seq2	866	99	35M	=	680	-221	AAAAAGGGATTAAATTCCCCCACTTAAGAGATATA	77777;;;;7;7;<;;;;+;;<9<<<79;<1<<77	MF:i:18	Aq:i:63	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:155:807:19	83	seq2	867	99	35M	=	1074	242	AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG	<<<<<<<<<<<<<<<<9+<<<<<<9<<9;4<<<<:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:226:885:729	83	seq2	867	98	35M	=	1037	205	AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG	<<<;<<<<<<;<;<<<<<<<:;<<;4;%;<<;<<.	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:1:156:196	83	seq2	867	77	40M	=	1042	215	AAAAGGGATTAAATTCCCCCACTTAAGAGATATAGATTGG	<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<:;9:9	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:52:1144:509	147	seq2	867	99	35M	=	706	-196	AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG	<<<<:<<<<<<<<<<;::;:<;<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:73:735:329	83	seq2	868	99	35M	=	1035	202	AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA	================;==;====;=;=======;	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:11:801:386	147	seq2	868	97	35M	=	1061	228	AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA	<<<<<<<<<<8<<<<<:4<::<854:5<:::;4+4	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:4:150:94:843	83	seq2	868	75	35M	=	1050	217	AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA	<<<<<<<<7<<<6<<<<<<<<<<<6<<62<<<<<2	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:255:796:239	147	seq2	869	99	35M	=	692	-212	AAGGGATTAAATTCCCCCACTTAAGAGATAGAGAT	<<3;;<7:<<<;(7<<7;<<;<<<<<<<<<7<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:22	H0:i:0	H1:i:1
+B7_589:5:147:405:738	147	seq2	870	99	35M	=	1048	213	AGGGATTAAATTCCCCCACTTAAGAGATATAGATT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:33:357:858	83	seq2	870	99	35M	=	716	-189	AGGGATTAAATTCCCCCACTTAAGAGATATAGATT	<;<:<<<<<<<<<;<9<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:122:398:994	83	seq2	871	99	35M	=	708	-198	GGGATTAAATTCCCCCACTTAAGAGATATAGATTG	95:<9<<<<:9<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_105:2:146:374:692	147	seq2	874	99	35M	=	690	-219	ATTAAATTCCCCCACTTAAGAGATATAGATTGGCA	<4:<<<1:<:<::<<<;<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:119:428:415	147	seq2	876	99	36M	=	1037	197	TAAATTCCCCCACTTAAGAGATATAGATTGGCAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;<;;;	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:7:168:247:414	147	seq2	876	99	35M	=	698	-213	TAAATTCCCCCACTTAAGAGATATAGATTGGCAGA	,;;;,146<6;6<<8<<<<1<8<<<<<<<<<<;1<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:130:609:467	147	seq2	877	99	35M	=	728	-184	AAATTCCCCCACTTAAGAGATATAGATTGGCAGAA	===:2===;<====>==>=>=>=>>>==>>>=>>>	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:57:366:844	83	seq2	877	99	40M	=	708	-209	AAATTCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT	;;;7:8&555<,;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:3:236:475:254	147	seq2	880	99	35M	=	1051	206	TTCCCCCACTTAAGAGATATAGATTGGCAGAACAG	<<<<<<<<<<<<<<<<<<<<<<<<<:::<:;</;/	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:251:819:772	147	seq2	881	99	36M	=	726	-191	TCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT	6+7++1<<%<<<<<<<+<+<9<<99<9<<<<<<9<<	MF:i:18	Aq:i:59	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:36:481:1079	83	seq2	881	99	40M	=	707	-214	TCCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAA	:11+)*<4;<<<<<<<<<;;<<<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:29:411:1208	147	seq2	882	99	40M	=	698	-224	CCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAAA	766+6<996<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:62:1076:540	83	seq2	882	99	35M	=	1066	219	CCCCCACTTAAGAGATATAGATTGGCAGAACAGAT	<<<<<<<<<<;<<<<<<<<<<<<<<<<;;<<;<7;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:189:530:40	83	seq2	883	99	36M	=	698	-221	CCCCACTTAAGAGATATAGATTGGCAGAACAGATTT	883;<<<<<<<<<:<<<<<<<<3<;<<<<<<<<;<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:113:856:319	147	seq2	884	99	35M	=	1067	216	CCCACTTAAGAGATATAGATTGGCAGAACAGATTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:55:296:1457	83	seq2	884	99	35M	=	1061	212	CCCACTTAAGAGATATAGATTGGCAGAACAGATTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:15:881:1932	83	seq2	886	92	35M	=	1061	210	CACTTAAGAGATATAGATTGGCAGAACAGATTTAA	<<<<<<<<<<<<<<<;<<<<:<<<2<26<8<<;;.	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:116:157:612	147	seq2	889	99	35M	=	707	-217	TTAAGAGATATAGATTGGCAGTACAGATTTAAAAA	;;<<<<<<<<<<<<<<<<;<</<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+EAS114_28:7:215:863:521	83	seq2	890	99	36M	=	732	-194	TAAGAGATATAGATTGGCAGAACAGATTTAAAAACA	;<<<<<<<<<<<<<;<<;<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:254:572:431	147	seq2	891	97	35M	=	1048	192	AAGAGATATAGATTGGCAGAACAGATTTAAAAACA	<<<<<<<<<<<<<<<<;<<<<<<<<<<<99;;;;;	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:273:424:207	147	seq2	891	99	35M	=	1066	210	AAGAGATATAGATTGGCAGAACAGATTTAAAAACA	<,<,<9<<9<<<<<<<<<<79<,599,<191<99+	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:4:571:820	147	seq2	891	99	35M	=	1071	215	AAGAGATATAGATTGGCAGAACAGATTTAAAAACA	<<<<<<<<<<<9<<;9<;;;<;6;:<<<3:;;;:6	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:36:1231:1381	147	seq2	891	99	35M	=	708	-218	AAGAGATATAGATTGGCAGAACAGATTTAAAAACA	<<<<<<;<<<<<<<<<8<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:66:718:481	83	seq2	891	99	40M	=	1072	221	AAGAGATATAGATTGGCAGAACAGATTTAAAAACATGAAC	<<<<<<<<<<<<<<;<<<<<<<<;<<<<<<<;<<<:1:;:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:22:632:176	147	seq2	894	99	36M	=	1091	233	AGATATAGATTGGCAGAACAGATTTAAAAACATGAA	<<<<<;<<<<<<;<<;<:<<<:<<:<<<;<<<;;;:	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:271:180:509	147	seq2	896	99	35M	=	729	-202	ATATAGATTGGCAGAACAGATTTAAAAACATGAAC	<<<<<<<<<9<:<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:198:564:731	147	seq2	898	99	35M	=	1089	226	ATAGATTGGCAGAACAGATTTAAAAACATGAACTA	<<<<<;<<<<<<;<<:<<;9<<<<<<<<1;<<58<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:67:1467:1447	83	seq2	898	99	35M	=	722	-211	ATAGATTGGCAGAACAGATTTAAAAACATGAACTA	<<<<<::<<:<<<<:<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:172:827:592	83	seq2	899	99	35M	=	703	-231	TAGATTGGCAGAACAGATTTAAAAACATGAACTAA	8<<<<;7;7<<<<;<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:240:719:799	147	seq2	900	99	35M	=	720	-215	AGATTGGCAGAACAGATTTAAAAACATGAACTAAC	<:<<<<<:<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:24:1345:1627	73	seq2	900	78	35M	=	900	0	AGATTGGCAGAACAGATTTAAAAACATGAACTAAC	<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<8<3	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:24:1345:1627	133	seq2	900	0	*	=	900	0	NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	MF:i:-64
+EAS139_19:1:58:726:1746	147	seq2	900	99	40M	=	1061	201	AGATTGGCAGAACAGATTTAAAAACATGAACTAACTATAT	<<<<<<<<<<<<<<<<<<<6<<<<8<<<<<<<<:8:8:88	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:88:451:1773	147	seq2	902	99	35M	=	742	-195	ATTGGCAGAACAGATTTAAAAACATGAACTAACTA	973776;;;;;;;;;::;;;;;;;;;;;;;;3;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:178:187:610	147	seq2	903	99	35M	=	744	-194	TTGGCAGAACAGATTTAAAAACATGAACTAACTAT	66:,:<7<<<<<<<1<<<<<<<<<<<<<<<2<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:6:38:332:54	83	seq2	904	99	36M	=	737	-203	TGGCAGAACAGATTTAAAAACATGAACTAACTATAT	8;;&<;<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:210:674:911	147	seq2	904	99	35M	=	740	-199	TGGCAGAACAGATTTAAAAACATGAACTAACTATA	27;2<;<<5<<<<;;<<<<<;<<<<<<;<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:82:963:128	83	seq2	905	99	35M	=	719	-221	GGCAGAACAGATTTAAAAACATGAACTAACTATAT	585<;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:2:12:1335:1372	83	seq2	906	99	40M	=	721	-225	GAAGAACAGATTTAAAAACATGAACTAACTATATGCTGTT	:&;;;<*<<<9<<<<<<<<<<<<<<4<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS114_39:1:98:641:1040	147	seq2	907	99	35M	=	1085	213	CAGAACAGATTTAAAAACATGAACTAACTATATGC	<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:8:41:530:663	83	seq2	908	99	35M	=	730	-213	AGAACAGATTTAAAAACATGAACTAACTATATGCT	=8=;*=5==;;=====:=====;===;========	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:87:430:995	147	seq2	909	67	35M	=	731	-213	GAAAAGAGTTAAAAACATGAACTAACTATATGCTG	1<4%81<..1<<<<<0<<<<<0.<<9<<(<6<<6<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:17	H0:i:0	H1:i:1
+B7_595:3:85:964:950	147	seq2	910	99	35M	=	1095	220	AACAGATTTAAAAACATGAACTAACTATATGCTGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;:	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:8:68:570:705	83	seq2	910	99	35M	=	1100	225	AACAGATTTAAAAACATGAACTAACTATATGCTGT	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<8<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:198:503:669	83	seq2	912	99	35M	=	1107	230	CAGATTTAAAAACATGAACTAACTATATGCTGTTT	<<<<<<<<<<;8<<<<<;<<<<<<;<;<8<<8<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:273:545:1001	147	seq2	913	99	35M	=	1088	210	AGATTTAAAAACATGAACTAACTATATGCTGTTTA	<<<<<<<<<<<<<<<;;<<<<<<;<8;28<8;<<8	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:152:778:228	83	seq2	915	99	35M	=	739	-211	ATTTAAAAACATGAACTAACTATATGCTGTTTACA	<;;7=<<<<<<;<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:1:53:463:1132	147	seq2	915	99	40M	=	1109	234	ATTTAAAAACATGAACTAACTATATGCTGTTTACANGAAA	<<<<<<<<<<<<<<<<<<<<<;<<<8<<<<<<<8<!1488	MF:i:18	Aq:i:71	NM:i:1	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:12:630:707	147	seq2	915	99	35M	=	751	-199	ATTTAAAAACATGAACTAACTATATGCTGTTTACA	<:<<<<<<<;<<<<<9<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:179:119:876	147	seq2	917	60	35M	=	1112	230	TTAAAAACATGAACTAACTATATGCTGTTTACCAG	<<<<<<<7<<<<<<<8<<<6<<<<<<7<<<:0&<0	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:1
+EAS1_97:6:308:667:658	83	seq2	918	10	35M	=	1116	233	TAAAAACATGAACTAACTATATCCTTCTTACAATA	9<96<<<;<96<<9<51<<<<<1:9++<9*%4;*5	MF:i:18	Aq:i:10	NM:i:4	UQ:i:45	H0:i:0	H1:i:0
+EAS114_28:5:163:832:715	147	seq2	918	99	36M	=	1085	203	TAAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<0;<9<<<<<<<<<<<<9<<<<<<<<<<<<;;;<6	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:3:179:496:161	83	seq2	919	99	36M	=	756	-199	AAAAACATGAACTAACTATATGCTGTTTACAAGAAA	<<<<<9<<<<<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:8:13:325:483	147	seq2	919	99	35M	=	1101	217	AAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_103:7:139:578:951	147	seq2	919	98	35M	=	1095	211	AAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<0;;	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_108:8:19:929:765	83	seq2	919	98	35M	=	1069	185	AAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;77<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:5:214:644:390	147	seq2	919	72	35M	=	1082	198	AAAAACATGAACTAACTATATGCTGTTTACAAGAA	<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<;<;	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_30:6:243:209:110	83	seq2	920	48	35M	=	768	-187	AAAACATGAACTAACTATATGCTGTTTACAAGAAA	;<;;;:<:<:;<<;;<;<;<;7<<;<<;;<;<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:247:900:123	83	seq2	920	99	35M	=	1123	238	AAAACATGAACTAACTATATGCTGTTTACAAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;<;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS51_62:7:162:195:761	83	seq2	922	30	35M	=	767	-190	AACATGAACTAACTATATGCTGTTTACAAGAAACT	<<8<<:<<:<<<<<<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS1_103:2:184:980:396	147	seq2	923	99	35M	=	1092	204	ACATGAACTAACTATATGCTGTTTACAAGAAACTC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:2:162:272:415	83	seq2	923	83	35M	=	1112	224	ACATGAACTAACTATATGCTGTTTACAAGAAACTC	<<<<<<<<<<<<<<<<<<<<<<;<<<<<9;<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:184:237:476	147	seq2	925	99	35M	=	1101	211	ATGAACTAACTATATGCTGTTTACAAGAAACTCAT	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;<;;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:202:341:984	83	seq2	926	99	35M	=	1094	203	TGAACTAACTATATGCTGTTTACAAGAAACTCATT	=========================4;========	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:107:738:484	83	seq2	926	75	35M	=	1097	206	TGAACTAACTATATGCTGTTTACAAGAAACTCATT	<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:7:492:1088	147	seq2	926	57	35M	=	769	-192	TGAACTAACTATATGCTGTTTACAAGAAACTCATT	4;<<75<<::<:<<<-<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_11:1:81:1019:558	83	seq2	926	77	35M	=	760	-201	TGAACTAACTATATGCTGTTTACAAGAAACTCATT	<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:10:1312:1558	83	seq2	928	76	35M	=	771	-192	AACTAACTATATGCTGTTTACAAGAAACTCATTAA	<<:<<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:4:206:741:810	83	seq2	929	99	34M	=	753	-210	ACTAACTATATGCTGTTTACAAGAAACTCATTAA	<3<<;5<<<<<;:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:7:200:65:291	147	seq2	930	99	35M	=	728	-237	CTAACTATATGCTGTTTACAAGAAACTCATTAATA	;9<;3<<9<7<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:38:670:564	147	seq2	930	73	35M	=	770	-195	CTAACTATATGCTGTTTACAAGAAACTCATTAATA	3<<<3:<<<<<:;<<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:57:1114:2032	83	seq2	931	99	35M	=	1102	206	TAACTATATGCTGTTTACAAGAAACTCATTAATAA	<7<<<<<<<<<<<<<<<<<777<<<7<<<<<3<<7	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:125:137:58	83	seq2	932	76	35M	=	772	-195	AACTATATGCTGTTTACAAGAAACTCATTAATAAA	<<9;<<<<<;<;<<<<;<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:1:38:250:647	147	seq2	933	71	35M	=	1100	202	ACTATATGCTGTTTACAAGAAACTCATTAATAAAT	<<<<<<<9<<9<<<<<<<6<<<<<<<<<<8<779%	MF:i:18	Aq:i:0	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS192_3:6:116:464:261	83	seq2	934	99	35M	=	1107	208	CTATATGCTGTTTACAAGAAACTCATTAATAAAGA	<<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<;;8<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:168:69:249	147	seq2	936	99	35M	=	1125	224	ATATGCTGTTTACAAGAAACTCATTAATAAAGACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:246:647:765	147	seq2	937	99	35M	=	1119	217	TATGCTGTTTACAAGAAACTCATTAATAAAGACAT	;<<<<<<<<<;<&<<3+3<<<3<<9&</:/87</8	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:3:307:113:346	147	seq2	938	99	35M	=	1123	220	ATGCTGTTTACAAGAAACTCATTAATAAAGACATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<8	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:6:159:493:275	147	seq2	939	72	35M	=	760	-214	TGCTGTTTACAAGAAACTCATTAATAAAGACATGA	4949;<<<<<<<<<<<6<;<<<<;<<<<<*<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:257:288:731	83	seq2	939	99	34M	=	1131	227	TGCTGTTTACAAGAAACTCATTAATAAAGACATG	<<<<<<<<8<8<<;<;<<<;<<<5<;;88.8<6<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:231:815:626	147	seq2	940	99	35M	=	1119	214	GCTGTTTACAAGAAACTCATTAATAAAGACATGAG	<;<<<<9<<<<<<<<<<<<<<<<<;<<;5<<<;:;	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:93:77:1338	147	seq2	940	10	35M	=	1098	193	GCTGCTTACAAGAAGCGCATTAATAAAGACATGAG	<<<<*<2<<<:<4<&<6<8<4<::<8<<<<82;;7	MF:i:18	Aq:i:0	NM:i:3	UQ:i:35	H0:i:0	H1:i:0
+EAS114_45:2:54:1886:719	83	seq2	941	99	35M	=	1125	219	CTGTTTACAAGAAACTCATTAATAAAGACATGAGT	;;;9;;<;;;9;;;;;:;<9;:;;;;9;;;99799	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:94:273:165	83	seq2	945	99	35M	=	1128	218	TTACAAGAAACTCATTAATAAAGACATGAGTTCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;:7	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:5:32:461:154	147	seq2	945	71	35M	=	769	-211	TTACAAGAAACTCATTAATAAAGACATGAGTTCAG	;;</<<<<<;:<.<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:303:131:673	147	seq2	947	99	36M	=	1112	201	ACAAGAAACTCATTAATAAAGACATGAGTTCAGGTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:10:106:737	147	seq2	947	99	35M	=	1106	194	ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT	<<<;<1<;<<<<<<9<<<<;;<<<<<99<<94008	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:214:950:32	147	seq2	947	99	35M	=	1132	220	ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT	>>=>>>>==>=>>>==>=>=:=====;=:=6:::6	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:10:686:1024	147	seq2	947	99	35M	=	1103	191	ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT	<:<<<<:<<<<<<<<<<:<:<<<<<<<<<<<5<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:53:61:31	147	seq2	949	99	35M	=	1122	208	AAGAAACTCATTAATAAAGACATGAGTTCAGATAA	<<<7;<7<<<;7<;;<7<7<7<;5<73<<</%;/;	MF:i:18	Aq:i:66	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS114_28:6:185:87:475	83	seq2	949	99	36M	=	786	-199	AAGAAACTCATTAATAAAGACATGAGTTCAGGTAAA	<<4<<<+<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:235:899:847	83	seq2	950	99	35M	=	1112	197	AGAAACTCATTAATAAAGACATGAGTTCAGGTAAA	<<3<;<<<<<<<<<;;<<<<<<<+<<<+6<8<3/<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:193:661:771	147	seq2	952	99	35M	=	1129	212	AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG	<<<<<<<<<;<<<;;;<<<<<;<<<=;<:;5:9::	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:113:408:211	147	seq2	952	99	35M	=	789	-198	AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG	<:;:;:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:8:24:718:322	83	seq2	953	23	35M	=	779	-209	AACTCATTAATAATGTCATGAGTTCAGGTAAAGGG	5:+:0;**&+<00&<&<<<5<28<<;;<83<<<<<	MF:i:18	Aq:i:23	NM:i:2	UQ:i:10	H0:i:0	H1:i:0
+EAS56_61:5:263:314:696	147	seq2	953	99	35M	=	1117	199	AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG	<<<<<<<<<<<<<<;<<<<<<<<<<<<:<<;<775	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:93:312:331	147	seq2	953	99	35M	=	1145	227	AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:3:181:93:694	83	seq2	954	99	35M	=	783	-206	ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG	<4;8<<+<<:<<<<<<<<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:238:803:383	147	seq2	954	75	35M	=	779	-210	ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG	;;<;;<<<<<<<<<<<<<<<<;:<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:44:77:1255	147	seq2	955	99	35M	=	1113	193	CTCATTAATAAAGACATGAGTTCAGGTAAAGGGGT	;;;;;;;8;;;7;8;;;;;;;;;;886;;;76777	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:232:364:583	147	seq2	956	71	35M	=	780	-211	TCATTAATAAAGACATGAGTTCAGGTAAAGGGGTG	;%;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:256:354:173	147	seq2	957	99	36M	=	1121	200	CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:4:138:211:582	147	seq2	957	99	35M	=	788	-204	CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG	:<8;<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:61:631:567	83	seq2	957	99	35M	=	1131	209	CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:56:1757:1319	83	seq2	957	67	35M	=	775	-217	CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG	&7778<<<<<8<;<<:::;<:<4<<:<:;8<8<;<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:7:154:26:712	147	seq2	959	99	35M	=	786	-208	TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:10:975:766	147	seq2	959	99	35M	=	1166	242	TTAATAAAGACATGAGTTCAGGTAAAGGGGTGAAA	<<<<<<<<;<<<<;<:<<;<6;;<<<:6-:+1+;;	MF:i:18	Aq:i:64	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS54_73:5:220:733:736	83	seq2	959	99	35M	=	1143	219	TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<5<<;9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:46:1566:668	147	seq2	959	99	35M	=	1148	224	TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:7:59:871:351	83	seq2	963	99	35M	=	808	-190	TAAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAG	;<<<<<:<;<<<4;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:46:522:426	83	seq2	964	99	35M	=	807	-192	AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA	<<<<<:<<<<<<1/<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:157:876:302	83	seq2	964	99	35M	=	801	-198	AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA	===:=8=;==:892=,28==88==28====8=;;8	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:61:1369:440	83	seq2	964	47	35M	=	770	-229	AAAGACATGATTTCAGGTAAAGGGGTGGAAAAAGA	<<<<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+EAS221_1:6:57:1342:1166	147	seq2	964	99	35M	=	796	-203	AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA	<<<<<;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:310:287:420	147	seq2	965	99	35M	=	794	-206	AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT	<<<<;<;<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:262:53:888	83	seq2	965	99	35M	=	787	-213	AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:3:542:428	83	seq2	965	99	35M	=	797	-203	AAGACATGAGTTCAGGTACAGGGGTGGAAAAAGAT	<<876</3<8874:<8:<)<5<<<;<<<<7<<<:<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:8	H0:i:0	H1:i:1
+B7_593:2:81:435:410	147	seq2	966	99	36M	=	782	-220	AGACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT	;<;;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:29	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:3:85:219:371	83	seq2	967	99	35M	=	817	-185	GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT	<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:116:966:193	83	seq2	967	99	35M	=	815	-187	GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT	===================================	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:30:432:228	147	seq2	967	99	35M	=	1145	213	GACATGAGTTCAGGGAAAGGGGTGGAAAAAGATGT	<<<<<<<<<<<<<<8<<<<<<<<<<<<:<<<<<;;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:23	H0:i:0	H1:i:1
+B7_610:1:12:88:200	147	seq2	968	99	35M	=	1133	200	ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT	<<<<<<<<<<<;<<<<<<<;<<<:<<<<<<9<<5<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:2:313:711:530	83	seq2	968	99	35M	=	784	-219	ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT	<7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:74:866:49	147	seq2	969	99	35M	=	1143	209	CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC	====================9==91==<=6==;:=	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:7:248:17:435	83	seq2	969	99	35M	=	1139	205	CATGAGTTCAGGAAAAGGGGTGGAAAAAGATGTTC	<<<<8<<<888<+<<<<<;<:<<<<8<<<<<;3<3	MF:i:18	Aq:i:43	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+EAS114_30:1:188:863:790	83	seq2	969	98	35M	=	783	-221	CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC	;<7<<<55<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:75:1503:1399	147	seq2	969	99	40M	=	1130	201	CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC	<<<<<<<<<<<<<<<<<<9<<<;<<<<<<;<<<<:::711	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:2:56:155:49	83	seq2	970	99	35M	=	1145	210	ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT	<<<<<<<<<<<<<<<<<<<<<<;<<;<<<;<9<9;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_4:5:295:547:216	83	seq2	970	99	35M	=	809	-196	ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:4:262:928:237	147	seq2	971	99	35M	=	787	-219	TGAGTTCAGGTAAAGGTGTGGAAAAAGATGTTCTA	;<<<<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS219_1:1:50:257:341	83	seq2	971	99	35M	=	813	-193	TGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:1:122:38:103	83	seq2	972	79	35M	=	778	-229	GAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTAC	===;3<===:=======<=================	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:82:670:302	83	seq2	973	99	35M	=	1146	208	AGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:8:24:415:944	147	seq2	974	99	35M	=	805	-204	GTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC	<;;<<<<:<<<<<<<;<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:7:108:440:208	83	seq2	975	99	35M	=	1142	202	TTCAGGTAAAGGGGAGGAAAAAGATGTTCTACGCA	<<<;<<<<<<<<<</<<<<;<<<;<<;<;<64/:+	MF:i:18	Aq:i:43	NM:i:1	UQ:i:14	H0:i:0	H1:i:1
+B7_595:3:229:543:583	83	seq2	976	99	35M	=	1139	198	TCAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAA	<<<<<<<<<<8<8<9<<<<8<<588<<<<*<2:2*	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:142:353:398	83	seq2	977	99	35M	=	807	-205	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA	===================================	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:102:543:160	83	seq2	977	99	35M	=	825	-187	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA	9==9=====;=====================<===	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:191:40:536	147	seq2	977	66	35M	=	1167	225	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA	<<<<<<<<8<<;<<8<<;<;;<<8<<<<<</<74/	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:272:328:400	147	seq2	977	99	35M	=	1151	209	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA	<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<7<;:7	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:69:1593:819	83	seq2	977	99	40M	=	786	-231	CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA	);::7<<<<:;<<<<<<<<<<<<<<<9<<9<3<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_597:3:133:707:886	83	seq2	978	99	35M	=	1146	203	AGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAAC	<<<<7;<<<<<<<<<;<<<<<<<<<<<<<5<;66<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_591:4:92:411:955	83	seq2	979	99	36M	=	1149	206	GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_61:8:60:358:494	83	seq2	979	44	35M	=	1179	235	GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<:<:<<;;4;	MF:i:18	Aq:i:14	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_597:7:41:34:211	147	seq2	980	99	35M	=	1164	219	GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3:;5;	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:40:1291:1045	83	seq2	980	99	35M	=	1167	222	GTAAAGGGGTGGAAAAAGATGTTCTACGCAACAAG	<<<<<<<<<5<<5<<<<7<<<<<<<<<5<9<&%73	MF:i:18	Aq:i:39	NM:i:2	UQ:i:9	H0:i:1	H1:i:0
+EAS218_1:8:90:706:1276	83	seq2	980	99	35M	=	814	-201	GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG	<;<<<<<<<;<<<<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_32:4:5:396:292	147	seq2	981	99	35M	=	1155	209	TAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGA	<<<<<<<<<<<<<<;;<<<<:<<<<;;<;;3/&+8	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:2:176:653:957	83	seq2	982	82	35M	=	819	-198	AAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA	===::=============<==<====<========	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS54_71:6:264:705:89	83	seq2	983	99	34M	=	1155	207	AAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA	<<<<<<<<<<;8<<<<<<<<<<<<<<<&<<,;;(	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:2:66:757:918	147	seq2	985	99	35M	=	1143	193	GGGGTGGAAAAAGATGTTCTACGCAAACAGAAACC	===================================	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:7:114:506:971	147	seq2	986	99	35M	=	1150	199	GGGTGGAAAAAGATGTTCTACGCAAACAGAAACCA	===================================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:220:809:850	83	seq2	986	60	35M	=	1187	236	GGGGGGAAAAAGATGTGCTACACAAAAAGATTCCA	<<;7;<<0::8<-6:<0624-*<&-93-,8+(&08	MF:i:-126	Aq:i:60	NM:i:4	UQ:i:64	H0:i:0	H1:i:0
+B7_589:7:76:306:561	83	seq2	987	89	35M	=	794	-228	GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA	9<7<<9<<<<<<7<<71<71*7<<<<<<<<<<1<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS192_3:6:235:505:553	83	seq2	987	99	35M	=	808	-214	GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA	;8518<<<<<;<;<<<;<<;<.<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:19:695:59	147	seq2	988	99	36M	=	826	-198	GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAAT	;+;8<<<<<<<<<<<5<<+<:<<;<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:5:136:260:254	147	seq2	988	99	35M	=	813	-210	GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA	;:;;<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:5:266:133:789	147	seq2	988	99	35M	=	810	-213	GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA	9;;<<<<<<<<<<<<5<<;<5<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_591:4:159:508:571	147	seq2	989	84	36M	=	834	-191	TGGAAAAAGATGTTCTACGCAAACAGAAACCAAATG	9<6<<<<<<<<<<<;<<;<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:166:84:766	147	seq2	990	99	35M	=	1167	212	GGAAAAAGATGTTCTACGCAAACAGAAACCAAATG	<<<<<<<<;<<<<<<<<;<<<<<<;<<<7<;::93	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_61:6:283:963:234	83	seq2	992	99	35M	=	1157	200	AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG	<<<<<<<<<<<<<<<;<<<<<<<<<<<;<<;<<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:4:184:659:377	83	seq2	992	99	35M	=	1173	216	AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:305:707:258	147	seq2	992	58	36M	=	831	-197	AAAAAGATGTTCTACGCAAGCAGAAACCAAATGAGA	3<<7<,;<<<<0<66<6+<%<<<.<<<<<<<<<9<<	MF:i:18	Aq:i:17	NM:i:1	UQ:i:4	H0:i:0	H1:i:1
+EAS219_1:7:20:1444:328	83	seq2	993	99	35M	=	1149	191	AAAAGATGTTCTACGCAAACAGAAACCAAATGAGA	<<<<;<<<<<<<<;<<<<<<<<;<<<<<;<;;8:7	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:157:447:758	147	seq2	994	99	36M	=	833	-197	AAAGATGTTCTACGCAAACAGAAACCAAATGAGAGA	<<<;<<5<</<<6<5<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:37:763:1437	147	seq2	994	99	35M	=	1191	232	AAAGATGTTCTACGCAAACAGAAACCAAATGAGAG	;;;;;6;;;;;;;;;:;6;5;5;;;;;76;767/7	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:94:1273:1462	147	seq2	995	99	35M	=	1166	206	AAGATGTTCTACGCAAACAGAAACCAAATGAGAGA	<<<<<<<<<<<<:<<<<<<<<:<<<<:6:7;744;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:7:74:213:877	147	seq2	996	99	35M	=	816	-215	AGATGTTCTACGCAAACAGAAACCAAATGAGAGAA	<<<<<<<&<<-<-<<<7<<<<<77<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:2:168:61:867	147	seq2	997	99	35M	=	1188	226	GATGTTCTACGCAAACAGAAACCAAATGAGAGAAG	====7====================7======6==	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:307:252:632	147	seq2	998	99	35M	=	1142	179	ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<;;	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:37:604:389	83	seq2	998	99	35M	=	1188	225	ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG	<<<<<<<<<3<<<<<4<<<<<9<2;949<;35:95	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:147:687:428	83	seq2	998	99	35M	=	1159	196	ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:3:114:736:433	83	seq2	998	63	35M	=	832	-201	ATGTTCTACGCAAACAGAAACCAAGTGAGAGAAGG	<9<9+9;<6<9<<;9<<<<<;<<<99<<<<<<<<<	MF:i:18	Aq:i:18	NM:i:1	UQ:i:24	H0:i:0	H1:i:1
+B7_597:8:35:118:589	147	seq2	999	99	35M	=	1188	224	TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA	<<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<<9	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:2:127:288:655	83	seq2	999	99	35M	=	803	-231	TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA	<<:<3<<:<.<<<;<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:260:827:289	83	seq2	999	99	35M	=	836	-198	TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA	6;99+<<<<<<<<<<<<<<6<<<<<7<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:82:843:1838	147	seq2	999	99	35M	=	804	-230	TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA	888829;;;;;;;;;;;;;;:;;;;;;;;;;;;;;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:8:64:350:174	147	seq2	1000	99	35M	=	1166	201	GTTCTACGCAAACAGAAACCAAATGAGAGAAGGAG	<<<<<<<<<<<<<<<<<<<<<:<<<<<6<<<<<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:2:8:327:522	83	seq2	1001	99	35M	=	826	-210	TTCTACGCAAACAGAAACCAAATGAGAGAAGGAGT	;;4;<-<-<<<7<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:7:126:361:250	147	seq2	1002	99	35M	=	810	-227	TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA	72:;7</<<<:<-7<<:<<<<<<<:<6<+:<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:189:571:366	147	seq2	1002	99	35M	=	1194	227	TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA	<<<<<<<<<<<<<<<<<<<<<<<<<7<:<<99;;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:202:275:776	147	seq2	1002	99	36M	=	1196	230	TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTAG	<<<<<<<<<<<<<<<<<<<<<;<<9<;;<<<;<;<;	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:194:998:663	147	seq2	1002	99	35M	=	1165	198	TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA	<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<8<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:30:599:589	83	seq2	1003	99	36M	=	1188	221	CTACGCAAACAGAAACCAAATGAGAGAAGGAGCAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;<&<<;	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS112_34:4:92:412:435	83	seq2	1003	89	35M	=	1184	216	CTACGCAAACAGAAACCAANTGAGAGAAGGAGTAG	<<<<<<<4<<<<<<<<<66!<<<<<<6<<77<<97	MF:i:18	Aq:i:43	NM:i:1	UQ:i:0	H0:i:0	H1:i:1
+B7_610:2:75:887:149	83	seq2	1004	99	35M	=	823	-216	TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC	:<:<0<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:2:1422:1820	147	seq2	1004	99	35M	=	1164	195	TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC	;7;;;;;;;;:;;;;;;;;;;;;;;;;;;;77777	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:90:561:850	83	seq2	1004	85	35M	=	827	-212	TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC	78376<;;9<;<<;:9<<<6;<;<;;8;;<;/;;;	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:4:164:719:947	147	seq2	1005	99	35M	=	813	-227	ACGCAAACAGAAACCAAATGAGAGAAGGAGTAGCT	===,=========6====)================	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:5:154:952:558	83	seq2	1007	99	35M	=	1173	201	GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<:<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:58:923:1915	83	seq2	1007	99	40M	=	846	-201	GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA	:+;;;8<<<<<<,<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:253:175:31	83	seq2	1008	72	35M	=	1187	214	CAAACAGAAACCAAATGAGAGAAGGAGTAGCTATA	<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<:<;;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:2:29:729:70	83	seq2	1009	51	35M	=	850	-194	AAACAGAAACCAAATGAGAGAAGGAGTAGCTATAC	<<<:<<<<<<7<<<<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:174:157:573	147	seq2	1012	99	35M	=	1191	214	CAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:7:197:399:319	147	seq2	1012	99	35M	=	1189	212	TAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA	+<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;;<<;	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_65:7:68:825:405	83	seq2	1015	30	35M	=	835	-215	AAACCAAATGAGAGAAGGAGTAGCTATACTTATAT	<<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:13:701:55	83	seq2	1015	99	36M	=	1187	208	AAACCAAATGAGAGAAGGAGTAGCTATACTTATATC	<<<<<<<<<9<<<9<<<<<<6<<<<<<<6<<6<<6+	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:128:555:941	153	seq2	1016	10	36M	*	0	0	AACCAAAAGAGAGAAGGAGTAGTTATACACATATCA	55--555560355$55555555.57757$7555577	MF:i:32	Aq:i:10	NM:i:4	UQ:i:58	H0:i:0	H1:i:0
+EAS219_FC30151:1:53:140:421	147	seq2	1016	99	35M	=	1185	204	AACCAAATGAGAGAAGGAGTAGCTATACTTATATC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:1:64:526:339	83	seq2	1019	96	35M	=	819	-235	CAAATGAGAGAAGGAGTATCTATACTTATATCAGA	3<<<7<<;<<<<<<<<<<<;<<<<;<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS192_3:3:194:378:230	147	seq2	1022	99	35M	=	1198	211	ATGAGAGAAGGAGTAGCTATACTTATATCAGATAA	<<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:45:239:851	147	seq2	1023	61	35M	=	1211	223	TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA	<<88;<208<9<;6<<<6269;94<&401-662&2	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:39:956:676	147	seq2	1023	99	35M	=	1191	203	TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA	;;;;;;;;;;;;9;;;;;;;;;;;;;;;9957777	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:15:1763:1143	83	seq2	1023	99	35M	=	1193	205	TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:309:109:987	147	seq2	1024	99	35M	=	1194	205	GAGAGAAGGAGTAGCTATACTTATATCAGATAAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<;<;;;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_593:3:102:856:670	147	seq2	1025	99	36M	=	836	-225	AGAGAAGGAGTAGCTATACTTATATCAGATAAAGCA	;;<<<<:<<<:<<4<<<<<<<<;<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+B7_610:6:107:252:533	147	seq2	1025	60	35M	=	1173	183	AGAGAAGGAGTAGCTATACTTATATCAGATAAAGC	<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:3	H1:i:3
+EAS56_65:4:126:966:514	83	seq2	1027	99	35M	=	865	-197	AGAAGAAGTAGCTATACTTATATCAGATAAAGCAC	<4<<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:4	H0:i:1	H1:i:1
+EAS114_26:1:171:527:247	147	seq2	1027	67	35M	=	1194	202	AGAAGGAGTAGCTAGACTTATATCAGATAAAGCAC	=4==4===8==99=&=8+9=19+.2.6'=99+999	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:0	H1:i:3
+EAS1_105:1:234:185:359	147	seq2	1029	46	35M	=	1183	189	AAGGAGTAGCTATACTTATATCAGATAAAGCACAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;9--:	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:11
+EAS51_66:3:155:375:623	83	seq2	1029	99	35M	=	849	-215	AAGGAGTAGCTATACTTATATCAGATAAAGCACAC	;;;;<<:<<<<;<<;<<<<<<;<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_19:5:4:939:2021	147	seq2	1031	99	40M	=	1197	206	GGAGTAGCTATACTTATATCAGATAAAGCACACTTTAAAT	<<<<<<<<<<<<<<<<<<<<<97<<<;<<;<7;<<:48::	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:2
+EAS220_1:2:50:513:882	147	seq2	1031	99	35M	=	1192	196	GGAGTAGCTATACTTATATCAGATAAAGCACACTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:2	H1:i:14
+EAS1_103:5:188:20:592	147	seq2	1032	95	35M	=	1202	205	GAGTAGCTATACTTATATCAGATAAAGCACACTTT	<<<<<<<<<<<<<<<<<<<<;;<<<<:<<<;<;;<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:3	H1:i:16
+EAS114_45:3:35:896:1588	147	seq2	1032	91	35M	=	1205	208	GAGTAGCTATACTTATATCAGATAAAGCACACTTT	;;;;;;;;;;;;;;;;;;;;8;;;;;8;;;88989	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:3	H1:i:18
+EAS1_108:6:73:735:329	147	seq2	1035	99	35M	=	868	-202	TAGCTATACTTATATCAGATAAAGCACACTTTAAA	;;;9;<<7<<<<<<<<<<<<<<<<<<<2<<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:7:133:514:754	83	seq2	1036	63	36M	=	855	-217	AGCTATACTTATATCAGATAAAGCACACTTTAAATC	;;4;<;<;<<<<<<<<;<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS218_1:4:62:561:531	147	seq2	1036	99	35M	=	1203	202	AGCTATACTTATATCAGATAAAGCACACTTTAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_593:6:119:428:415	83	seq2	1037	99	36M	=	876	-197	GCTATACTTATATCAGATAAAGCACACTTTAAATCA	84<<<<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_30:2:226:885:729	147	seq2	1037	98	35M	=	867	-205	GCTGAACTTACATCAGATAAAGCACACTTTAAATC	/*220%.(;<%<3.<<<4<<<<86;<8<<8<<<<<	MF:i:18	Aq:i:30	NM:i:3	UQ:i:36	H0:i:0	H1:i:1
+EAS1_108:1:189:863:213	147	seq2	1039	99	35M	=	1202	198	TATACTTATATCAGATAAAGCACACTTTAAATCAA	<<<<<<<<<<<<<<<<<<<<;<<<;<<<<;7<9;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_597:4:146:961:63	83	seq2	1041	86	35M	=	861	-215	TACTTATATCAGATAAAGCACACTTTAAATCAACA	7;;<<<<<;<<<7<<<<<<<<;;<<;<;<<;<<<7	MF:i:18	Aq:i:37	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:68:996:104	83	seq2	1041	70	35M	=	1214	208	TACTTATATCAGATAAAGCACACTTTAAATCAACA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:47:1791:444	147	seq2	1041	74	35M	=	1213	207	TACTTATATCAGATAAAGCACACTTTAAATCAACA	;3;;;;;;;;;;;;;;;;;;;;;;;;;;;877977	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:4:1:156:196	147	seq2	1042	77	40M	=	867	-215	ACTTATATCAGATAAAGCACACTTTAAATCAACAACAGTA	:::::<<<<<<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:70:1349:1788	147	seq2	1043	99	35M	=	1203	195	ATTATATCAGATAAAGCACACTTTAAATCAACAAC	&<8<<<85:580;<:0-><;>588>9<>7:<0<9;	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_589:2:30:644:942	83	seq2	1045	83	35M	=	1229	219	TATATCAGATAAAGCACACTTTAAATCAACAACAG	<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<9;<9<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+B7_591:2:123:924:645	83	seq2	1045	84	36M	=	861	-220	TATATCAGATAAAGCACACTTTAAATCAACAACAGT	;<<<<*<<<<<<</7<2<8<<<<<<<4<<<<<<<<<	MF:i:18	Aq:i:11	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+B7_589:5:147:405:738	83	seq2	1048	99	35M	=	870	-213	ATCAGATAAAGCACACTTTAAATCAACAACAGTAA	<9/<:<<<<<<<<7</<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_61:3:155:758:710	83	seq2	1048	98	35M	=	859	-224	ATCAGATAAAGCACACTTTAAATCAACAACAGTAA	=46=4=5===:========:=7=7======11===	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_73:7:254:572:431	83	seq2	1048	97	35M	=	891	-192	ATCAGATAAAGCACACTTTAAATCAACAACAGTAA	<63<;<;<<<:7<:<7;<:<<<<:<<<<7<<<<:<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_57:7:33:954:724	147	seq2	1049	97	35M	=	1210	196	TCAGATAAAGCACACTTTAAATCAACAACAGTAAA	;<<<<<<<<<<<<<8<<<<:<;;<<;;<;<<;;;;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_63:6:102:816:260	83	seq2	1049	99	35M	=	1225	211	TCAGATAAAGCACACTTTAAATCAACAACAGTAAA	<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;;;;	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS192_3:5:197:914:256	83	seq2	1049	97	35M	=	1204	190	TCAGATAAAGCACACTTTAAATCAACAACAGTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8;:::	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_65:4:150:94:843	147	seq2	1050	0	35M	=	868	-217	CAGATACATCCCACTTTAAATCAACCACAGTAAAA	4<9<41*747*7<:9<:7:::<72;+<;::<7<<<	MF:i:18	Aq:i:0	NM:i:4	UQ:i:47	H0:i:0	H1:i:0
+EAS1_108:5:321:712:224	147	seq2	1051	58	35M	=	1220	204	AGATAAAGCACACTTTAAATCAACAACAGAAAAAT	<<<<<<<<2<<<<<<<<<<<<<<<:<<<<(<<:<,	MF:i:18	Aq:i:28	NM:i:1	UQ:i:7	H0:i:1	H1:i:2
+EAS114_32:3:236:475:254	83	seq2	1051	99	35M	=	880	-206	AGATAAAGCACACTTTAAATCAACAACAGTAAAAT	<:<<<<<;9<7<;<<<<<<<<<<9<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:72:1288:1211	83	seq2	1052	84	35M	=	1235	218	GATAAAGCACACTTTAAATCAACAACAGTAAAATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_65:2:264:157:150	83	seq2	1054	30	35M	=	1238	219	TAAAGCACACTTTAAATCAACAACAGTAAAATAAA	<<<<<<9<9<<<<.9;<<9&<97<;9933309605	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS1_95:7:310:800:761	147	seq2	1055	99	35M	=	1249	229	AAAGCACACTTTAAATCAACAACAGTAAAATAAAA	===========================+=======	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:88:465:1877	83	seq2	1055	99	35M	=	1212	192	AAAGCACACTTTAAATCAACAACAGTAAAATAAAA	<<<<<<<<<<;<<<<<<<<<<<<<<<<7<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:66:891:294	147	seq2	1057	99	35M	=	1233	211	AGCACACTTTAAATCAACAACAGTAAAATAAAACA	<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:3:100:735:530	147	seq2	1058	99	35M	=	1257	234	GCACACTTTAAATCAACAACAGTAAAATAAAACAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:68:440:424	83	seq2	1060	99	35M	=	1237	212	ACACTTTAAATCAACAACAGTAAAATAAAACAAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS220_1:8:66:1046:167	83	seq2	1060	99	35M	=	1241	216	ACACTTTAAATCAACAACAGTAAAATAAAACAAAG	<<<<<:<<<<<<<<<<<<<9<;77<9<7<<;<9;-	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_81:6:11:801:386	83	seq2	1061	97	35M	=	868	-228	CACTATAAATCAACAACAGTAAAATAAAACAAAGG	5<2:$6<<<38<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:3	H0:i:1	H1:i:1
+EAS114_28:2:141:7:963	147	seq2	1061	85	36M	=	1240	215	CACTTTAAATCAACAACAGTAAAATAAAACAAAGGA	<<<<<<<<<<<<;<:<<<<<<1<<&<;<;<<;,<;5	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:2:55:296:1457	147	seq2	1061	99	35M	=	884	-212	CACTTTAAATCAACAACAGTAAAATAAAACAAAGG	-<%63<<<<<1<<<<<5<<<<<<<<<<<<<<<7<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_19:1:58:726:1746	83	seq2	1061	99	40M	=	900	-201	CAATTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTC	&:&::;<<<76<<:<<6<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS221_1:8:15:881:1932	147	seq2	1061	92	35M	=	886	-210	CACTTTAAATCAACAACAGTAAAATAAAACAAAGG	)<4<<<<<<<4<<4<<4<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_95:5:284:212:932	83	seq2	1063	10	35M	=	1257	229	CTTTAAATCAACAACAATAAAAAAAAACAAAGGAG	<<9<<<<<<<<<<<<<&&<<<<5<<<<8<<<1:<:	MF:i:18	Aq:i:0	NM:i:2	UQ:i:25	H0:i:0	H1:i:0
+EAS139_19:4:18:1335:1514	83	seq2	1063	99	40M	=	1235	212	CTTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTCAT	<<<;<<<<<<<<<<<<<<<;<:<<;<<<<<<;<;<;;;9;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:273:424:207	83	seq2	1066	99	35M	=	891	-210	TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:62:1076:540	147	seq2	1066	99	35M	=	882	-219	TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC	6<<;:+=====5=:6===================2	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:113:856:319	83	seq2	1067	99	33M	=	884	-216	AAATCAACAACAGTAAAATAAAACAAAGGAGGT	<<<77<<:<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:8:19:929:765	147	seq2	1069	98	35M	=	919	-185	ATCAACAACAGTAAAATAAAACAAAGGAGGTCATC	<3+<<;<<;<<<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:88:54:900	147	seq2	1069	68	35M	=	1257	223	ATCAACAACAGAAAAATAAAACAAAGGAGGTCATC	.....&.....,.......................	MF:i:18	Aq:i:19	NM:i:1	UQ:i:11	H0:i:0	H1:i:1
+EAS56_63:7:109:22:383	147	seq2	1071	99	35M	=	1244	208	CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<;<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:8:4:571:820	83	seq2	1071	99	35M	=	891	-215	CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT	&<<7<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:255:441:47	83	seq2	1072	99	35M	=	1237	200	AACAACAGTAAAATAAAACAAAGGAGGTCATCATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<;:<;<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:3:66:718:481	147	seq2	1072	99	40M	=	891	-221	AACAACAGTAAAATAAAACAAAGGAGGTCATCATACAATG	::5::1<;;<<<<<<1<<<<<<<<<<<<7<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:155:807:19	147	seq2	1074	99	35M	=	867	-242	CAACAGTAAAATAAAACAAAGGAGGTCATCATACA	:==4=5:====:============:==========	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:43:1229:1855	147	seq2	1074	99	35M	=	1244	205	CAACAGTAAAATAAAACAAAGGAGGTCATCATACA	<<<<<<<<<<<<<<<<<<<<<<<<<4<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:125:875:553	83	seq2	1075	99	36M	=	1233	194	AACAGTAAAATAAAACAAAGGAGGTCATCATACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<;	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:118:775:467	147	seq2	1075	99	35M	=	1245	205	AACAGTAAAATAAAACAAAGGAGGTCATCATACAA	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:301:161:195	83	seq2	1076	75	35M	=	1239	198	ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT	<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:54:695:952	83	seq2	1076	99	35M	=	1264	223	ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:77:589:741	147	seq2	1078	99	35M	=	1263	220	AGTAAAATAAAACAAAGGAGGTCATCATACAATGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:200:263:280	147	seq2	1078	99	35M	=	1236	193	AGTAAAATAAAACAAAGGAGGTCATCATACAATGA	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;8<;1	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:64:199:1288	83	seq2	1079	77	35M	=	1240	196	GTAAAATAAAACAAAGGAGGTCATCATACAATGAT	<<<<<<<<<<<<<<;<<<<<<<<<<<<<<;<<<;<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:27:228:31	83	seq2	1082	99	35M	=	1264	217	AAATAAAACAAAGGAGGTCATCATACAATGATAAA	<<<<<<<<<<<<<<<<<;9<:;<<<<<<75<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:214:644:390	83	seq2	1082	72	35M	=	919	-198	AAATAAAACAAAGGAGGTCATGATACAATGATAAA	<<<;<<<<<<<<<<<<<<<<<&<<<<<<<<<<<<<	MF:i:18	Aq:i:27	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS114_45:2:79:554:354	83	seq2	1082	63	35M	=	1242	195	AAATAAAACAAAGGAGGTCATCATACAATGATAAA	17;<;;+<<;;;;93;;:;3;;;;1;;;;<77744	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:303:542:924	147	seq2	1083	76	35M	=	1242	194	AATAAAACAAAGGAGGTCATCATACAATGATAAAA	<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:8:26:242:35	83	seq2	1084	99	35M	=	1251	202	ATAAAACAAAGGAGGTCATCATACAATGATAAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:5:163:832:715	83	seq2	1085	99	36M	=	918	-203	TAAAACAAAGGAGGTCATCATACAATGATAAAAAGA	;<<<<9<<<<<<<<;;<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:1:98:641:1040	83	seq2	1085	99	35M	=	907	-213	TAAAACAAAGGAGGTCATCATACAATGATAAAAAG	4<<<<7<<<<<<<<<:<<;<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:32:562:1695	83	seq2	1085	76	35M	=	1258	208	TAAAACAAAGGAGGTCATCATACAATGATAAAAAG	<<<<<<<<<<<<<<8<<<<<:<<<<<<<:<8<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:6:758:988	147	seq2	1087	99	35M	=	1253	201	AAACAAAGGAGGTCATCATACAATGATAAAAAGAT	3+;0;0;;;0;;;;;;5;;;9;;;;90;;;57560	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:5:273:545:1001	83	seq2	1088	99	35M	=	913	-210	AACAAAGGAGGTCATCATACAATGATAAAAAGATC	<7(<<72;<2;27<;:<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:74:656:272	147	seq2	1088	99	35M	=	1245	192	AACAAAGGAGGTCATCATACAATGATAAAAAGATC	<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:198:564:731	83	seq2	1089	99	35M	=	898	-226	ACAAAGGAGGTCATCATACAATGATAAAAAGATCA	<6<;<<<<<<:7<<;<<<8<<+<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:6:23:885:274	83	seq2	1089	99	35M	=	1289	235	ACAAAGGAGGTCATCATACAATGATAAAAAGATCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<;;<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:22:632:176	83	seq2	1091	99	36M	=	894	-233	AAAGGAGGTCATCATACAATGATAAAAAGATCAATT	<9<<<<<<<-;<;<<7;6;<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:184:980:396	83	seq2	1092	99	35M	=	923	-204	AAGGAGGTCATCATACAATGATAAAAAGATCAATT	<<;;<77;;<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:110:984:98	83	seq2	1092	99	36M	=	1270	214	AAGGAGGTCATCATACAATGATAAAAAGATCAATTC	98<<<<<<2<<<<<<;;<;;<<<5;5;<<;;<<<<+	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:1:202:341:984	147	seq2	1094	99	35M	=	926	-203	GGAGGTCATCATACAATGATAAAAAGATCAATTCA	<<<(<8&<92<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:219:40:833	147	seq2	1094	99	35M	=	1278	219	GGAGGTCATCATACAATGATAAAAAGATCAATTCA	<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:23:1126:1886	83	seq2	1094	99	35M	=	1268	209	GGAGGTCATCATACAATGATAAAAAGATCAATTCA	7<<<7<<<<<<<<7<<<<<<<<<<<<<;8<;<<5<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:85:964:950	83	seq2	1095	99	35M	=	910	-220	GAGGTCATCATACAATGATAAAAAGATCAATTCAG	<<8::<<;;<<<;<<6<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:139:578:951	83	seq2	1095	98	35M	=	919	-211	GAGGTCATCATACAATGATAAAAAGATCAATTCAG	;<0;:&<:9<<<7<<<<<<<<<<<<<<;<<<<<<<	MF:i:18	Aq:i:26	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:107:738:484	147	seq2	1097	75	35M	=	926	-206	GGTCATCATACAATGATAAAAAGATCAATTCAGCA	.8/<<<7<8<<<<<<<<<<<<<<<<9<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_39:4:93:77:1338	83	seq2	1098	10	35M	=	940	-193	GTCATCATACAATGAAAAAAAGATCAATTCAGCAA	<<7<7<<<<<1<7<<&97;;<1<;1<<7<;7<<;<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_610:8:68:570:705	147	seq2	1100	99	35M	=	910	-225	CATCATACAATGATAAAAAGATCAATTCAGCAAGA	4<;4<;;:<<<<<<<<;<<<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS51_62:1:38:250:647	83	seq2	1100	71	35M	=	933	-202	AATAATAAAATGATAAAAAGATCAATTCAGCAAGA	+<&+<1<,<<7<<7<<<<<<<1,<<<<7<<2<<<<	MF:i:18	Aq:i:0	NM:i:3	UQ:i:34	H0:i:0	H1:i:3
+EAS1_93:8:13:325:483	83	seq2	1101	99	35M	=	919	-217	ATCATACAATGATAAAAAGATCAATTCAGCAAGAA	;:;<;=:========;==========;========	MF:i:18	Aq:i:27	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:128:584:952	147	seq2	1101	99	35M	=	1277	211	ATCATACAATGATAAAAAGATCAATTCAGCAAGAA	<<<<<<<<<<<<<<+<;<<<<<<;<<<;<<<+<66	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:4:184:237:476	83	seq2	1101	99	35M	=	925	-211	ATCATACAATGATAAAAAGATCAATTCAGCAAGAA	<;2<;<4<<;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+EAS51_64:6:300:622:86	147	seq2	1102	99	35M	=	1264	197	TCATACAATGATAAAAAGATCAATTCAGCAAGAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:57:1114:2032	147	seq2	1102	99	35M	=	931	-206	TATTACAATGATAAAAAGATCAATTCAGCAAGAAG	;+!5<4<<<<<<<<<<<<<;<&<;7<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:10	H0:i:1	H1:i:6
+B7_593:3:310:193:629	147	seq2	1103	99	36M	=	1267	200	CATACAATGATAAAAAGATCAATTCAGCAAGAAGAT	<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:6:529:366	83	seq2	1103	99	35M	=	1291	223	CATACAATGATAAAAAGATCAATTCAGCAAGAAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:10:686:1024	83	seq2	1103	99	35M	=	947	-191	CATACAATGATAAAAAGATCAATTCAGCAAGAAGA	&<<<3<<<<<<<<<<<<<<7<<<<<<<<<<7<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS114_45:7:14:978:1296	147	seq2	1104	90	35M	=	1249	180	ATACAATGATAAAAAGATCAATTCAGCAAGAAGAT	;6;;;;;;;;;;;:;;;;;;;6;;;;;;;;77777	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS56_57:2:237:855:581	83	seq2	1105	87	35M	=	1271	201	TACAATGATAAAAAGATCAATTCAGCAAGAAGATA	<;4<7<<<;47<<74<:*<<2:<<7.799:2<<9:	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+EAS139_19:7:85:262:751	147	seq2	1105	99	40M	=	1305	240	TACAATGATAAAAAGATCAATTCAGCAAGAAGATATAACC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::92	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:10:106:737	83	seq2	1106	99	35M	=	947	-194	ACAATGATAAAAAGATCAATTCAGCAAGAAGATAT	<-<<;<<<<<<<<<<<;<<<<;<<;<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:6
+B7_610:6:143:620:158	147	seq2	1107	99	35M	=	1283	211	CAATGATAAAAAGATCAATTCAGCAAGAAGATATA	<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS54_67:6:198:503:669	147	seq2	1107	99	35M	=	912	-230	CAATGATAAAAAGATCAATTCAGCAAGAAGATATA	5<<:<<;<<<<<<<;;<<9<<<<<<<<;<<<<;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS192_3:6:116:464:261	147	seq2	1107	99	35M	=	934	-208	CAATGATAAAAAGATCAATTCAGCAAGAAGATATA	;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_73:5:263:557:988	83	seq2	1108	84	35M	=	1289	216	AATGATAAAAAGATCAATTCAGCAAGAAGATATAA	<<<<<<<<<<<<<<<<<<<<<;;<<<<<<<<;<<<	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:8
+EAS139_19:1:53:463:1132	83	seq2	1109	99	40M	=	915	-234	ATGATAAAAAGATCAATTCAGCAAGAAGATATAACCATCC	;::;:<<<<<<<<:<<;<<<<8<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:46:1528:799	83	seq2	1109	96	35M	=	1306	232	ATGATAAAAAGATCAATTCAGCAAGAAGATATAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:7
+EAS54_81:7:324:472:791	83	seq2	1110	89	35M	=	1274	199	TGATAAAAAGATCAATTCAGCAAGAAGATATAACC	<<<<<<<<:<<<<<<<<<<<<<<:<<<<<<<<<:3	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+EAS54_61:8:4:173:814	147	seq2	1111	99	35M	=	1289	213	GATAAAAAGATCAATTCAGCAAGAAGATATAACCA	=====================<==========;==	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+B7_593:3:303:131:673	83	seq2	1112	99	36M	=	947	-201	ATAAAAAGATCAATTCAGCAAGAAGATATAACCATC	<;<<<<<<<<:<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:235:899:847	147	seq2	1112	99	35M	=	950	-197	ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT	<7<<<<<<<<:<<<<:<</<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS1_105:8:179:119:876	83	seq2	1112	60	35M	=	917	-230	ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT	<<<<<<<7<<<<<<;;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_59:2:162:272:415	147	seq2	1112	83	35M	=	923	-224	ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT	=7=======;5==<<6==1==<=============	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_45:6:44:77:1255	83	seq2	1113	99	35M	=	955	-193	TAAAAAGATCAATTCAGCAAGAAGATATAACCATC	79998;;;9:;<696<;.<;;<<;<;<;<;;;<8;	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:162:257:203	147	seq2	1114	99	35M	=	1301	222	AAAAAGATCAATTCAGCAAGAAGATATAACCATCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:3:55:464:146	83	seq2	1114	99	35M	=	1295	216	AAAAAGATCAATTCAGCAAGAAGATATAACCATCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:6:308:667:658	147	seq2	1116	34	35M	=	918	-233	AAAGATCACTTCAGCAATAAGATATAACCATCCTA	<9;;;45;&<;&.<5683;84+<;<;+8<;<<8;<	MF:i:18	Aq:i:10	NM:i:2	UQ:i:23	H0:i:0	H1:i:0
+EAS56_57:4:98:862:154	147	seq2	1116	99	35M	=	1290	209	AAAGATCAATTCAGCAAGAAGATATAACCATCCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<:99<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_61:5:263:314:696	83	seq2	1117	99	35M	=	953	-199	AAGATCAATTCAGCAAGAAGATATAACCATCCTAC	<<;<;:<<<<7<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:83:1456:1854	147	seq2	1117	99	35M	=	1275	193	AAGATCAATTCAGCAAGAAGATATAACCATCCTAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:4:231:815:626	83	seq2	1119	99	35M	=	940	-214	GATCAATACAGCAAGAAGATATAACCATCCTACTA	'<4%<<<22<<,<<;<<4;<<<<<<<<<<<<<<7<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:17	H0:i:0	H1:i:1
+EAS114_32:4:246:647:765	83	seq2	1119	99	35M	=	937	-217	GATCAATTCAGCAAGAAGATATAACCATCCTACTA	9<+,<<&,39<,<;<<<<<<<&<<<<;0<<3;<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:256:354:173	83	seq2	1121	99	36M	=	957	-200	TCAATTCAGCAAGAAGATATAACCATCCTACTAAAT	-9<<:9<<;6<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:53:61:31	83	seq2	1122	99	35M	=	949	-208	CAATTCAGCAAGAAGATATAACCATCCTACTAAAT	5;;<95<<5<<<<<<<<<<:5;<<<<<<<<<<<<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:308:509:948	83	seq2	1123	99	36M	=	1298	211	AATTCAGCAAGAAGATATAACCATCCTACTAAATAC	<9<<<<<<<;<7<<;<<<<<<<;<<<<7<<;2;<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:2:247:900:123	147	seq2	1123	99	35M	=	920	-238	AATTCAGCAAGAAGATATAACCATCCTACTAAATA	;;;;.<<4<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:3:307:113:346	83	seq2	1123	99	35M	=	938	-220	AATTCAGCAAGAAGATATAACCATCCTACTAAATA	<<<<9<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:1:168:69:249	83	seq2	1125	99	35M	=	936	-224	TTCAGCAAGAAGATATAACCATCCTACTAAATACA	;0;<;;<<<<<<<<<<<<<;<<<8<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:54:1886:719	147	seq2	1125	99	35M	=	941	-219	TTCAGCAAGAAGATATAACCATCCTACTAAATACA	883777;;:;;;;;;;;;;;;;;;;;;;;;;;;;;	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:94:273:165	147	seq2	1128	99	35M	=	945	-218	AGAAAGAAGATATAACCATCCTACTAAATACATAT	;3&;;:<<:<-<-<<8:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS1_95:7:155:530:532	147	seq2	1128	99	35M	=	1319	226	AGCAAGAAGATATAACCATCCTACTAAATACATAT	===================================	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:61:1885:163	147	seq2	1128	99	40M	=	1281	193	AGCAAGAAGATATAACCATCCTACTAAATACATATGCACC	<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<9::::4	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:193:661:771	83	seq2	1129	99	35M	=	952	-212	GCAAGAAGATATAACCATCCTACTAAATACATATG	:&<<<<<<<<<<<<<;<<<;<<;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:6:75:1503:1399	83	seq2	1130	99	40M	=	969	-201	CAAGAAGATATAACCATCCTACTAAATACATATGCACCTA	&;;8;<<<;<<<<,6<<70<<7<<<<<<9<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:2:42:28:552	147	seq2	1131	99	35M	=	1294	198	AAGAAGATATAACCATCCTACTAAATACATATGCA	<<<<<<<<<<<<<<<<<<<<<<<<;<;<3<:;9;8	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:61:631:567	147	seq2	1131	99	35M	=	957	-209	AAGAAGATATAACCATCCTACTAAATACATATGCA	<<7<<<<<<<<</<<;<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:3:257:288:731	147	seq2	1131	99	35M	=	939	-227	AAGAAGATATAACCATCCTACTAAATACATATGCA	<<:<<7<<<<<;<5<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:2:214:950:32	83	seq2	1132	99	35M	=	947	-220	AGAAGATATAACCATCCTACTAAATACATATGCAC	=&==4======:;==6<==:===============	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:1:12:88:200	83	seq2	1133	99	35M	=	968	-200	GAAGATATAACCATCCTACTAAATACATATGCACC	9<<;<<<;<;6;<;:<<<7<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:256:444:399	147	seq2	1133	99	35M	=	1289	191	GAAGATATAACCATCCTACTAAATACATATGCACC	<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<-;<<8	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:174:753:617	83	seq2	1136	75	35M	=	1299	198	GATATAACCATCCTACTAAATACATATGCACCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:115:226:443	83	seq2	1137	99	35M	=	1314	212	ATATAACCATCCTACTAAATACATATGCACCTAAC	<<<<<<<<<<<<<<<<;<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:26:1867:162	147	seq2	1137	70	35M	=	1299	197	ATATAACCATCCTACTAAATACATATGCACCTAAC	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78698	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:3:308:66:538	83	seq2	1138	99	35M	=	1321	218	TATAACCATCCTACTAAATACATATGCACCTAACA	<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:3:229:543:583	147	seq2	1139	99	35M	=	976	-198	ATAACCATCCTACTAAATACATATGCACCTAACAC	</<;+5<855;<6<<<<;<<<<<<9<<<<<<<<<<	MF:i:18	Aq:i:65	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:17:595:863	147	seq2	1139	89	35M	=	1289	185	ATAACCATCCTACTAAATACACATGCACCTAACTC	:<4:<<1:<<<9<+<+1<%<7&&9-71<17)7</4	MF:i:18	Aq:i:33	NM:i:2	UQ:i:19	H0:i:0	H1:i:1
+EAS51_62:7:248:17:435	147	seq2	1139	99	35M	=	969	-205	ATAACCATCCTACTAAATACATATGCACCTAACAC	<1<<88++<:<<:;<;<<<:<<<;<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:6:35:186:412	83	seq2	1139	99	35M	=	1306	202	ATAACCATCCTACTAAATACATATGCACCTAACAC	<<<<<<<<4<<<<<:<<<<<<:<<<<<<<<<;;<:	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:2:307:252:632	83	seq2	1142	99	35M	=	998	-179	ACCATCCTGCTAAATACATATGCACCTAACACAAG	<77<;,5<,9<<<<<<;<<<<<7<;<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:11	H0:i:0	H1:i:1
+EAS1_108:7:108:440:208	147	seq2	1142	99	35M	=	975	-202	CCCATCCTACTAAATACATATGCACCTAACACAAG	+35:486<<4<<<<<<<<<<<-<<<<<7<<)<<<-	MF:i:18	Aq:i:43	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+EAS1_95:7:74:866:49	83	seq2	1143	99	35M	=	969	-209	CCAACCTACTAAATACATATGCACCTAACACAAGA	:8<&<<<<7<<<<:<<<<<<8<5<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS54_61:2:66:757:918	83	seq2	1143	99	35M	=	985	-193	CCATCCTACTAAATACATATGCACCTAACACAAGA	<9<45;<<7<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:220:733:736	147	seq2	1143	99	35M	=	959	-219	CCATCCTACTAAATACATATGCACCTAACACAAGA	:;<77;<<9<<<<<9;<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:175:289:351	83	seq2	1144	99	35M	=	1319	210	CATCCTACTAAATACATATGCACCTAACACAAGAC	<<<<<<<<<<;<<<<<<<<;<<<<<<<<<<<9<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:2:56:155:49	147	seq2	1145	99	35M	=	970	-210	ATCCTACTAAATACATATGCACCTAACACAAGACT	;:5;;<5<<<<<<<<<<<<<<<<<<<<<<<<<<<=	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:299:336:613	83	seq2	1145	99	35M	=	1293	183	ATCCTACTAAATACATATGCACCTAACACAAGACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:4:30:432:228	83	seq2	1145	99	35M	=	967	-213	ATCCTACTAAATACATATGCACCTAACACAAGACT	<76<<<:<<<<<<<;<:<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:5:93:312:331	83	seq2	1145	99	35M	=	953	-227	ATCCTACTAAATACATATGCACCTAACACAAGACT	<;;:;<6<<<<;<:<<<<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:3:133:707:886	147	seq2	1146	99	35M	=	978	-203	ACCTAATAAATACATATGCACCTAACACAAGACTA	%5-2;&6<<<<<;<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:9	H0:i:1	H1:i:0
+EAS51_62:3:50:312:219	147	seq2	1146	99	35M	=	1288	177	TCCTACTAAATACATATGCACCTAACACAAGACTA	<<<<<<<<<<<;<<<<<;<;<<<;<<<<<<;;;;;	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:82:670:302	147	seq2	1146	99	35M	=	973	-208	TCCTACTAAATACATATGCACCTAACACAAGACTA	%448<7<<<<<<7<<<<<&<<7<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:47:591:698	83	seq2	1146	99	35M	=	1313	202	TCCTACTAAATACATATGCACCTAACACAAGACTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:8:122:430:882	83	seq2	1147	99	35M	=	1338	226	CCTACTAAATACATATGCACCTAACACAAGACTAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:4:46:1566:668	83	seq2	1148	99	35M	=	959	-224	CTACTAAATACATATGCACCTAACACAAGACTACC	5<<:<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:4:92:411:955	147	seq2	1149	99	36M	=	979	-206	TACTAAATACATATGCACCTAACACAAGACTACCCA	2<+<<<<9<<<<<<<;+<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:96:419:327	83	seq2	1149	99	35M	=	1331	217	TACTAAATACATATGCACCTAACACAAGACTACCC	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;;9<9	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:20:1444:328	147	seq2	1149	99	35M	=	993	-191	TACTAAATACATATGCACCTAACACAAGACTACCC	9<3<<==;=<===;=<=====<<===========<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:198:59:675	147	seq2	1150	99	35M	=	1315	200	ACTAAATACATATGCACCTAACACAAGACTATCCT	<.<<<<<<;<<<<<<<<<<<**<;<;2<;6;&*2&	MF:i:18	Aq:i:45	NM:i:2	UQ:i:10	H0:i:1	H1:i:0
+EAS54_61:7:114:506:971	83	seq2	1150	99	35M	=	986	-199	ACTAAATACATATGCACCTAACACAAGACTACCCA	;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:2:94:356:809	147	seq2	1151	99	35M	=	1334	218	CTAAATACATATGCACCTAACACAAGACTACCCAG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:155:541:234	147	seq2	1151	99	35M	=	1319	203	CTAAATACATATGCACCTAACACAAGACTACCCAG	<<7<<<<<<<<<<<<<<<4<<<<<<<<<<<;;;08	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:272:328:400	83	seq2	1151	99	35M	=	977	-209	CTAAATACATATGCACCTAACACAAGACTACCCAG	4;<<<<<7<;<<<-<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:283:186:707	147	seq2	1154	99	36M	=	1321	203	AATACATATGCACCTAACACAAGACTACCCAGATTC	<<<<<<<<<<<<<<<<<<<<<<;<<<<<;<;<<<<8	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:4:86:660:932	83	seq2	1154	99	35M	=	1338	219	AATACATATGCACCTAACACAAGACTACCCAGATT	================================9:=	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:6:264:705:89	147	seq2	1155	99	35M	=	983	-207	AAACATATGCACCTAACACAAGACTACCCAGATTC	<(<2<&<)<<<7<8<<<<<<<<<<.<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS114_32:4:5:396:292	83	seq2	1155	99	35M	=	981	-209	ATACATATGCACCTAACACAAGACTACCCAGATTC	<:<6<7<:<:;;;<<<;<7<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:178:342:866	147	seq2	1155	72	35M	=	1311	191	ATACATATGCACCTAACACAAGACTACCCAGATTC	;<<<<<;<<<8<<;<;<3<8/<<<<6<<</<8;<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:155:809:543	147	seq2	1156	99	35M	=	1352	231	TACATATGCACCTAACACAAGACTACCCAGATTCA	<<<<<<<<<<<<<<<<7<;<<<<<<<<<<<1<;<;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:119:880:781	83	seq2	1157	99	35M	=	1312	190	ACATATGCACCTAACACAAGACTACCCAGATTCAT	<<<<<<<<<<<<<<<<<<<<<<<<+<<<<7<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:6:283:963:234	147	seq2	1157	99	35M	=	992	-200	ACATATGCACCTAACACAAGACTACCCAGATTCAT	<5<;<;97;;:;<<7<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:28:745:352	83	seq2	1159	99	35M	=	1329	205	ATATGCACCTAACACAAGACTACCCAGATTCATAA	<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:147:687:428	147	seq2	1159	99	35M	=	998	-196	ATATGCACCTAACACAAGACTACCCAGATTCATAA	;1<''48;4)<<:<<<<;<<6;<<<<<<<<<<<<<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_53:3:101:809:776	83	seq2	1160	99	35M	=	1326	201	TATGCACCTAACACAAGACTACCCAGATTCATAAA	<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:35:538:1882	147	seq2	1160	98	35M	=	1337	212	TATGCACCTAACACAAGACTACCCAGATTCATAAA	;);43.50;3;93;;4;3;;;9-7.;*;;966*75	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:7:41:34:211	83	seq2	1164	99	35M	=	980	-219	CACCTAACACAAGACTACCCAGATTCATAAAACAA	7</::<<7<<<<<<;<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:1:2:1422:1820	83	seq2	1164	99	35M	=	1004	-195	CACCTAACACAAGACTACCCAGATTCATAAAACAA	*4617;;4;1;;79;/7&,4;9;;;7<;;<<<;<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:194:998:663	83	seq2	1165	99	35M	=	1002	-198	ACCTAACACAAGACTACCCAGATTCATAAAACAAA	;</<<<7<<<<;<<8<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:8:10:975:766	83	seq2	1166	99	35M	=	959	-242	AATAACACAAGACTACCCAGATTCATAAAACAAAT	++4<<+<+<<<<8<<22;<<<<<2<<<<<<<<<<<	MF:i:18	Aq:i:64	NM:i:2	UQ:i:24	H0:i:1	H1:i:0
+EAS114_39:6:94:1273:1462	83	seq2	1166	99	35M	=	995	-206	CCTAACACAAGACTACCCAGATTCATAAAACAAAT	8.<<<;<:<<<<;<<;;;<<<;<;<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:8:64:350:174	83	seq2	1166	99	35M	=	1000	-201	CCTAACACAAGACTACCCAGATTCATAAAACAAAT	709<<;<;<<<<<<<;7<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:166:84:766	83	seq2	1167	99	35M	=	990	-212	ATAACACAAGACTACCCAGATTCATAAAACAAATA	%8<=+<-<<<</<<<<8<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS1_108:2:85:580:481	147	seq2	1167	99	35M	=	1359	227	CTAACACAAGACTACCCAGATTCATAAAACAAATA	<<<<<<<<<<<<<:<<<<<<<<<<<<;<<<<6:<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:4:191:40:536	83	seq2	1167	66	35M	=	977	-225	ATAAAAAAAGACTACCCAGATTCATAAAACAAATA	+1<<,<&<<:<.;<7/7<<<<;.<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:3	UQ:i:27	H0:i:1	H1:i:0
+EAS218_1:2:40:1291:1045	147	seq2	1167	99	35M	=	980	-222	CTAACACAAGACTACCCAGATTCATAAAACAAATA	*<<<9<<<<<<:0<9<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:39	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:221:881:916	83	seq2	1168	96	35M	=	1327	194	TAACACAAGACTACCCAGATTCATAAAACAAATAC	<<;<<8<<;<<<<<<<;<<<<28<:<8<:;<;;;<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:35:392:2042	147	seq2	1168	99	35M	=	1332	199	TAACACAAGACTACCCAGATTCATAAAACNAATAC	======;==========<<=======7=;!<7;;;	MF:i:18	Aq:i:72	NM:i:1	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:192:714:341	147	seq2	1170	99	35M	=	1346	211	ACACAAGACTACCCAGATTCATAAAACAAATACTA	<<9<<<<<<<<<<<8<<<<<;<<;8<<<88;;;;9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:189:876:833	147	seq2	1173	99	36M	=	1349	212	CAAGACTACCCAGATTCATAAAACAAATACTACTAG	<<<<<<<<<<<8<8<<<<<;<;;<<;<<<<<;<<<6	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:299:743:762	147	seq2	1173	99	36M	=	1345	208	CAAGACTACCCAGATTCATAAAACAAATACTACTAG	<<<;<<<<<<<<<:;<<<.<:<<<<<<<<<<;;;;;	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:107:252:533	83	seq2	1173	60	35M	=	1025	-183	CAAGACTACCCAGATTCATAAAACAAATACTACTA	3<<<<+<<96<<<<<<;<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:2	H1:i:1
+EAS1_97:5:154:952:558	147	seq2	1173	99	35M	=	1007	-201	AAAGACTACCCAGATTCATAAAACAAATACTACTA	%<<9;;<<;;;<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS56_63:4:184:659:377	147	seq2	1173	99	35M	=	992	-216	CAAAACTACCCAGATTCATAAAACAAATACTACTA	1;<+<;<6;66<<;<<<<;;<<<8<<<<8<<;<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+B7_595:6:137:811:130	147	seq2	1175	99	35M	=	1351	211	AGACTACCCAGATTCATAAAACAAATACTACTAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:4:124:367:72	147	seq2	1175	99	35M	=	1377	237	AGACTACCCAGATTCATAAAACAAATACTACTAGA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:8:60:358:494	147	seq2	1179	44	35M	=	979	-235	TACCCAGATTCATAAAACAAATACTACTAGACCTA	7<77;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:14	NM:i:0	UQ:i:0	H0:i:6	H1:i:36
+EAS114_30:7:319:11:255	147	seq2	1179	92	35M	=	1337	193	TACCCAGATTCATAAAACAAATACTACTAGACCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<:	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:10
+B7_610:7:26:749:174	83	seq2	1183	78	35M	=	1357	209	CAGATTCATAAAACAAATACTACTAGACCTAAGAG	<<<<<<<<<<<<<<<<<<<<<<;<9<8<<<9<;94	MF:i:18	Aq:i:11	NM:i:0	UQ:i:0	H0:i:6	H1:i:31
+EAS1_103:7:112:578:782	83	seq2	1183	89	35M	=	1366	218	CAGATTCATAAAACAAATACTACTAGACCTAAGAG	<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<	MF:i:18	Aq:i:20	NM:i:0	UQ:i:0	H0:i:5	H1:i:25
+EAS1_105:1:234:185:359	83	seq2	1183	46	35M	=	1029	-189	CAGATTCATAAAACAAATACTACTAGACCTAAGAG	<<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:9
+EAS112_34:4:92:412:435	147	seq2	1184	89	35M	=	1003	-216	AGATTCATAAAACAAATACTACTAGACCTAAGAGG	<;<52:=,====:=========<============	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:6:24:105:1046	83	seq2	1184	99	35M	=	1377	228	AGATTCATAAAACAAATACTACTAGACCTAAGAGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:4	H1:i:2
+EAS1_97:2:128:629:484	147	seq2	1185	96	35M	=	1359	209	GATTCATAAAACAAATACTACTAGACCTAAGAGGG	<<49<<<<<9<<<<99<<<<<<<<<<<<+<-)7))	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:4	H1:i:45
+EAS219_FC30151:1:53:140:421	83	seq2	1185	99	35M	=	1016	-204	GATTCATAAAACAAATACTACTAGACCTAAGAGGG	<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:99:557:427	147	seq2	1186	99	35M	=	1342	191	ATTCATAAAACAAATACTACTAGACCTAAGAGGGA	<<<<<<<<<<<<<<<<<<<<<<:<<<<+;<7:8:;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:3:253:175:31	147	seq2	1187	72	35M	=	1008	-214	TTCATAAAACAAATACTACTAGACCTAAGAGGGAT	;+;<;<<<<<<<<9<<9<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:4:13:701:55	147	seq2	1187	99	36M	=	1015	-208	TTCATAAAACAAATACTACTAGACCTAAGAGGGATG	0:+<7<;9<;<<<<<<<3<<<<<;;<<<:<<3<<<<	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:220:809:850	147	seq2	1187	60	35M	=	986	-236	TTCATAAAACAAATACTACTAGACCTAAGAGGGAT	9+5<;*<<<2:0<<8:<*00<<<:<*<<<<<<<<&	MF:i:18	Aq:i:60	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:5:30:599:589	147	seq2	1188	99	36M	=	1003	-221	TCATAAAACAAATACTACTAGACCTAAGAGGGATGA	90<;<<<<<<<<+<<<;;<;<;<<<<<<<<6<<8<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:35:118:589	83	seq2	1188	99	35M	=	999	-224	TCATAAAACAAATACTACTAGACCTAAGAGGGATG	67<<<<<;<<<<<<<:7<<<<:<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:37:604:389	147	seq2	1188	99	35M	=	998	-225	TCATAAAACAAATACTACTAGACCTAAGAGGGATG	00;:;========9========<9========<==	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_61:2:168:61:867	83	seq2	1188	99	35M	=	997	-226	TCATAAAACAAATACTACTAGACCTAAGAGGGATG	;7<<<<<<<<<<<<<7<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:7:197:399:319	83	seq2	1189	99	35M	=	1012	-212	CAAAAAACAAATACTACTAGACCTAAGAGGGATGA	&<+==<<5<<<8<89;;<<<<<<8<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS114_32:5:267:170:250	147	seq2	1189	99	35M	=	1377	223	CATAAAACAAATACTACTAGACCTAAGAGGGATGA	<<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<<<<;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:4:174:157:573	83	seq2	1191	99	35M	=	1012	-214	TAAAACAAATACTACTAGACCTAAGAGGGATGAGA	8<<<<4<<<<<<<<;<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:39:956:676	83	seq2	1191	99	35M	=	1023	-203	TAAAACAAATACTACTAGACCTAAGAGGGATGAGA	899985;;<;:9;;:9<;:9:5;<;;;<;<;<<<<	MF:i:18	Aq:i:44	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:37:763:1437	83	seq2	1191	99	35M	=	994	-232	TAAAACAAATACTACTAGACCTAAGAGGGATGAGA	79979;<;<;;;<;;;;;;6:;<:;<:8;<<<<;<	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:50:513:882	83	seq2	1192	99	35M	=	1031	-196	AAAACAAATACTACTAGACCTAAGAGGGATGAGAA	<<<<:<<<<<:<<:<<<<::<<<<<<<<<<<<<<<	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:2:15:1763:1143	147	seq2	1193	99	35M	=	1023	-205	AAACAAATACTACTAGACCTAAGAGGGATGAGAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:46	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:4:189:571:366	83	seq2	1194	99	35M	=	1002	-227	AACAAATACTACTAGACCTAAGAGGGATGAGAAAT	<<;<<<<<:<<<;<<<;;;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:3:166:532:438	83	seq2	1194	99	35M	=	1386	227	AACAAATACTACTAGACCTAAGAGGGATGAGAAAT	<<<<<<<<<<<<<<<;<<;<<;<<<<;<;:;;<;<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:309:109:987	83	seq2	1194	99	35M	=	1024	-205	AACAAATACTACTAGACCTAAGAGGGATGAGAAAT	<<<<<<:<<;<<<<<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:1:171:527:247	83	seq2	1194	67	35M	=	1027	-202	AACAAATGCTACTAGACCTAAGAGGGATGAGAAAT	<547*9)&&7+;+<<7<<<;<<<;3<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+B7_589:8:139:727:808	147	seq2	1195	99	35M	=	1363	203	ACAAATACTACTAGACCTAAGAGGGATGAGAAATT	<<<<<<<<<<<<<:<;<<<<<<<<9;<;9<6;<<9	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:202:275:776	83	seq2	1196	99	36M	=	1002	-230	CAAATACTACTAGACCTAAGAGGGATGAGAAATTAC	;<<<<;;<<<<<<<;<<<<<<<;<<<<<<<<<<;<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:12:484:836	147	seq2	1197	99	35M	=	1372	210	AAATACTACTAGACCTAAGAGGGATGAGAAATTAC	<<<<<<<<<<<<<<<<<7<:<<<<<<9<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:21:553:57	83	seq2	1197	99	35M	=	1358	196	AAATACTACTAGACCTAAGAGGGATGAGAAATTAC	<<<<<<<<<<<;;<<<;<<;<<;<<<;;9<;<;<9	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:4:939:2021	83	seq2	1197	99	40M	=	1031	-206	AAATACTACTAGACCTAAGAGGGATGAGAAATTACCTAAT	;;;;:8;<5:<<<7/<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:194:378:230	83	seq2	1198	99	35M	=	1022	-211	AATACTACTAGACCTAAGAGGGATGAGAAATTACC	<<;<8<<:<<<<:<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:49	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:68:242:834	147	seq2	1200	99	36M	=	1386	222	TACTACTAGACCTAAGAGGGATGAGAAATTACCTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:2:22:471:500	147	seq2	1200	99	35M	=	1365	200	TACTACTAGACCTAAGAGGGATGAGAAATTACCTA	=======<=<====:<2===9==;=;9;;=;;;;5	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:139:989:144	147	seq2	1201	99	35M	=	1387	221	ACTACTAGACCTAAGAGGGATGAGAAATTACCTAA	<<<<<<<<<<<<6<<<<<<<<<;<<<<<<<;;<;;	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:5:188:20:592	83	seq2	1202	95	35M	=	1032	-205	CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT	2<<7;<<<<,;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:189:863:213	83	seq2	1202	99	35M	=	1039	-198	CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT	7:<7<<<<44;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_1:4:62:561:531	83	seq2	1203	99	35M	=	1036	-202	TACTAGACCTAAGAGGGATGAGAAATTACCTAATT	<<7<<<<:<8<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:8:70:1349:1788	83	seq2	1203	99	35M	=	1043	-195	TACTAGACCTAAGAGGGATGAGAAATTACCTAATT	<7;<<8<74;;<1<<71<;7<;;<;<7<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:5:197:914:256	147	seq2	1204	97	35M	=	1049	-190	ACTAGACCTAAGAGGGATGAGAAATTACCTAATTG	<5;<8<5/;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:35:896:1588	83	seq2	1205	91	35M	=	1032	-208	CTAGACCTAAGAGGGATGAGAAATTACCTAATTGG	77999:.:<<;<;;;<<;<;<<<<<;<;;<<<<;;	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:43:47:279	147	seq2	1206	99	35M	=	1405	234	TAGACCTAAGAGGGATGAGAAGTTACCTAATTGGT	<<<<<<<<<<<<<;:<-<<<<<<<<<<<<:;;+7;	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_95:2:211:954:174	83	seq2	1207	99	35M	=	1393	221	AGACCTAAGAGGGATGAGAAATTACCTAATTGGTA	===============================777=	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:2:5:1219:137	83	seq2	1209	99	35M	=	1384	210	ACCTAAGAGGGATGAGAAATTACATAATTGGTACA	<<<<<<<<<<<<<<<<<<<<<<<(<<<<<<:9<;=	MF:i:18	Aq:i:45	NM:i:1	UQ:i:7	H0:i:0	H1:i:1
+EAS56_57:7:33:954:724	83	seq2	1210	97	35M	=	1049	-196	CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA	;<;<;<<-7;<<;<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:24	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:176:402:458	147	seq2	1210	99	36M	=	1376	202	CCTAAGAGGGATGAGAAATTACCTAATTGGTACAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;;<;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:4:81:687:1379	147	seq2	1210	99	35M	=	1366	191	CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:1:45:239:851	83	seq2	1211	61	35M	=	1023	-223	CTAAGAGGGATGAGAAATTACCTAATTGGTACAAT	*2*0<<<<<<<<<<<<<<<<9<<3<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_65:5:312:985:871	147	seq2	1212	99	35M	=	1369	192	TAAGAGGGATGAGAAATTACCTAATTGGTACAATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<9<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:38:557:1441	147	seq2	1212	99	35M	=	1381	204	TAAGAGGGATGAGAAATTACCTAATTGGTACAATG	<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:3:88:465:1877	147	seq2	1212	99	35M	=	1055	-192	TAAGAGGGATGAGAAATTACCTAATTGGTACAATG	<<<<<<<:<<<<<<<<:<<<<<<<<<<<<7;<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:7:149:123:265	147	seq2	1213	99	35M	=	1395	217	AAGAGGGATGAGAAATTACCTAATTGGTACAATGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:6:47:1791:444	83	seq2	1213	74	35M	=	1041	-207	AAGAGGGATGAGAAATTACCTAATTGGTACAATGT	978879;:;;<:;;<<;:<9<<<<;6;;;;<<<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:6
+EAS51_62:3:68:996:104	147	seq2	1214	70	35M	=	1041	-208	AGAGGGATGAGAAATTACCTAATTGGTACAATGTA	<1<8<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:21	NM:i:0	UQ:i:0	H0:i:1	H1:i:4
+B7_593:2:68:140:542	83	seq2	1217	95	36M	=	1398	217	GGGATGAGAAATTACCTAATTGGTACAATGTACAAT	<<<8;<<;<<<<<;<<;<<<<<8;<-<8<82;;;-8	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:6
+EAS188_7:7:67:719:786	147	seq2	1218	43	35M	=	1383	200	GGATGAGAAATTACCTAATTGGTACACTGTACAAT	;;<<<<<<&<<:13&<1<<<:<<<)/&/))<'6-<	MF:i:18	Aq:i:13	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS1_108:5:321:712:224	83	seq2	1220	58	35M	=	1051	-204	ATGAGAAATTACCTAATTGGTACAATGTACAATAT	=;===7;===7=========;=:;=========;=	MF:i:18	Aq:i:28	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_26:4:100:238:596	147	seq2	1220	56	35M	=	1403	218	ATGAGAAATTACCTAATTGGTACAATGTACAATAT	======9=====;=======5===;====/=;===	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:13
+EAS51_62:7:312:236:655	147	seq2	1222	99	35M	=	1412	225	GAGAAATTACCTAATTGGTACAATGTACAATATTC	<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:5
+EAS56_63:6:102:816:260	147	seq2	1225	99	35M	=	1049	-211	AAATTACCTAATTGGTACAATGTACAATATTCTGA	<<<<<<::<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:23	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:34:144:868	147	seq2	1226	76	35M	=	1412	221	AATTACCTAATTGGTACAATGTACAATATTCTGAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:215:516:299	83	seq2	1226	99	35M	=	1406	215	AATTACCTAATTGGTACAATGTACAATATTCTGAT	<<<<<<;<<<<;;;;<;;<<<<;<<9<;<<1;7/;	MF:i:18	Aq:i:64	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:81:12:1231	147	seq2	1228	99	35M	=	1391	198	TTACCTAATTGGTACAATGTACAATATTCTGATGA	<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<4<<6	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:2:30:644:942	147	seq2	1229	83	35M	=	1045	-219	TACCTAATTGGTACAATGTACAATATTCTGATGAT	85%+;<<9;<9<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:22	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:41:519:609	147	seq2	1229	99	35M	=	1401	207	TACCTAATTGGTACAATGGACAATATTCTGATGAT	1<<<<<<<<<<<<<<<4<-:<+6<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+B7_591:7:116:814:89	83	seq2	1231	99	36M	=	1408	213	CCTAATTGGTACAATGTACAATATTCTGATGATGGT	<<<<<<<<<<<<<<<<<<<<<<:<<<<;<<;<<66<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:169:714:644	147	seq2	1231	99	35M	=	1437	241	CCTAATTGGTACAATGTACAATATTCTGATGATGG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:73:420:812	83	seq2	1232	66	35M	=	1414	217	CTAATTGGTACAATGTACAATATTCTGATGATGGT	<<<<<1<<<<::1<7<:<96<9<:<<:4<70:11<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:17:1179:393	83	seq2	1232	99	35M	=	1412	215	CTAATTGGTACAATGTACAATATTCTGATGATGGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<:4<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:118:829:36	83	seq2	1233	99	35M	=	1417	219	TAATTGGTACAATGTACAATATTCTGATGATGGTT	<<<<<<<<<:<2<<<<<<:<<<<<<<<<<<<71;<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:2:125:875:553	147	seq2	1233	99	36M	=	1075	-194	TAATTGGTACAATGTACAATATTCTGATGATGGTTA	-;<;:;<<;6<<<<<<6<;<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_32:4:7:282:424	83	seq2	1233	83	35M	=	1397	199	TAATTGGTACAATGTACAATATTCTGATGATGGTT	<<<3<<<9<<<<3<<<<<9<<<9,<;;9;&*;3,.	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:107:447:488	147	seq2	1233	99	35M	=	1412	214	TAATTGGTACAATGTACAATATTCTGATGATGGTT	<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:7:66:891:294	83	seq2	1233	99	35M	=	1057	-211	TAATTGGTACAATGTACAATATTCTGATGATGGTT	:<<5;;<<<4<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS56_57:8:72:44:435	83	seq2	1235	76	35M	=	1392	192	ATTGGTACAATGTACAATATTCTGATGATGGTTAA	<<<<<<<<<<<2;<;<<;<<<;<<8<82<;22<8&	MF:i:18	Aq:i:0	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS139_19:4:18:1335:1514	147	seq2	1235	99	40M	=	1063	-212	ATTGGTACAATGTACAATATTCTGATGATGGTTACACTAA	::/::<<;<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:7:72:1288:1211	147	seq2	1235	84	35M	=	1052	-218	ATTGGTACAATGTACAATATTCTGATGATGGTTAC	<);<:<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:200:263:280	83	seq2	1236	99	35M	=	1078	-193	TTGGTACAATGTACAATATTCTGATGATGGTTACA	)<<<8<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:5:68:440:424	147	seq2	1237	99	35M	=	1060	-212	TGGTACAATGTACAATATTCTGATGATGGTTACAC	<<2<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:6:255:441:47	147	seq2	1237	99	35M	=	1072	-200	TGGTACAATGTACAATATTCTGATGATGGTTACAC	;;7<;:<<<<<<<<<<;<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:174:557:872	147	seq2	1237	99	35M	=	1423	221	TGGTACAATGTACAATATTCTGATGATGGTTACAC	<<<<<<<<<<<<<:<<<<<<<7<<;<<6:<<2117	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS51_64:3:255:45:399	147	seq2	1238	99	35M	=	1404	201	GGTACAATGTACAATATTCTGATGATGGTTACACT	<<3<8<<8<0<<;<<<0<<<</+8<611<<;71;7	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:2:264:157:150	147	seq2	1238	30	35M	=	1054	-219	GGAAAAATGGACAAGATTCTGATGAGGGTTACACT	.3%:+<<*;*<2<<1<1*,*<<7<<+<<<&<<<<<	MF:i:-126	Aq:i:30	NM:i:3	UQ:i:35	H0:i:0	H1:i:0
+EAS139_19:5:95:944:247	83	seq2	1238	99	40M	=	1424	226	GGTACAATGTACAATATTCTGATGATGGTTACACTAAAAG	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:;:::	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_105:2:301:161:195	147	seq2	1239	75	35M	=	1076	-198	GTACAATGTACAATATTCTGATGATGGTTACACTA	''6%6<6<<<4<<<<<<<<)<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:2:141:7:963	83	seq2	1240	85	36M	=	1061	-215	TACAATGTACAATATTCTGATGATGGTTACACTAAA	95+<<9<<5<;;<<;<<;'<<<<<;<<<7<9<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_39:6:76:282:1668	83	seq2	1240	99	35M	=	1401	196	TACAATGTACAATATTCTGATGATGGTTACACTAA	<<<<<<<<<<<<<<<<<<;<<;<<<<<<;<;<<<8	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:64:199:1288	147	seq2	1240	77	35M	=	1079	-196	TACAATGTACAATATTCTGATGATGGTTACACTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:49:911:980	147	seq2	1241	99	35M	=	1434	228	ACAATGTACAATATTCTGATGATGGTTACACTAAA	<<<<<<<<<<;<<<<<<<8<<<<;<;<<88-<;33	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:66:1046:167	147	seq2	1241	99	35M	=	1060	-216	ACAATGTACAATATTCTGATGATGGTTACACTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:5:303:542:924	83	seq2	1242	76	35M	=	1083	-194	CAATGTACAATATTCTGATGATGGTTACACTAAAA	+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS114_45:2:79:554:354	147	seq2	1242	63	35M	=	1082	-195	CAATGTACAATATTCTGATGATGGTTACACTAAAA	98988;7;;;;:;;;;;;;;;;:;;;:;;;;;9;;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:248:122:558	147	seq2	1243	99	35M	=	1436	228	AATGTACAATATTCTGATGATGGTTACACTAAAAG	<<<<:<<<<<<<<<<<<<;<<<<:<6:4<<::6:6	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:7:109:22:383	83	seq2	1244	99	35M	=	1071	-208	ATGTACAATATTCTGATGATGGTTACACTAAAAGC	<;9;<8<<<<<<;<<<<<<<<<<<<;<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:43:1229:1855	83	seq2	1244	99	35M	=	1074	-205	ATGTACAATATTCTGATGATGGTTACACTAAAAGC	8<<<<;8<<<;;5<<28<<<<<<<<<<<<7;;<<;	MF:i:18	Aq:i:48	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:2:74:656:272	83	seq2	1245	99	35M	=	1088	-192	TGTACAATATTCTGATGATGGTTACACTAAAAGCC	;;;</<<<<<5;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS56_65:7:118:775:467	83	seq2	1245	99	35M	=	1075	-205	TGTACAATATTCTGATGATGGTTACACTAAAAGCC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+B7_593:7:15:244:876	83	seq2	1246	43	36M	=	1440	230	GTACAATATTCTGATGATGGTTACACTAAAAGCCCA	<<<<<<;<<<<<<<<;<<;;;<<<<<:<<<9;<<<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:63:28:1549	147	seq2	1247	77	35M	=	1439	227	TACAATATTCTGATGATGGTTACACTAAAAGCCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;<<<<7	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:310:800:761	83	seq2	1249	99	35M	=	1055	-229	CAATATTCTGATGATGGTTACACTAAAAGCCCATA	1<<:<:<:<<<<:<<<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:14:978:1296	83	seq2	1249	90	35M	=	1104	-180	CAATATTCTGATGATGGTTACACTAAAAGCCCATA	77177;9;2:;;:;;(;;9;<;;;;:;;;:7;<<;	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:8:26:242:35	147	seq2	1251	99	35M	=	1084	-202	ATATTTTGATGATGGTTACACTAAAAGCCCATACT	<<<77!!7<;<<<;;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:2	UQ:i:0	H0:i:1	H1:i:8
+EAS114_45:7:6:758:988	83	seq2	1253	99	35M	=	1087	-201	ATTCTGATGATGGTTACACTAAAAGCCCATACTTT	3-7*73;;399:9;9;7<-(<;;<;;:;9::;;7;	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:315:412:921	83	seq2	1254	99	35M	=	1424	205	TTCTGATGATGGTTACACTACAAGCCCATACTGTA	<;<;<<<<<<<;<<<<<<<<8<<<;<<:<<;;+<8	MF:i:18	Aq:i:45	NM:i:2	UQ:i:33	H0:i:0	H1:i:1
+EAS114_30:3:215:840:760	147	seq2	1256	99	35M	=	1416	195	CTGATGATGGTTACACTAAAAGCCCATACTTTCCT	<<<<<<<<<<<<<<<;<<<88<+<<:<;3585,+:	MF:i:18	Aq:i:66	NM:i:1	UQ:i:11	H0:i:1	H1:i:0
+EAS1_95:5:284:212:932	147	seq2	1257	10	35M	=	1063	-229	TGATGATGGTTACGCTAAAAGTCCATGCTTTACTG	82%<8:<-:<<:**:<-<<8<)/2/<:/<<<<<<<	MF:i:18	Aq:i:0	NM:i:3	UQ:i:42	H0:i:0	H1:i:0
+EAS1_97:4:290:121:79	147	seq2	1257	99	35M	=	1420	198	TGATGATGGTTACACTAAAAGCCCATACTTTACTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<7;<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:1:88:54:900	83	seq2	1257	68	35M	=	1069	-223	TGATGATGGTTACACTAAAAGCCCATACTTCACTG	============;=================;9===	MF:i:18	Aq:i:19	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS188_7:3:100:735:530	83	seq2	1257	99	35M	=	1058	-234	TGATGATGGTTACACTAAAAGCCCATACTTTACTG	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:32:562:1695	147	seq2	1258	76	35M	=	1085	-208	GATGATGGTTACACTAAAAGCCCATACTTTACTGC	:5:::<88/<:<<<<<<<<<7<9<<&<959<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:173:627:465	147	seq2	1260	99	36M	=	1444	220	TGATGGTTACACTAAAAGCCCATACTTTACTGCTAC	<<<<<<<<<<<<<<<<<<<<<<<;<<<<<2;;4;;7	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS1_95:1:77:589:741	83	seq2	1263	99	35M	=	1078	-220	TGGTTACACTAAAAGCCCATACTTTACTGCTACTC	8=;;==606;=========================	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:8:27:228:31	147	seq2	1264	99	35M	=	1082	-217	GGTTACACTAAAAGCCCATACTTTACTGCTACTCA	99;;;<<<<<<:<<;<;<<;<<<<;<<;<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:54:695:952	147	seq2	1264	99	35M	=	1076	-223	GGTTACACTAAAAGCCCATACTTTACTGCTACTCA	277%<9<4)<<<<<<<<<;<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:6:300:622:86	83	seq2	1264	99	35M	=	1102	-197	GGTTACACTAAAAGCCCATACTTTACTGCTACTCA	<:<<<:<6;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:71:62:254	147	seq2	1264	99	35M	=	1438	209	GGTTACACTAAAAGCCCATACTTTCCTGCTACTCA	<<<<<<7<<<<7<<<<<3<<<<<<&<<.<<::<:%	MF:i:18	Aq:i:43	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS114_28:1:168:609:646	83	seq2	1264	99	36M	=	1436	208	GGTTACACTAAAAGCCCATACTTTACTGCTACTCAA	<<<<<<<<<<<;<<<<<:<8<<<<;<<<<<4<<<9<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:84:92:1246	147	seq2	1265	99	35M	=	1437	207	GTTACACTAAAAGCCCATACTTTACTGCTACTCAA	<<<<<<<<<<<<<<<<5<:<<5<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:3:310:193:629	83	seq2	1267	99	36M	=	1103	-200	TACACTAAAAGCCCATACTTTACTGCTACTCAATAT	9<9<6;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:111:379:700	73	seq2	1268	0	35M	=	1268	0	ACACTAAAAGCCCATACTTTACTGCTACTCAATAT	7<<:<<<<02<<6&<</<<</+9/98*<966/3/<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:111:379:700	133	seq2	1268	0	*	=	1268	0	CGCACTGGCAATATTTGTGTGTTTACTTTTTTGCA	:1+&;;6;:;918;);;):,19.9:).):::.&3(	MF:i:-64
+EAS114_30:6:137:741:866	147	seq2	1268	99	35M	=	1429	196	ACACTAAAAGCCCATACTTTACTGCTACTCAATAT	<<<<8<<;;;<<<<;<<<;;;<;4<<8;<<;%<8;	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:7:23:1126:1886	147	seq2	1268	99	35M	=	1094	-209	ACACTAAAAGCCCATACTTTACTGCTACTCAATAT	5*.:.5<<::<<<<<<<<:5<<<<<<<<<<:2<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:21:423:169	83	seq2	1270	99	35M	=	1468	233	ACTAAAAGCCCATACTTTACTGCTACTCAATATAT	<<<<<;<<<<<<;<<<<<;;<<<<<<<<9+:5<;;	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:110:984:98	147	seq2	1270	99	36M	=	1092	-214	ACTAAAACCCCATACTTTACTGCTACTCAATATATC	:81<<<<+;;8<+<8<<<<<;<<<8;<<<<<<<<8;	MF:i:18	Aq:i:70	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS219_FC30151:5:54:1351:910	83	seq2	1270	99	35M	=	1448	213	ACTAAAAGCCCATACTTTACTGCTACTCAATATAT	<<<<<<8<<<<<<<<<<<<<<<<<<<<<<18<<:<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:2:237:855:581	147	seq2	1271	87	35M	=	1105	-201	CTAAACGCCCATACTTTACTGCTACTCAATATATC	/+<<<&)2;66;/;;+<;;3133<3<3;9;<999<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_59:8:80:542:549	147	seq2	1271	99	35M	=	1443	207	CTAAAAGCCCATACTTTACTGCTACTCAATATATC	<<<<<<<<;<<<<<<<<:<<<<-<;;<;7<;3;9;	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:7:1347:375	147	seq2	1271	99	35M	=	1436	200	CTAAAAGCCCATACTTTACTGCTACTCAATATATC	;;;;;;;;;;;;;;;;;;;;9;;;8;;;;;97777	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:191:540:493	83	seq2	1273	99	35M	=	1432	194	AAAAGCCCATACTTTACTGCTACTCAATATATCCA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_81:7:324:472:791	147	seq2	1274	89	35M	=	1110	-199	AAAGCCAATACTTTACTGCTACTCAATATATCCAT	<<.)5*&;;11<<<,5<33:-<<6<<<<:<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS220_1:8:83:1456:1854	83	seq2	1275	99	35M	=	1117	-193	AAGCCCATACTTTACTGCTACTCAATATATCCATG	<<67<:<8<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:290:247:509	147	seq2	1276	99	35M	=	1450	209	AGCCCATACTTTACTGCTACTCAATATATCCATGT	<<<<<<<<<<<<<<<4<<<<<<92<;;;<;96;19	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:90:629:652	83	seq2	1276	99	35M	=	1456	215	AGCCCATACTTTACTGCTACTCAATATATCCATGT	<<<<<<<<<<<<<<<<<<<<<<<:<;<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:39:1671:1928	147	seq2	1276	99	35M	=	1453	212	AGCCCATACTTTACTGCTACTCAATATATCCATGT	<<<<<<<;<<<<;<<<<<4<<<;3<<<;<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:128:584:952	83	seq2	1277	99	35M	=	1101	-211	GCCCATACTTTACTGCTACTCAATATATCCATGTA	7<;9;0:<<<:<<:<<<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:61	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:28:979:519	147	seq2	1278	99	35M	=	1439	196	CCCATACTTTACTGCTACTCAATATATCCATGTAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:7:219:40:833	83	seq2	1278	99	35M	=	1094	-219	CCCATACTTTACTGCTACTCAATATATCCATGTAA	<<*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:1:289:207:323	147	seq2	1279	99	35M	=	1462	218	CCATACTTTACTGCTACTCAATATATCCATGTAAC	<<<:<<<<<:<<<<<<<<<<;<<899<<13)939;	MF:i:18	Aq:i:41	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:45:758:616	147	seq2	1280	99	35M	=	1473	228	CATACTTTACTGCTACTCAATATATCCATGTAACA	<<<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<;;<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:42:804:114	147	seq2	1281	99	35M	=	1452	206	ATACTTTACTGCTACTCAATATATCCATGTAACAA	<<<<<<<<<<<<<<<<<<<<<<<<<<:<:<;;<;;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:61:1885:163	83	seq2	1281	99	40M	=	1128	-193	ATACTTTACTGCTACTCAATATATCCATGTAACAAATCTG	;:;;;;<<8<<:<<:<;<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:79	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:282:962:46	83	seq2	1282	99	35M	=	1437	190	TACTTTACTGCTACTCAATATATCCATGTAACAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:6:143:620:158	83	seq2	1283	99	35M	=	1107	-211	ACTTTACTGCTACTCAATATATCCATGTAACAAAT	<4;<;<;<;6<<7<;<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:3:50:312:219	83	seq2	1288	99	35M	=	1146	-177	ACTGCTACTCAATATATCCATGTAACAAATCTGCG	<,;83:<::6<<<<<<<;:<;<<<<;<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_93:5:256:444:399	83	seq2	1289	99	35M	=	1133	-191	CTGCTACTCAATATATCCATGTAACAAATCTGCGC	;+549<:<.<<<<<<<;<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:1:17:595:863	83	seq2	1289	89	35M	=	1139	-185	AAGCTACTCAATATATCCATGTAACAAATCTGCGC	))55))+2&<<,:5<,0657<<<<:<:<:<<<<<<	MF:i:18	Aq:i:33	NM:i:2	UQ:i:16	H0:i:1	H1:i:0
+EAS1_105:6:23:885:274	147	seq2	1289	99	35M	=	1089	-235	CTACTACTCAATATATCCATGTAACAAATCTGCGC	2+*27==;;==<<.;:<=<=<==============	MF:i:18	Aq:i:51	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+EAS54_61:8:4:173:814	83	seq2	1289	99	35M	=	1111	-213	CTGCTACTCAATATATCCATGTAACAAATCTGCGC	<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:263:557:988	147	seq2	1289	84	35M	=	1108	-216	CTGCTACTCAATATATCCATGTAACAAATCTGCGC	1-41:<15+<<<<<<599<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:18	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:2:326:153:231	147	seq2	1290	43	35M	=	1477	222	TGCTACTCAATATATCCATGTAACAAATCTGCGCT	<<<<<<<<<9<<<<<<<<<,<<<<<<8<<8.;.;4	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:4:98:862:154	83	seq2	1290	99	35M	=	1116	-209	TGCTACTCAATATATCCATGTAACAAATCTGCGCT	856:;7<:<<9<<<9<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:2:6:529:366	147	seq2	1291	99	35M	=	1103	-223	GCTACTCAATATATCCATGTAACAAATCTGCGCTT	9;8;8<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:299:336:613	147	seq2	1293	99	35M	=	1145	-183	TACTCAATATATCCATGTAACAAATCTGCGCTTGT	1;4(+<<5<4<1<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:3
+B7_597:2:42:28:552	83	seq2	1294	99	35M	=	1131	-198	ACTCAATATATCCATGTAACAAATCTGCGCTTGTA	</8:<<:<<<;;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS114_39:3:55:464:146	147	seq2	1295	99	35M	=	1114	-216	CTCAATATATCCATGTAACAAATCTGCGCTTGTAC	;(;;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:2
+EAS54_67:6:109:953:668	83	seq2	1297	99	35M	=	1485	223	CAATATATCCATGTAACAAATCTGCGCTTGTACTT	;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<8<;<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:1
+EAS139_19:1:82:946:392	147	seq2	1297	99	40M	=	1493	236	CAATATATCCATGTAACAAATCTGCGCTTGTACTTCAAAA	<<<<<<<<<<<<<<<<<<<<<<<<<8<<<8<<8<<:4488	MF:i:18	Aq:i:74	NM:i:1	UQ:i:19	H0:i:1	H1:i:0
+EAS114_28:3:308:509:948	147	seq2	1298	99	36M	=	1123	-211	AATATATCCATGTAACAAATCTGCGCTTGTACTTCT	;;+;;;.8<<;;;<<<<<<<<<<<<<8<<<<<;<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:174:753:617	147	seq2	1299	75	35M	=	1136	-198	ATATATCCATGTAACAAATCTGCGCTTGTACTTCT	<;<;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:3:26:1867:162	83	seq2	1299	70	35M	=	1137	-197	ATATATCCATGTAACAAATCTGCGCTTGTACTTCT	97999:;<<9;;<:<<;;;<;;<<<<<<<;;<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:2:162:257:203	83	seq2	1301	99	35M	=	1114	-222	ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA	<;<;:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:62:841:1994	89	seq2	1301	70	35M	=	1301	-35	ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA	87878;;6:;;:<<<<:<:;;;<;<<<;<;;<;<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:5:62:841:1994	149	seq2	1301	0	*	=	1301	35	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	MF:i:-64
+EAS139_19:7:44:1807:833	83	seq2	1301	99	40M	=	1449	188	ATATCCATGTAACAAATCTGCGCTTGTACTTCTAAATCTA	<<<<<<<<<<<<<<<<<<<;<;<<<;<<9<<<<<89;;;:	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:7:280:607:113	147	seq2	1303	99	35M	=	1468	200	ATCCATGTAACAAATCTGCGCTTGTACTTCTAAAT	===================;===;=====<=7=9:	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:260:147:818	147	seq2	1303	82	35M	=	1497	229	ATCCATGTAACAAATCTGCGCTTTTACTTCTAAAT	<<<<<<3<<<<<;<<<<)<1<<<&<7<<<;<4/9<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS54_71:7:194:867:616	83	seq2	1303	99	34M	=	1481	213	ATCCATGTAACAAATCTGCGCTTGTACTTCTATT	<8<<<<<<<<<<<8<<4<<<<<<8<<3<<5<&(+	MF:i:18	Aq:i:67	NM:i:2	UQ:i:23	H0:i:1	H1:i:0
+EAS139_19:7:85:262:751	83	seq2	1305	99	40M	=	1105	-240	CCATGTAACAAATCTGCGCTTGTACTTCTAAATCTATAAC	22;99;<<8<<<<<<<;<;<<<<<;<<;<<<<<<<<<<<+	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_81:6:35:186:412	147	seq2	1306	99	35M	=	1139	-202	CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA	<<4:6<;<&<:4<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:8:46:1528:799	147	seq2	1306	96	35M	=	1109	-232	CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:5:124:978:501	147	seq2	1307	99	36M	=	1499	228	ATGTAACAAATCTGCGCTTGTACTTCTAAATCTATA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:88:866:774	147	seq2	1307	99	35M	=	1478	206	ATGTAACAAATCTGCTCTTGTACTTCTAAATCTAT	<<<;<<<<<;<<<<<<<<<<<<<<<<<68<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS221_1:6:4:1131:104	147	seq2	1307	99	35M	=	1487	215	ATGTAACAAATCTGCGCTTGTACTTCTAAATCTAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<::	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:6:178:342:866	83	seq2	1311	72	35M	=	1155	-191	AACAAATCTGCGCTTGTACTTCTAAATCTATAAAA	<<9<<<&;;<<<<77<;<<<5;:<<<:<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:1:119:880:781	147	seq2	1312	99	35M	=	1157	-190	ACAAATCTGCGCTTGTACTTCTAAATCTATAACAA	;8<<;<<<<:<84<<<<:<<<<<<<<<<<<<5<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+B7_591:2:46:220:58	83	seq2	1313	99	36M	=	1483	206	CAAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA	<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<:<;	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:2:47:591:698	147	seq2	1313	99	35M	=	1146	-202	CAAATCTGCGCTTGTACTTCTAAATCTATAACAAA	7;;;;:<<:<:<<<<<7<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_105:1:115:226:443	147	seq2	1314	99	35M	=	1137	-212	AAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA	<<;;<;<<<<<<<<<<<<:<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:198:59:675	83	seq2	1315	99	35M	=	1150	-200	AATCTGCGCTTGTACTTCTAAATCTATAACAAAAT	<<<<<4<4<:<<<;7<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS221_3:2:76:1729:813	147	seq2	1317	99	35M	=	1506	224	TCTGCGCTTGTACTTCTAAATCTATAAAAAAATTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:147:360:141	83	seq2	1319	47	35M	=	1501	218	TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA	<<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<7	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_95:7:155:530:532	83	seq2	1319	99	35M	=	1128	-226	TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA	:<<<><<8<<<<<><<<<<><<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS51_62:4:308:614:911	83	seq2	1319	90	35M	=	1493	209	TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA	<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<8<	MF:i:18	Aq:i:43	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS54_65:3:155:541:234	83	seq2	1319	99	35M	=	1151	-203	TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA	78;<7<<<<<<<<<<<<<<;<<<<<<<<<<;<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:175:289:351	147	seq2	1319	99	35M	=	1144	-210	TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA	9;;:+<<<<<;<<:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:283:186:707	83	seq2	1321	99	36M	=	1154	-203	CGCTTGTACTTCTAAATCTATAACAAAATTAAAATT	889;<7;<7<<7<<<<<7<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_105:3:308:66:538	147	seq2	1321	99	35M	=	1138	-218	CGCTTGTACTTCTAAATCTATAACAAAATTAAAAT	996999;<9;<:<<<<<:<<7<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_108:5:11:555:330	147	seq2	1321	99	35M	=	1492	206	CGCTTGTACTTCTAAATCTATAAAAAAATTAAAAT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<4<;<	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:7:84:411:336	73	seq2	1322	75	35M	*	0	0	GCTTGTACTTCTAAATCTATAAAAAAATTAAAATT	<<<;<<<;<<<<<<<<<<<<:<<;<<<<<<;8<;<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:5:52:1278:1478	147	seq2	1322	47	35M	=	1513	226	GCTTGTACTTCTAAATCTATAACAAAATTAAAATT	<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<9<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_53:3:101:809:776	147	seq2	1326	99	35M	=	1160	-201	GTACTTCTAAATCTATAAAAAAATTAAAATTTAAC	<<<-<;7;<<<<:;<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS192_3:3:221:881:916	147	seq2	1327	96	35M	=	1168	-194	TAATTCTAAATCTAGAACAAAATTAAAATTTAACA	44%-4(5<;9/,:<68:1<:8<:<<84;<<<<<;<	MF:i:18	Aq:i:24	NM:i:3	UQ:i:41	H0:i:0	H1:i:0
+EAS1_105:1:28:745:352	147	seq2	1329	99	35M	=	1159	-205	CTTCTAAATCTATAACAAAATTAAAATTTAACAAA	4;;*;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS114_45:2:23:1754:796	83	seq2	1329	99	35M	=	1488	194	CTTCTAAATCTATAAAAAAATTAAAATTTAACAAA	;<<;<;<;<;<;<<;;;;;<<<<;;<<<<<97999	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:96:419:327	147	seq2	1331	99	35M	=	1149	-217	TCTAAATCTATAACAAAATTAAAATTTAACAAAAG	;1<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS1_97:4:274:287:423	147	seq2	1332	75	35M	=	1515	218	CTAAATCTATAAAAAAATTAAAATTTAACAAAAGT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:7:35:392:2042	83	seq2	1332	99	35M	=	1168	-199	ATAAATCTATAAAAAAATTAAAATTTAACAAAAGT	+<<<<</<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS54_65:2:94:356:809	83	seq2	1334	99	35M	=	1151	-218	AAATCTATAACAAAATTAAAATTTAACAAAAGTAA	<<<<3<<<<;;<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:1	UQ:i:26	H0:i:0	H1:i:1
+EAS114_30:7:319:11:255	83	seq2	1337	92	35M	=	1179	-193	TCTATAAAAAAATTAAAATTTAACAAAAGTAAATA	;8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<	MF:i:18	Aq:i:17	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:7:35:538:1882	83	seq2	1337	98	35M	=	1160	-212	TCTATAACAAAATTAAAATTTAACAAAAGTAAATA	73797;;3<;;<6;;<<<;8:;:;<;:<:;<<;;;	MF:i:18	Aq:i:43	NM:i:1	UQ:i:18	H0:i:0	H1:i:1
+EAS51_66:1:64:182:741	153	seq2	1338	10	35M	*	0	0	AAAAAAACAAATTAAACTCTAACAAAAGTAAATAA	(+;1&(9*%0<*(*&<*5,/+<,&<&<<6<<<<<<	MF:i:32	Aq:i:10	NM:i:6	UQ:i:63	H0:i:0	H1:i:0
+EAS54_61:4:86:660:932	147	seq2	1338	99	35M	=	1154	-219	ATATAAAAAAATTAAAATTTAACAAAAGTAAATAA	&<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:71	NM:i:1	UQ:i:5	H0:i:1	H1:i:0
+EAS56_53:8:122:430:882	147	seq2	1338	99	35M	=	1147	-226	CTATAAAAAAATTAAAATTTAACAAAAGTAAATAA	0<<:<<<<<<<:3<<<<<<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:99:557:427	83	seq2	1342	99	35M	=	1186	-191	AACAAAATTAAAATTTAACAAAAGTAAATAAAACA	<<-<<<<9<<<<<:<<<<9<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:1	UQ:i:12	H0:i:1	H1:i:0
+B7_593:5:299:743:762	83	seq2	1345	99	36M	=	1173	-208	AAAATTAAAATTTAACAAAAGTAAATAAAACACATA	;<<<1<<<<<+<;<;7<<;<<<<<<<<<;<<;;<<7	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:303:428:326	83	seq2	1345	74	35M	=	1515	205	AAAATTAAAATTTAACAAAAGTAAATAAAACACAT	<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:4:192:714:341	83	seq2	1346	99	35M	=	1170	-211	AAATTAAAATTTAACAAAAGTAAATAAAACACATA	<<<3;<<<<9:<<</<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:1:189:876:833	83	seq2	1349	99	36M	=	1173	-212	TTAAAATTTAACAAAAGTAAATAAAACACATAGCTA	7;<<<<:;;<</<<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:7:37:79:581	147	seq2	1349	68	35M	=	1533	219	TTAAAATTTAAAAAAAGTAAATAAAACACATAGCT	<>4<>>>>;>>&>->9>9;4>->>>>,4>9>,<1>	MF:i:18	Aq:i:27	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS139_19:2:82:154:1333	83	seq2	1349	77	40M	=	1511	202	TTAAAATTTAACAAAAGTAAATAAAACACACAGCTAAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;:;:	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:1	H1:i:0
+EAS188_7:1:290:286:763	83	seq2	1349	75	35M	=	1515	201	TTAAAATTTAACAAAAGTAAATAAAACACATAGCT	<<<<<<<<<<<<<<<<7<<<<<<<<<<<<<<<8<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:3:248:1491	73	seq2	1349	99	35M	*	0	0	TTAAAATTTAACAAAAGTAAATAAAACACATAGCT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:8:<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:3:6:1064:1805	83	seq2	1350	99	35M	=	1502	187	TAAAATTTAACAAAAGTAAATAAAACACATAGCTA	<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_595:6:137:811:130	83	seq2	1351	99	35M	=	1175	-211	AAAATTTAACAAAAGTAAATAAAACACATAGCTAA	<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:155:809:543	83	seq2	1352	99	35M	=	1156	-231	AAATTTAACAAAAGTAAATAAAACACATAGCTAAA	<<<+0<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_63:3:41:468:459	83	seq2	1352	75	35M	=	1513	196	AAATTTAACAAAAGTAAATAAAACACATAGCTAAA	<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<;;7	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:4:31:622:216	73	seq2	1354	99	35M	*	0	0	ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<96<7	MF:i:18	Aq:i:70	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:8:105:854:975	147	seq2	1354	71	35M	=	1523	202	ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC	<<<<<<<<<<<<<<<<<<<<<<<<<<<7:<;;;;5	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:26:749:174	147	seq2	1357	78	35M	=	1183	-209	TAACAAAAGTAAATAAAACACATAGCTAAAACTAA	(<<)<<<<6<<<<<<<<<<&:<3<<<6<<<)<:<<	MF:i:18	Aq:i:11	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:6:21:553:57	147	seq2	1358	99	35M	=	1197	-196	AACAAAAGTAAATAAAACACATAGCTAAAACTAAA	<<+<<<<<<<<<;<<<<8<<<<<<8<<<<<;<<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:2:128:629:484	83	seq2	1359	96	35M	=	1185	-209	AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA	:(::<</*;<<99<<<-<;<<<<4<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:1	UQ:i:7	H0:i:1	H1:i:0
+EAS1_108:2:85:580:481	83	seq2	1359	99	35M	=	1167	-227	AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA	=)====77========8=3====3===========	MF:i:18	Aq:i:71	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+B7_589:8:139:727:808	83	seq2	1363	99	35M	=	1195	-203	AAGTAAATAAAACACATAGCTAAAACTAAAAAAGC	<<;<<<<<<<<<;<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:2:22:471:500	83	seq2	1365	99	35M	=	1200	-200	GTAAATAAAACACATAGCTAAAACTAAAAAAGCAA	=9===0====;=77<==8;====;===========	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_103:7:112:578:782	147	seq2	1366	89	35M	=	1183	-218	AAAATAAAACACATAGCTAAAACTAAAAAAGCAAA	+<<<%<<<<6<;<<<<6:<<<<:<<<<<<<<<<<<	MF:i:18	Aq:i:20	NM:i:1	UQ:i:10	H0:i:1	H1:i:0
+EAS221_3:4:81:687:1379	83	seq2	1366	99	35M	=	1210	-191	TAAATAAAACACATAGCTAAAACTAAAAAAGCAAA	<<<<<<<<<<<:<<<<:<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_65:3:320:20:250	83	seq2	1367	77	35M	=	1532	200	AAATAAAACACATAGCTAAAACTAAAAAAGCAAAA	<<<<<<<<<<<<<<<<<;<<<<<<<<<;+:<;<<3	MF:i:18	Aq:i:6	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:5:312:985:871	83	seq2	1369	99	35M	=	1212	-192	ATAAAACACATAGCTAAAACTAAAAAAGCAAAAAC	<8<<<<.<.<<<<:<<<<<.<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:6:12:484:836	83	seq2	1372	99	35M	=	1197	-210	AAACACATAGCTAAAACTAAAAAAGCAAAAACAAA	<<<<</<4<<&7<<<<;<<<<<<<<<<<<<1<<<<	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:176:402:458	83	seq2	1376	99	36M	=	1210	-202	AAATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA	</<+<4&;<<<<7<<<<<<<<;<<<<<<<<<<<<<<	MF:i:18	Aq:i:70	NM:i:1	UQ:i:14	H0:i:1	H1:i:0
+EAS139_11:7:50:1229:1313	147	seq2	1376	77	35M	=	1528	187	ACATAGCTAAAACTAAAAAAGCAAAAACAAAAACT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_65:4:124:367:72	83	seq2	1377	99	35M	=	1175	-237	CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA	,<<<8,<<<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:5:267:170:250	83	seq2	1377	99	35M	=	1189	-223	CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA	-<;<5-:<<<<;<<<<<<<;;<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS220_1:6:24:105:1046	147	seq2	1377	99	35M	=	1184	-228	CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA	+<<<</<<<<<.<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:4:38:557:1441	83	seq2	1381	99	35M	=	1212	-204	GATAAAAATAAAAAAGCAAAAACAAAAACTATGCT	<&<<<<<,<<<<<<<<8<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:45	NM:i:2	UQ:i:16	H0:i:0	H1:i:1
+EAS188_7:7:67:719:786	83	seq2	1383	43	35M	=	1218	-200	TAAAAAAAAAAAAGCAAAAACAAAAACTATGCTAA	$<<;<-1<<<8<<*&<;<;,<<3<<<<33<<<33<	MF:i:18	Aq:i:13	NM:i:2	UQ:i:28	H0:i:1	H1:i:0
+EAS114_39:2:5:1219:137	147	seq2	1384	99	35M	=	1209	-210	AAAACTAAAAAAGCAAAAACAAAAACTATGCTAAG	<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:7:68:242:834	83	seq2	1386	99	36M	=	1200	-222	AAATAAAAAAGCAAAAACAAAAACTATGCTAAGTAT	<<68<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:1	UQ:i:21	H0:i:1	H1:i:0
+EAS51_66:3:166:532:438	147	seq2	1386	99	35M	=	1194	-227	AACTAAAAAAGCAAAAACAAAAACTATGCTAAGTA	<<&7<<<<<<<+<<<<<:<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:4:139:989:144	83	seq2	1387	99	35M	=	1201	-221	ACTAAAAAAGCAAAAACAAAAACTATGCTAAGTAT	<&<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:3:81:12:1231	83	seq2	1391	99	35M	=	1228	-198	AAAAAGCAAAAACAAAAACTATGCTAAGTATTGGT	<<<<<<<7<<<<<<<5<'<6/<<<5<<<<<<2<<<	MF:i:18	Aq:i:71	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_57:8:72:44:435	147	seq2	1392	76	35M	=	1235	-192	AAAAGCAAAAACAAAAACTATGCTAAGTATTGGTA	<<<<;7;<<<<;<<<<<<<<<<;<<<;<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_95:2:211:954:174	147	seq2	1393	99	35M	=	1207	-221	AAAGAAAAAACAAAAACTATGCTAAGTATTGGTAA	====*=====6========================	MF:i:18	Aq:i:75	NM:i:1	UQ:i:9	H0:i:1	H1:i:0
+B7_595:7:149:123:265	83	seq2	1395	99	35M	=	1213	-217	AGCAAAAACAAAAACTATGCTAAGTATTGGTAAAG	<;&<<<<<:<<<<<<<<<<;<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_32:4:7:282:424	147	seq2	1397	83	35M	=	1233	-199	CAAAAACAAAAACTATGCTAAGTATTGTTAAAGAT	1<<<<<9<<<<<31<77;;;;7<3<<2+;<3<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:10	H0:i:0	H1:i:1
+B7_593:2:68:140:542	147	seq2	1398	95	36M	=	1217	-217	AAAAACAAAAACTATGCTAAGTATTGGTAAAGATGT	;;<<;7<<<<<<:<<<:<<<:<<<<<<<<<<<<<<<	MF:i:18	Aq:i:19	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_39:6:76:282:1668	147	seq2	1401	99	35M	=	1240	-196	AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG	<<<<<:<<<8<8<<<<<::<<<<7<<<<<<2<<<8	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:4:41:519:609	83	seq2	1401	99	35M	=	1229	-207	AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG	<4;<;<<<<<<<<;4:<<;<<<<<<<<<<<;<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_26:4:100:238:596	83	seq2	1403	56	35M	=	1220	-218	CAAAAACTATTCTAAGTATTGGTAAAGATGTGGGG	4<<<<;<3<3&<3<1<5<31<<3<<<<<<2<<;<,	MF:i:18	Aq:i:17	NM:i:1	UQ:i:5	H0:i:0	H1:i:1
+EAS51_64:3:255:45:399	83	seq2	1404	99	35M	=	1238	-201	AAAAACTATGCTAAGTATTGGTAAAGATGTGGGGA	<5<5<4$;;7/<<<177&7;<<<<<<;<<4<<<<<	MF:i:18	Aq:i:57	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:6:43:47:279	83	seq2	1405	99	35M	=	1206	-234	AAAACTATGCTAAGTATTGGTAAAGATGTGGGGAA	<:<<79<<<19<<<1<<9<<+<<<<<3<3<<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_78:7:215:516:299	147	seq2	1406	99	35M	=	1226	-215	AAGCTATGCTAAGTATTGGTAAAGATGTGGGGAAA	;;))7<8:855<<4<;:<<87<<<7<<;<<<*3<<	MF:i:18	Aq:i:64	NM:i:1	UQ:i:8	H0:i:1	H1:i:0
+B7_591:7:116:814:89	147	seq2	1408	99	36M	=	1231	-213	ACTATGCTAAGTATTGGTAAAGATGTGGGGAAAAAA	:38<;<;<<<<;<<<<<<<<<<<<<;<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_610:7:34:144:868	83	seq2	1412	76	35M	=	1226	-221	AGCTAAGGAATGGGAAAGGTGTGGGGAAAAAAGTA	&9+&7<&&0&<6<.0<<7<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:76	NM:i:4	UQ:i:50	H0:i:0	H1:i:0
+EAS51_62:7:312:236:655	83	seq2	1412	99	35M	=	1222	-225	TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA	<<8;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:6:17:1179:393	147	seq2	1412	99	35M	=	1232	-215	TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS188_7:6:107:447:488	83	seq2	1412	99	35M	=	1233	-214	TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA	<<3<<<<<<6<<<<<<<<<<<<<<<<7<<<<<<<<	MF:i:18	Aq:i:53	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:6:73:420:812	147	seq2	1414	66	35M	=	1232	-217	CTAAGTATTGGTAAAGATGTGGGGAAAAAAGTAAA	5'<<<,<&,<<,<<<<<7<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:3:215:840:760	83	seq2	1416	99	35M	=	1256	-195	AAGTATTGGTAAAGATGTGGGGAAAAAAGTAAACT	<<<8<::<;;<<<:<7<7<;;;<<<<<<<<<<;<<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_589:8:118:829:36	147	seq2	1417	99	35M	=	1233	-219	AGTATTGGTAAAGATGTGGGGAAAAAAGTAAACTC	<8<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:4:290:121:79	83	seq2	1420	99	35M	=	1257	-198	ATTGGTAAAGATGTGGGGAAAAAAGTAAACTCTCA	<1<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:8:174:557:872	83	seq2	1423	99	35M	=	1237	-221	GGTAAAGATGTGGGGAAAAAAGTAAACTCTCAAAT	.77<:<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:2:315:412:921	147	seq2	1424	99	35M	=	1254	-205	GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATA	4-<79;<<<4:;:<<<<<<<<4<<<38<<;<<<<<	MF:i:18	Aq:i:45	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:5:95:944:247	147	seq2	1424	99	40M	=	1238	-226	GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATATTGCT	:7::;<<<<<;;<<<<<<<<<<<<<<;<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_30:6:137:741:866	83	seq2	1429	99	35M	=	1268	-196	GATGAGGGGAAAAAAGTAAACTCTCAAATATTGCT	<;0:%<:9<<<:<<<<;<<:<<;0;<<<<<::<<6	MF:i:18	Aq:i:70	NM:i:1	UQ:i:4	H0:i:1	H1:i:0
+EAS188_7:6:191:540:493	147	seq2	1432	99	35M	=	1273	-194	GTGGGGAAAAAAGTAAACTCTCAAATATTGCTAGT	<<9<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:1:49:911:980	83	seq2	1434	99	35M	=	1241	-228	GGGGAAAAAAGTAAACTCTCAAATATTGCTAGTGG	44:7<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:62	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:1:248:122:558	83	seq2	1436	99	35M	=	1243	-228	GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA	<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:52	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:1:168:609:646	147	seq2	1436	99	36M	=	1264	-208	GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG	;;<<<<=======;;:;======;==<=========	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:4:7:1347:375	83	seq2	1436	99	35M	=	1271	-200	GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA	47999<<<;;;;;;:5;:;<;;<;;;;;<;;;;;<	MF:i:18	Aq:i:66	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:282:962:46	147	seq2	1437	99	35M	=	1282	-190	GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG	69<<<<<:<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_73:5:169:714:644	83	seq2	1437	99	35M	=	1231	-241	GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG	;<<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_11:1:84:92:1246	83	seq2	1437	99	35M	=	1265	-207	GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG	<<<<<<<<<<<<<<<8<<<<<<5<<<<<<<<<<<<	MF:i:18	Aq:i:78	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_34:7:71:62:254	83	seq2	1438	99	35M	=	1264	-209	AAAAAAGTAAACTCTCAAATATTGCTAGTGGGAGT	<<<<<<;8<<<<;<:<<<<<<<;<<;<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_97:7:28:979:519	83	seq2	1439	99	35M	=	1278	-196	AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA	<<<<<6<<<<<<<<<<<<<<<8<<<<<<<<6<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_1:1:63:28:1549	83	seq2	1439	77	35M	=	1247	-227	AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA	<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_593:7:15:244:876	147	seq2	1440	43	36M	=	1246	-230	AAAAGTAAACTCTCAAATATTGCTAGTGTGAGTATA	;<<<7<<<<<.2<-<<<<<<<<<:<<<<<<<<<2<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:27	H0:i:0	H1:i:1
+EAS56_59:8:80:542:549	83	seq2	1443	99	35M	=	1271	-207	AGTAAACTCTCAAATATTGCTAGTGGGAGTATAAA	=9====7=;=======;;==;========<=====	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_28:3:173:627:465	83	seq2	1444	99	36M	=	1260	-220	GTAAACTCTCAAATATTGCTAGTGGGAGTATAAATT	:<<<<;<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:51	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS219_FC30151:5:54:1351:910	147	seq2	1448	99	35M	=	1270	-213	ACTCTCAAATATTGCTAGTGGGAGTATAAATTGTT	<7<7;;<<<<<;<<;;<<;<<<<<<<<<<<<<<;<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS139_19:7:44:1807:833	147	seq2	1449	99	40M	=	1301	-188	CTCTCAAATATTGCTAGTGGGAGTATAAATTGTTTTCCAC	:6:9:<<<6<88<;<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:5:290:247:509	83	seq2	1450	99	35M	=	1276	-209	TCTCAAATATTGCTAGTGGGAGTATAAATTGTTTT	49';<<<<<8;<;;<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS112_32:7:42:804:114	83	seq2	1452	99	35M	=	1281	-206	TCAAATATTGCTAGTGGGAGTATAAATTGTTTTCC	;9<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS218_4:3:39:1671:1928	83	seq2	1453	99	35M	=	1276	-212	CAAATATTGCTAGTGGGAGTATAAATTGTTTTCCA	<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_59:5:90:629:652	147	seq2	1456	99	35M	=	1276	-215	ATATTGCTAGTGGGAGTATAAATTGTTTTCCACTT	<:<7::<:<<<<<8<<<<<<<<<<<<<<<<<<<7<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_66:1:289:207:323	83	seq2	1462	99	35M	=	1279	-218	CTAGTGGGAGTATAAATTGATTTCCACTTTGGAAA	&</<7<<:<7::<<<<+3<-7<<:<7<<<<<<<<<	MF:i:18	Aq:i:41	NM:i:1	UQ:i:12	H0:i:0	H1:i:1
+EAS1_95:7:280:607:113	83	seq2	1468	99	35M	=	1303	-200	GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT	18<-<<<<<<<<<<<<<8<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:72	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_99:3:21:423:169	147	seq2	1468	99	35M	=	1270	-233	GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT	;376;0<<<<99<<<<<<-;<4<<<<<<<<<;<<<	MF:i:18	Aq:i:68	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS56_61:3:45:758:616	83	seq2	1473	99	35M	=	1280	-228	ATAAATTGTTTTCCACTTTGGAAAACAATTTGGTA	<<;<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:54	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_64:2:326:153:231	83	seq2	1477	43	35M	=	1290	-222	ATTGTTTTCAACTTTGGAAAACAATTTGGTAATTT	::6=68=<*$;*=========6=============	MF:i:18	Aq:i:0	NM:i:1	UQ:i:3	H0:i:0	H1:i:1
+EAS192_3:3:88:866:774	83	seq2	1478	99	35M	=	1307	-206	TTGTTTTCCACTTTGGAAAACAATTTGGTAATTTC	<<<;<<<<:<<<<<:<8<<<<<<<<<<8<<<<<<<	MF:i:18	Aq:i:47	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_71:7:194:867:616	147	seq2	1481	99	35M	=	1303	-213	TTTTCCACTTTGGAAAACAATTTGGTAATTTCGTT	38:;;:<:<<<<;<<<<<<<<<<;<<<<<<<<<<<	MF:i:18	Aq:i:67	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_591:2:46:220:58	147	seq2	1483	99	36M	=	1313	-206	TTCCACTTTGGAAAACAATTTGGTAATTTCGTTTTT	98<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:75	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS54_67:6:109:953:668	147	seq2	1485	99	35M	=	1297	-223	CCACTTTGGAAAACAATTTGGTAATTTCGTTTTTT	<:)9<<<<<<<<8:<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:30	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_1:6:4:1131:104	83	seq2	1487	99	35M	=	1307	-215	ACTTTGGAAAACAATTTGGTAATTTCGTTTTTTTT	61;;;<<<<<<<<<;:<<<:<<;<<<<;<<<<<<<	MF:i:18	Aq:i:73	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS114_45:2:23:1754:796	147	seq2	1488	99	35M	=	1329	-194	CTTTGGAAAACAATTTGGTAATTTCGTTTTTTTTT	88897;;;;:;:;;;;;;;;;;;;;;;;;;;;;;;	MF:i:18	Aq:i:69	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS1_108:5:11:555:330	83	seq2	1492	99	35M	=	1321	-206	GGAAAACAATTTGGTAATTTCGTTTTTTTTTTTTT	6;6;9766+<<<<9:2=<===6=============	MF:i:18	Aq:i:56	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:4:308:614:911	147	seq2	1493	90	35M	=	1319	-209	AAAAACAATTTGGTAATTTAGTTTTTTTTTTTTTC	%<<<;:<::<6,<<<<<<:<:<<<<<<<<<<<<<<	MF:i:18	Aq:i:43	NM:i:2	UQ:i:31	H0:i:0	H1:i:1
+EAS139_19:1:82:946:392	83	seq2	1493	99	40M	=	1297	-236	GAAAACAATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTC	:;:;:,::<:;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:74	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS51_62:2:260:147:818	83	seq2	1497	82	35M	=	1303	-229	AAAATTTGGTAATTTAGTTTTTTTTTTTTTCTTTT	6.=..++==6=76==&===========99======	MF:i:18	Aq:i:41	NM:i:2	UQ:i:18	H0:i:0	H1:i:1
+B7_591:5:124:978:501	83	seq2	1499	99	36M	=	1307	-228	AATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTC	<9<;<<::<;<<;<4<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:77	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+B7_597:8:147:360:141	147	seq2	1501	47	13M1D22M	=	1319	-218	TTTGGTAATTTAGTTTTTTTTTTTTCTTTTCTCTT	<86<<<<73<7<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:-126	Aq:i:47	NM:i:1	UQ:i:27	H0:i:0	H1:i:0
+EAS114_39:3:6:1064:1805	147	seq2	1502	99	35M	=	1350	-187	TTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTCTT	;88<;<;;<<;;<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:76	NM:i:0	UQ:i:0	H0:i:1	H1:i:0
+EAS221_3:2:76:1729:813	83	seq2	1506	99	35M	=	1317	-224	TAATTTCGTTTTTTTTTTTTTCTTTTCTCTTTTTT	<+6<<<&1<<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:36	NM:i:0	UQ:i:0	H0:i:2	H1:i:0
+EAS54_65:6:326:71:741	153	seq2	1509	0	35M	*	0	0	TCTCGTTTTTTTTTCTTTCTTTTCTCTTTTTTTTT	!!<66<<<<<<<<<&<<7&<<<<:<*<<<<<<<<1	MF:i:32	Aq:i:0	NM:i:2	UQ:i:22	H0:i:1	H1:i:12
+EAS112_34:6:145:144:263	73	seq2	1509	0	35M	*	0	0	TTTCGTTTTTTTTTTTTTTTTTTCCCCTTTCTTTT	<<<<<<<<<<<<<<<<+4+4&+&(&&*2&8&&&)&	MF:i:32	Aq:i:0	NM:i:4	UQ:i:29	H0:i:0	H1:i:0
+EAS1_105:1:329:407:872	73	seq2	1510	0	35M	*	0	0	TTCGTTTTTTTTTTTTTTTTTTCCCTTTTTTTTTT	<<<<<<<<<<<<<<<<<<6;<<&4::<++<(&;<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:46	H0:i:0	H1:i:0
+EAS139_19:2:82:154:1333	147	seq2	1511	77	40M	=	1349	-202	TTTTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTTTTT	:5'::<<<;<<<<<<</3<<<&4&7<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:85	H1:i:85
+EAS56_63:3:41:468:459	147	seq2	1513	0	35M	=	1352	-196	TTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTT	+;<<<<<<<<<<<;&<<;;88&<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:85	H1:i:85
+EAS114_28:6:11:151:750	153	seq2	1513	5	36M	*	0	0	GTTTTTATTTTTTTCCTCTCTCTTTTTTTTTTTTTT	:'1:%4;4<<<+;6;&9+6;/<<<<<<<<<<<<<<<	MF:i:32	Aq:i:5	NM:i:3	UQ:i:41	H0:i:0	H1:i:3
+EAS139_11:5:52:1278:1478	83	seq2	1513	47	35M	=	1322	-226	GTTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTT	.8::<<<<<<<;<<<<<;<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:9	H1:i:85
+B7_591:2:309:798:997	153	seq2	1514	0	36M	*	0	0	TTTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT	466;<<744077+&7097&%&4<9<<<9<<<::<<<	MF:i:32	Aq:i:0	NM:i:1	UQ:i:5	H0:i:12	H1:i:85
+EAS1_93:6:218:144:794	89	seq2	1514	0	35M	=	1514	-35	TTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT	;92/;5:<6)+<5)67</9<&<&<<<:<<<57<<<	MF:i:64	Aq:i:0	NM:i:0	UQ:i:0	H0:i:22	H1:i:85
+EAS1_93:6:218:144:794	149	seq2	1514	0	*	=	1514	35	GGGTGCATTGCTATGTTGCGGTCGCTTTGCCTCCT	++(3:&)5<9035<3):-<53<+&&-+)<<&)&<6	MF:i:-64
+EAS1_97:6:222:305:337	153	seq2	1514	0	35M	*	0	0	TTTTTTTTTTTTTTTTTTCCCTTTTTTTTTTTTTT	;;;;;<<';<<<<*;<<<78;7<7<;<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:32	H0:i:0	H1:i:37
+EAS1_105:3:7:35:528	89	seq2	1514	0	35M	*	0	0	TTTTTTTTTTGTTCTTTACTCTTTTTTTTTTTTTT	<<<<<<<<<<5<<<(<<%<<-8<<<<<<<<<8<<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:24	H0:i:0	H1:i:0
+EAS54_65:2:182:924:833	137	seq2	1514	0	35M	*	0	0	TTTTTTTTTTTTTATTTGCGCTTTTTTTTTTTTTT	<<<<<<<<<<<<<)7<<)3/:07<<9<9<<==<7<	MF:i:32	Aq:i:0	NM:i:3	UQ:i:30	H0:i:0	H1:i:0
+EAS54_81:8:78:735:536	153	seq2	1514	0	35M	*	0	0	TTTTTTTTTTTTTCATTTCTCTTTTTTTTTTTTTT	;9<<<<<<<.7<9'%1<<)2::<<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:1	UQ:i:4	H0:i:0	H1:i:15
+EAS56_59:5:232:336:46	137	seq2	1514	0	35M	*	0	0	ATTTTTTTTTTTTCTTTTCTCTTGTTTCTTTTTTT	+<<<<<<<<<<<<6<<<<;<6<<&&<,3<<<<3,,	MF:i:32	Aq:i:0	NM:i:3	UQ:i:50	H0:i:0	H1:i:0
+EAS188_4:5:308:552:77	89	seq2	1514	0	35M	*	0	0	TTTTCTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT	1;-<%<;8<<<<<&<5-<58:5:<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:1	UQ:i:4	H0:i:30	H1:i:85
+B7_597:5:125:957:753	137	seq2	1515	0	35M	*	0	0	TTTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTT	<8<<<;<8;8//++(,(+++&++(/+008880;;/	MF:i:32	Aq:i:0	NM:i:2	UQ:i:14	H0:i:0	H1:i:1
+EAS1_97:4:274:287:423	83	seq2	1515	0	35M	=	1332	-218	TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT	7<<<<9<<9<<<.<<<<90-<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:12	H1:i:85
+EAS54_71:8:234:21:950	89	seq2	1515	0	33M	*	0	0	TTTTTTTTTTTTCTCCTCTCTTTTTTTTTTTTT	<<<<<<<<<&<;2;&-<,<+;<<<7<<<;<;<;	MF:i:32	Aq:i:0	NM:i:2	UQ:i:17	H0:i:0	H1:i:7
+EAS56_61:6:256:67:461	85	seq2	1515	0	*	=	1515	35	TCATGTTTGTGTCTTTCTATGCATTTTTTTTTTTT	!!7181!63:6-:!-163(-1%-18<<4<<<<<<<	MF:i:-64
+EAS56_61:6:256:67:461	153	seq2	1515	0	35M	=	1515	-35	TTGTTTTTTCTTCTTTTCTCTTTTTTTTTTTTTTT	*.%53.:)1+9;3397;1795507+335;.&51)5	MF:i:64	Aq:i:0	NM:i:2	UQ:i:14	H0:i:2	H1:i:85
+EAS56_65:8:317:83:500	153	seq2	1515	0	35M	*	0	0	TTTTTTTTTTTTCTTTTCTCCTTTTTTTTTTGTTT	;;;;;<<<<<<<3<<<)-;31<<)97<;9<<:<<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:41	H0:i:0	H1:i:0
+EAS114_30:2:303:428:326	147	seq2	1515	0	35M	=	1345	-205	TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT	4<;<<;<;<4<<8;;;;.8+;<<;<8<;<;<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:11	H1:i:85
+EAS188_7:1:290:286:763	147	seq2	1515	75	35M	=	1349	-201	TTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTTT	<<<<;<<<<<<<&<<<<&77<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:29	H1:i:85
+B7_591:7:89:67:709	89	seq2	1516	0	36M	*	0	0	TTTTTTTTTTTGTCTTCTCTTTTTTTTTTTTTTTTT	:7:::9:7:<<7<'<<477<<<<<<<<<:<<<<<:<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:28	H0:i:0	H1:i:17
+EAS56_65:3:47:64:359	89	seq2	1516	0	35M	*	0	0	TTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTTT	<<<6<<<<<<<4<4</9<4@<<;<<<<<<<<<<<<	MF:i:32	Aq:i:0	NM:i:2	UQ:i:33	H0:i:0	H1:i:6
+EAS56_65:4:296:78:421	89	seq2	1518	0	35M	=	1518	-35	TCTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTT	!!<<<:<<<<..<::<<<<<<<<<<<<<<<<<<<<	MF:i:64	Aq:i:0	NM:i:1	UQ:i:4	H0:i:85	H1:i:85
+EAS56_65:4:296:78:421	149	seq2	1518	0	*	=	1518	35	TGTTGGTGTTCGTTTTTTCTCCTGTTTCTTTTTCT	<<*<4<<<;:<0<<<<<<<<+;<9<<1<<;<<<+:	MF:i:-64
+EAS1_95:4:238:124:196	89	seq2	1519	0	35M	*	0	0	TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT	<0<9.<5.5<<<<9<1<<5<<85<5<<<9<:<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:85	H1:i:85
+EAS54_65:7:56:57:985	85	seq2	1519	0	*	=	1519	35	TTCTGTCTTCTCTCCTGTCTTCTTTTCTCTTCTTT	<9'<.<7<<2<<;77<7<<<<7<7<<<<7<<<2<<	MF:i:-64
+EAS54_65:7:56:57:985	153	seq2	1519	0	35M	=	1519	-35	TTTTTTCTCTTTTCTCTTTTTTTTTTTTTTTTTTT	666666*6&1666+64666666666&266666666	MF:i:64	Aq:i:0	NM:i:1	UQ:i:9	H0:i:85	H1:i:85
+EAS56_61:3:5:45:441	89	seq2	1519	0	35M	*	0	0	TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT	;;58:<:<(:<<11<&<1<<;<<<<><<<<<<<<<	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:82	H1:i:85
+B7_589:6:33:356:636	73	seq2	1520	0	35M	*	0	0	TTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTTT	<<<<<<<8;<<<<<<<<<<<<<7<<<<<<<;;3&3	MF:i:32	Aq:i:0	NM:i:0	UQ:i:0	H0:i:14	H1:i:85
+EAS114_45:6:86:859:1779	137	seq2	1520	0	35M	*	0	0	TTTTTTTCATTTCTCTTTTTTTTTTTTTTTTTTTT	;;;;;;;;;;;;;;;;;;;;;;;;;;;8;;)7699	MF:i:32	Aq:i:0	NM:i:1	UQ:i:26	H0:i:0	H1:i:15
+EAS54_71:8:105:854:975	83	seq2	1523	71	33M	=	1354	-202	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTG	<<<<;<:<<;<&<;<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:0	UQ:i:0	H0:i:85	H1:i:85
+EAS51_62:4:187:907:145	153	seq2	1524	28	35M	*	0	0	TTTCTTCTCTCTCTTTTTTTTTTTTTTTATTGCAT	<<<+;;,6<<<<6<<<<<<<<<<<<<<<<<<<<<<	MF:i:32	Aq:i:28	NM:i:3	UQ:i:59	H0:i:0	H1:i:0
+EAS54_71:4:284:269:882	73	seq2	1524	0	34M	*	0	0	TTTCTTTTCTCTTTTTTTTTTTTTTGTTTTTGCA	<;<<<<<8<7<8;<<<;<7<<<<<;272;73&&)	MF:i:32	Aq:i:0	NM:i:1	UQ:i:17	H0:i:0	H1:i:85
+EAS56_63:4:141:9:811	137	seq2	1524	10	35M	*	0	0	TTTCTTTTCTCCTTTTTTTTTTTTTTTTTCTACAT	<<<;<<<<<<<;<;<:<<<;<<<<<<<<..));;.	MF:i:32	Aq:i:0	NM:i:3	UQ:i:47	H0:i:2	H1:i:27
+EAS114_30:6:277:397:932	73	seq2	1524	0	35M	*	0	0	TTTCTTTTCACTTTTTTTTTTTTTTTTTTTTACTT	<<<<<<<<<<<<<<<<<<<<<<<<<<<<:8(,0%(	MF:i:32	Aq:i:0	NM:i:3	UQ:i:42	H0:i:2	H1:i:85
+EAS139_11:7:50:1229:1313	83	seq2	1528	77	35M	=	1376	-187	TTTTTTCTTTTTTTTTTTTTTTTTTTTGCATGCCA	<<<<,<&<7<<<<<<<<<<<<<<<<<<<<<<<<<<	MF:i:18	Aq:i:0	NM:i:1	UQ:i:11	H0:i:3	H1:i:7
+EAS54_65:3:320:20:250	147	seq2	1532	77	35M	=	1367	-200	TTTTTTTTTTTTTTTTTTTTTTTGCATGCCAGAAA	+'''/<<<<7:;+<;::<<<;;<<<<<<<<<<<<<	MF:i:18	Aq:i:6	NM:i:2	UQ:i:24	H0:i:1	H1:i:2
+EAS114_26:7:37:79:581	83	seq2	1533	68	35M	=	1349	-219	TTTTTTTTTTTTTTTTTTTTTTTCATGCCAGAAAA	3,,,===6===<===<;=====-============	MF:i:18	Aq:i:27	NM:i:2	UQ:i:23	H0:i:0	H1:i:1
diff --git a/tests/data/test_group_query/group.fofn.in b/tests/data/test_group_query/group.fofn.in
new file mode 100644
index 0000000..4af9e82
--- /dev/null
+++ b/tests/data/test_group_query/group.fofn.in
@@ -0,0 +1,3 @@
+ at PacBioBAM_TestsDir@/data/test_group_query/test1.bam
+ at PacBioBAM_TestsDir@/data/test_group_query/test2.bam
+ at PacBioBAM_TestsDir@/data/test_group_query/test3.bam
diff --git a/tests/data/test_group_query/test1.bam b/tests/data/test_group_query/test1.bam
new file mode 100644
index 0000000..f92d6bf
Binary files /dev/null and b/tests/data/test_group_query/test1.bam differ
diff --git a/tests/data/test_group_query/test2.bam b/tests/data/test_group_query/test2.bam
new file mode 100644
index 0000000..53c1d8f
Binary files /dev/null and b/tests/data/test_group_query/test2.bam differ
diff --git a/tests/data/test_group_query/test2.bam.pbi b/tests/data/test_group_query/test2.bam.pbi
new file mode 100644
index 0000000..1b0c1b9
Binary files /dev/null and b/tests/data/test_group_query/test2.bam.pbi differ
diff --git a/tests/data/test_group_query/test3.bam b/tests/data/test_group_query/test3.bam
new file mode 100644
index 0000000..5b8548b
Binary files /dev/null and b/tests/data/test_group_query/test3.bam differ
diff --git a/tests/data/unmap1.bam b/tests/data/unmap1.bam
new file mode 100644
index 0000000..98fd22c
Binary files /dev/null and b/tests/data/unmap1.bam differ
diff --git a/tests/data/unmap1.bam.bai b/tests/data/unmap1.bam.bai
new file mode 100644
index 0000000..dd19971
Binary files /dev/null and b/tests/data/unmap1.bam.bai differ
diff --git a/tests/data/unmap2.bam b/tests/data/unmap2.bam
new file mode 100644
index 0000000..8feed79
Binary files /dev/null and b/tests/data/unmap2.bam differ
diff --git a/tests/data/unmap2.bam.bai b/tests/data/unmap2.bam.bai
new file mode 100644
index 0000000..f495714
Binary files /dev/null and b/tests/data/unmap2.bam.bai differ
diff --git a/tests/files.cmake b/tests/files.cmake
new file mode 100644
index 0000000..ea69cac
--- /dev/null
+++ b/tests/files.cmake
@@ -0,0 +1,43 @@
+# test case headers
+set( PacBioBAMTest_H
+
+)
+
+# test case sources
+set( PacBioBAMTest_CPP
+
+    ${PacBioBAM_TestsDir}/src/test_Accuracy.cpp
+    ${PacBioBAM_TestsDir}/src/test_AlignmentPrinter.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamFile.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamHeader.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamRecord.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamRecordBuilder.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamRecordClipping.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamRecordImplCore.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamRecordImplTags.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamRecordImplVariableData.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamRecordMapping.cpp
+    ${PacBioBAM_TestsDir}/src/test_BamWriter.cpp
+    ${PacBioBAM_TestsDir}/src/test_Cigar.cpp
+    ${PacBioBAM_TestsDir}/src/test_DataSetCore.cpp
+    ${PacBioBAM_TestsDir}/src/test_DataSetIO.cpp
+    ${PacBioBAM_TestsDir}/src/test_DataSetQuery.cpp
+    ${PacBioBAM_TestsDir}/src/test_DataSetXsd.cpp
+    ${PacBioBAM_TestsDir}/src/test_EndToEnd.cpp
+    ${PacBioBAM_TestsDir}/src/test_EntireFileQuery.cpp
+    ${PacBioBAM_TestsDir}/src/test_Frames.cpp
+    ${PacBioBAM_TestsDir}/src/test_GenomicIntervalQuery.cpp
+    ${PacBioBAM_TestsDir}/src/test_GroupQuery.cpp
+    ${PacBioBAM_TestsDir}/src/test_IndexedFastaReader.cpp
+    ${PacBioBAM_TestsDir}/src/test_Intervals.cpp
+    ${PacBioBAM_TestsDir}/src/test_PacBioIndex.cpp
+    ${PacBioBAM_TestsDir}/src/test_PolymeraseStitching.cpp
+    ${PacBioBAM_TestsDir}/src/test_QualityValues.cpp
+    ${PacBioBAM_TestsDir}/src/test_ReadGroupInfo.cpp
+    ${PacBioBAM_TestsDir}/src/test_SequenceUtils.cpp
+    ${PacBioBAM_TestsDir}/src/test_Tags.cpp
+    ${PacBioBAM_TestsDir}/src/test_TimeUtils.cpp
+    # ${PacBioBAM_TestsDir}/src/test_UnmappedReadsQuery.cpp
+    ${PacBioBAM_TestsDir}/src/test_ZmwQuery.cpp
+
+)
diff --git a/tests/src/CSharp/CheckSWIG.cs b/tests/src/CSharp/CheckSWIG.cs
new file mode 100644
index 0000000..d748774
--- /dev/null
+++ b/tests/src/CSharp/CheckSWIG.cs
@@ -0,0 +1,15 @@
+
+
+using PacBio.BAM;
+
+public class CheckSWIG
+{
+   public static void Main()
+   {
+       var header = new BamHeader();
+       header.ToSam();
+       System.Console.WriteLine("");
+       System.Console.WriteLine("pbbam SWIG binding to C# worked!");
+       System.Console.WriteLine("");
+   }
+}
diff --git a/tests/src/CSharp/TestPbbam.cs.in b/tests/src/CSharp/TestPbbam.cs.in
new file mode 100644
index 0000000..efb2a11
--- /dev/null
+++ b/tests/src/CSharp/TestPbbam.cs.in
@@ -0,0 +1,119 @@
+#pragma warning disable 168, 219
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+
+using PacBio.BAM;
+
+namespace TestStuff
+{
+    //
+    // This approach is the best we can do for now, without requiring nunit.
+    //
+    public class TestPbbam
+    {
+        public static readonly string DATA_DIR = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "/TestData";
+        public static readonly string BAM_FILENAME_1 = Path.Combine(DATA_DIR, "test_group_query", "test1.bam");
+        public static readonly string BAM_FILENAME_2 = Path.Combine(DATA_DIR, "test_group_query", "test2.bam");
+        public static readonly string FASTA_FILENAME = Path.Combine(DATA_DIR, "lambdaNEB.fa");
+
+        public TestPbbam ()
+        {
+        }
+
+        public static void TestExceptions()
+        {
+            try
+            {
+                var badFile = new BamFile("nonexistent.bam");
+            }
+            catch (Exception e)
+            {
+                //Console.Write(e.ToString());
+                Console.WriteLine("Exceptions - OK!");
+                return;
+            }
+            throw new Exception("doh!");
+        }
+
+
+        public static void TestCigar()
+        {
+            string s = "3=3I3D";
+            var c = new CigarType(s);
+            string cs = c.ToStdString();
+            if (s != cs)
+            {
+                throw new Exception("Cigar not working!");
+            }
+
+            // This used to crash
+            var c2 = CigarType.FromStdString("3=3I3D");
+
+            Console.WriteLine("TestCigar - OK!");
+        }
+
+        public static void TestBamFileEnumeration()
+        {
+            var bf = new BamFile(BAM_FILENAME_2);
+            var q = new EntireFileQuery(new DataSet(bf));
+
+            if (q.Count() !=  4)
+            {
+                throw new Exception("Enumeration not working!");
+            }
+
+            Console.WriteLine("TesBamFileEnumeration - OK!");
+        }
+
+        public static void TestIndexedFasta()
+        {
+            var f = new IndexedFastaReader(FASTA_FILENAME);
+            bool check = (f.NumSequences() == 1  &&
+                          f.HasSequence("lambda_NEB3011") &&
+                          f.Subsequence("lambda_NEB3011:0-10") == "GGGCGGCGAC");
+            if (!check)
+            {
+                throw new Exception("Indexed FASTA files not working");
+            }
+
+            var b = new BamRecord();
+            var x = b.Impl();
+
+            Console.WriteLine("TestIndexedFasta - OK!");
+        }
+
+        public static void TestZmwQuery()
+        {
+            var d = new DataSet(BAM_FILENAME_2);
+            var q = new ZmwQuery(new IntList {1, 2, 3}, d);
+            var q2 = new ZmwQuery(new IntList { 14743 }, d);
+
+            if (0 != q.Count() || 4 != q2.Count())
+            {
+                throw new Exception("ZmwQuery not working");
+            }
+            Console.WriteLine("TestZmwQuery - OK!");
+        }
+
+        public void RunAllTests()
+        {
+            TestExceptions();
+            TestCigar();
+            TestBamFileEnumeration();
+            TestIndexedFasta();
+            TestZmwQuery();
+        }
+
+        public static void Main()
+        {
+            var t = new TestPbbam();
+            t.RunAllTests();
+        }
+
+    }
+}
diff --git a/tests/src/CSharp/buildAssembly.sh.in b/tests/src/CSharp/buildAssembly.sh.in
new file mode 100644
index 0000000..30313e2
--- /dev/null
+++ b/tests/src/CSharp/buildAssembly.sh.in
@@ -0,0 +1,91 @@
+#!/bin/bash
+set -euo pipefail
+set -x
+
+
+# This is a temporary hack to build windows C# bindings, while I work on getting it
+# to work nicely through CMake --DHA
+
+# UNIX setup (before doing this!)
+#  - install swig, cmake, and mono
+#
+# Windows setup (before doing this!):
+#  - install msys2 (64-bit) from https://msys2.github.io/
+#  - install: (pacman -S [package-name]); in all cases use the mingw-w64 64bit version when
+#    available:
+#   + gcc, g++, make
+#   + zlib-dev
+#   + swig
+#   + cmake
+#  - for cmake, generate MSYS makefiles
+
+if [ ${WIN32} ]; then
+    PLATFORM="Windows"
+else
+    PLATFORM="Unix"
+fi
+
+MSBUILD=${CSHARP_PROJECT_BUILDER}
+CSC=${CSHARP_COMPILER}
+
+CSPROJ_ROOT=${PacBioBAM_CSharpLibDir}
+CSPROJ=${PacBioBAM_CSharpLibDir}/PacBio.BAM.csproj
+ASSEMBLY_ROOT=${PacBioBAM_CSharpLibDir}/bin/Debug
+
+#
+# Make the managed DLL
+#
+( cd $CSPROJ_ROOT; $MSBUILD $CSPROJ ) || { echo "Failed to build managed DLL" && exit -1; }
+
+#
+# Copy the dependency libs
+#
+cp ${PacBioBAM_LibDir}/libpbbam${CMAKE_SHARED_LIBRARY_SUFFIX}  $ASSEMBLY_ROOT
+cp ${HTSLIB_LIBRARIES}                                         $ASSEMBLY_ROOT  # Need "libhts*.dylib"
+
+if [ "$PLATFORM" == "Windows" ]
+then
+    # stuff we need to bundle on windows
+    cp /mingw64/bin/zlib1.dll                                 $ASSEMBLY_ROOT
+    cp /mingw64/bin/libwinpthread-1.dll                       $ASSEMBLY_ROOT
+    cp ${PacBioBAM_CSharpLibDir}/libPacBioBam.dll             $ASSEMBLY_ROOT/PacBioBam.dll
+else
+    # For UNIX this is .so, even Mac.  Not sure why.
+    cp ${PacBioBAM_CSharpLibDir}/libPacBioBam.so              $ASSEMBLY_ROOT
+    cp ${HTSLIB_LIBRARIES_VERSIONED_LINK}                     $ASSEMBLY_ROOT  # Need "libhts*.dylib"
+fi
+
+# Bundle test data
+mkdir -p $ASSEMBLY_ROOT/TestData
+cp -rf ${PacBioBAM_TestsDir}/data/* $ASSEMBLY_ROOT/TestData
+
+#
+# Make the "check" program, which we need to put next to the assembly to
+# allow it to be resolved.
+#
+
+CHECK_SRC=${CSharpTestRootDir}/CheckSWIG.cs
+CHECK_BIN=$ASSEMBLY_ROOT/CheckSWIG.exe
+
+
+if [ "$PLATFORM" == "Windows" ]
+then
+    ( $CSC  /lib:$ASSEMBLY_ROOT //r:PacBio.BAM.dll /out:$CHECK_BIN $(cygpath -w $CHECK_SRC) && $CHECK_BIN)
+else
+    ( $CSC  /lib:$ASSEMBLY_ROOT /r:PacBio.BAM.dll /out:$CHECK_BIN $CHECK_SRC && cd $ASSEMBLY_ROOT && mono CheckSWIG.exe )
+fi
+
+
+#
+# Build the fuller test suite, and bundle 
+#
+TEST_SRC=${CSharpTestRootDir}/TestPbbam.cs
+TEST_BIN=$ASSEMBLY_ROOT/TestPbbam.exe
+
+
+if [ "$PLATFORM" == "Windows" ]
+then
+    ( $CSC /lib:$ASSEMBLY_ROOT //r:PacBio.BAM.dll /out:$TEST_BIN $(cygpath -w $TEST_SRC) && $TEST_BIN )
+else
+    ( $CSC /lib:$ASSEMBLY_ROOT /r:PacBio.BAM.dll /out:$TEST_BIN $TEST_SRC && cd $ASSEMBLY_ROOT && mono TestPbbam.exe )
+fi
diff --git a/tests/src/CSharp/check_swig.sh.in b/tests/src/CSharp/check_swig.sh.in
new file mode 100755
index 0000000..ba07b75
--- /dev/null
+++ b/tests/src/CSharp/check_swig.sh.in
@@ -0,0 +1,18 @@
+#!/bin/sh
+(cd ${PacBioBAM_CSharpLibDir}; xbuild PacBio.BAM.csproj)
+
+${CSHARP_COMPILER} -lib:${PacBioBAM_CSharpLibDir}/bin/Debug -r:PacBio.BAM.dll CheckSWIG.cs
+
+#
+# For deployment these all need to be installed somewhere more sensible.
+# This is just a hack for testing if the build works.
+#
+LIBRARY_PATHS=\
+${PacBioBAM_CSharpLibDir}:\
+${PacBioBAM_LibDir}:\
+${Htslib_LibDir}
+
+DYLD_LIBRARY_PATH=$LIBRARY_PATHS \
+LD_LIBRARY_PATH=$LIBRARY_PATHS \
+MONO_PATH=${PacBioBAM_CSharpLibDir}/bin/Debug \
+mono CheckSWIG.exe
diff --git a/tests/src/R/check_swig.R.in b/tests/src/R/check_swig.R.in
new file mode 100644
index 0000000..13b07c4
--- /dev/null
+++ b/tests/src/R/check_swig.R.in
@@ -0,0 +1,58 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+# load PacBioBAM lib & wrapper script
+
+# htslib_libname <- "@Htslib_Libraries@"
+# dyn.load(htslib_libname)
+# # htslib_libname <- paste(htslib_libpath, "libhts", sep="/")
+# # dyn.load(paste(htslib_libname, ".dylib", sep=""))
+
+pbbam_libpath <- "@PacBioBAM_RLibDir@"
+pbbam_libname <- paste(pbbam_libpath, "PacBioBam",   sep="/")
+dyn.load(paste(pbbam_libname,  .Platform$dynlib.ext, sep=""))
+
+pbbam_wrapper <- paste(pbbam_libpath, "PacBioBam.R", sep="/")
+source(pbbam_wrapper)
+
+cacheMetaData(1)
+
+h <- BamHeader() 
+
+message = "\nR Wrapper OK.\n"
+cat(message)
+cat("\n")
diff --git a/tests/src/R/test_pbbam.R b/tests/src/R/test_pbbam.R
new file mode 100644
index 0000000..55c71a8
--- /dev/null
+++ b/tests/src/R/test_pbbam.R
@@ -0,0 +1,23 @@
+
+# usage: R [args] < test_pbbam.R --args <tests_scripts_dir> <PacBioBam_lib_dir> <test_data_dir>
+args <- commandArgs(TRUE)
+tests_path     <- args[1]
+lib_path       <- args[2]
+test_data_path <- args[3]
+
+# load PacBioBAM lib & wrapper script
+pbbam_libname <- paste(lib_path, "PacBioBam",   sep="/")
+pbbam_wrapper <- paste(lib_path, "PacBioBam.R", sep="/")
+dyn.load(paste(pbbam_libname, .Platform$dynlib.ext, sep=""))
+source(pbbam_wrapper)
+cacheMetaData(1)
+
+# init test utils & run test cases
+source(paste(tests_path, "utils.R", sep="/"))
+run_test_suite(tests_path)
+
+# print results & exit
+results <- test_suite_results()
+results$print_summary()
+if (results$any_failed())
+	quit(status=1)
diff --git a/tests/src/R/test_pbbam.sh.in b/tests/src/R/test_pbbam.sh.in
new file mode 100644
index 0000000..af6eb89
--- /dev/null
+++ b/tests/src/R/test_pbbam.sh.in
@@ -0,0 +1,45 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+#! /usr/bin/sh
+
+R --slave --no-save < @RTestRootDir@/test_pbbam.R --args \
+	@RTestRootDir@/tests \
+	@PacBioBAM_RLibDir@ \
+	@PacBioBAM_TestsDir@/data
+	
+rm @PacBioBAM_TestsDir@/data/generated.bam
diff --git a/tests/src/R/tests/test_Accuracy.R b/tests/src/R/tests/test_Accuracy.R
new file mode 100644
index 0000000..bc29eb0
--- /dev/null
+++ b/tests/src/R/tests/test_Accuracy.R
@@ -0,0 +1,53 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+test_case("Accuracy_Clamp", {
+	
+    a_zero     <- Accuracy(0)
+    a_neg      <- Accuracy(-1)
+    a_min      <- Accuracy(0)
+    a_normal   <- Accuracy(300)
+    a_max      <- Accuracy(1000)
+    a_tooLarge <- Accuracy(2000)
+	
+    assertEqual(0L,    a_zero$ToInt())
+    assertEqual(0L,    a_neg$ToInt())
+    assertEqual(0L,    a_min$ToInt())
+    assertEqual(300L,  a_normal$ToInt())
+    assertEqual(1000L, a_max$ToInt())
+    assertEqual(1000L, a_tooLarge$ToInt())
+})
diff --git a/tests/src/R/tests/test_BamFile.R b/tests/src/R/tests/test_BamFile.R
new file mode 100644
index 0000000..41e419c
--- /dev/null
+++ b/tests/src/R/tests/test_BamFile.R
@@ -0,0 +1,77 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+test_case("BamFile_NonExistentFile", {
+	result <- tryCatch(
+		{
+			f <- BamFile("does_not_exist.bam")
+			assertTrue(FALSE) # should have thrown
+			invisible()
+		},
+		warning = function(w) {
+			assertTrue(TRUE)
+			invisible()
+		},
+		error = function(e) {
+			assertTrue(TRUE) 
+			invisible()
+		}
+	)
+	return(result)
+})
+
+test_case("BamFile_Ctor", {
+	
+	fn <- paste(test_data_path, "ex2.bam", sep="/")
+	
+	result <- tryCatch(
+		{
+			f <- BamFile(fn)
+			assertFalse(f$IsPacBioBAM())
+			invisible()
+		},
+		warning = function(w) {
+			assertTrue(TRUE)
+			invisible()
+		},
+		error = function(e) {
+			assertTrue(FALSE)    # should not throw
+			invisible()
+		}
+	)
+	return(result)
+})
diff --git a/tests/src/R/tests/test_BamHeader.R b/tests/src/R/tests/test_BamHeader.R
new file mode 100644
index 0000000..eab44e5
--- /dev/null
+++ b/tests/src/R/tests/test_BamHeader.R
@@ -0,0 +1,193 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+empty_program <- function(header) {
+	result <- tryCatch(
+		{
+			pg <- header$Program("foo")
+			assertTrue(FALSE) # should have thrown 
+			invisible()
+		},
+		warning = function(w) {
+			assertTrue(TRUE)
+			invisible()
+		}
+	)
+	return(result)
+}
+
+empty_readgroup <- function(header) {
+	result <- tryCatch(
+		{
+			pg <- header$ReadGroup("foo")
+			assertTrue(FALSE) # should have thrown 
+			invisible()
+		},
+		warning = function(w) {
+			assertTrue(TRUE)
+			invisible()
+		}
+	)
+	return(result)
+}
+
+empty_sequenceid <- function(header) {
+	result <- tryCatch(
+		{
+			pg <- header$SequenceId("foo")
+			assertTrue(FALSE) # should have thrown 
+			invisible()
+		},
+		warning = function(w) {
+			assertTrue(TRUE)
+			invisible()
+		}
+	)
+	return(result)
+}
+
+test_case("BamHeader_Defaults", {
+	
+    header <- BamHeader()
+	
+	assertEqual(0L, nchar(header$Version()))
+	assertEqual(0L, nchar(header$SortOrder()))
+	assertTrue(header$ReadGroups()$empty())
+	assertTrue(header$Sequences()$empty())
+	assertTrue(header$Programs()$empty())
+	
+	pg <- empty_program(header)
+	rg <- empty_readgroup(header)
+	id <- empty_sequenceid(header)
+	
+	# TODO: get comment fetching working
+	#assertEqual(1, length(header$Comments()))
+})
+
+test_case("BamHeader_Decode", { 
+	
+    text <- paste("@HD\tVN:1.1\tSO:queryname\tpb:3.0b3",
+			      "@SQ\tSN:chr1\tLN:2038\tSP:chocobo",
+				  "@SQ\tSN:chr2\tLN:3042\tSP:chocobo",
+				  "@RG\tID:rg1\tSM:control",
+				  "@RG\tID:rg2\tSM:condition1",
+				  "@RG\tID:rg3\tSM:condition1",
+				  "@PG\tID:_foo_\tPN:ide",
+				  "@CO\tipsum and so on",
+				  "@CO\tcitation needed",
+				  sep="\n"
+	             )
+				
+	header <- BamHeader(text)
+	
+	assertEqual("1.1",       header$Version())
+	assertEqual("queryname", header$SortOrder())
+	assertEqual("3.0b3",     header$PacBioBamVersion())
+
+	assertEqual(3L, header$ReadGroups()$size())
+	assertTrue(header$HasReadGroup("rg1"))
+	assertTrue(header$HasReadGroup("rg2"))
+	assertTrue(header$HasReadGroup("rg3"))
+	assertEqual("control",    header$ReadGroup("rg1")$Sample())
+	assertEqual("condition1", header$ReadGroup("rg2")$Sample())
+	assertEqual("condition1", header$ReadGroup("rg3")$Sample())
+	
+	assertEqual(2L, header$Sequences()$size())
+	assertTrue(header$HasSequence("chr1"))
+	assertTrue(header$HasSequence("chr2"))
+	assertEqual("chocobo", header$Sequence("chr1")$Species())
+	assertEqual("chocobo", header$Sequence("chr2")$Species())
+	assertEqual("2038",    header$Sequence("chr1")$Length())
+	assertEqual("3042",    header$Sequence("chr2")$Length())
+  
+	assertEqual(1L, header$Programs()$size())
+	assertTrue(header$HasProgram("_foo_"))
+	assertEqual("ide", header$Program("_foo_")$Name())
+
+	# TODO: get comment fetching working
+	# assertEqual(2, header$Comments()$size())
+	# assertEqual("ipsum and so on", header$Comments()[1])
+	# assertEqual("citation needed", header$Comments()[2])
+})
+	
+test_case("BamHeader_Encode", { 
+	
+    expectedText <- paste("@HD\tVN:1.1\tSO:queryname\tpb:3.0b3",
+			              "@SQ\tSN:chr1\tLN:2038\tSP:chocobo",
+				          "@SQ\tSN:chr2\tLN:3042\tSP:chocobo",
+				          "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control",
+				          "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1",
+				          "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1",
+				          "@PG\tID:_foo_\tPN:ide",
+				          "@CO\tipsum and so on",
+				          "@CO\tcitation needed",
+						  "",
+				          sep="\n"
+	                     )
+
+	rg1 <- ReadGroupInfo("rg1")
+	rg1$Sample("control")
+	rg2 <- ReadGroupInfo("rg2")
+	rg2$Sample("condition1")
+	rg3 <- ReadGroupInfo("rg3")
+	rg3$Sample("condition1")
+
+	seq1 <- SequenceInfo("chr1")
+	seq1$Length("2038")
+	seq1$Species("chocobo")
+	seq2 <- SequenceInfo("chr2")
+	seq2$Length("3042")
+	seq2$Species("chocobo")
+    
+	prog1 <- ProgramInfo("_foo_")
+	prog1$Name("ide")
+
+	header <- BamHeader()
+	header$Version("1.1")
+	header$SortOrder("queryname")
+	header$PacBioBamVersion("3.0b3")
+	header$AddReadGroup(rg1)
+	header$AddReadGroup(rg2)
+	header$AddReadGroup(rg3)
+	header$AddSequence(seq1)
+	header$AddSequence(seq2)
+	header$AddProgram(prog1)
+	header$AddComment("ipsum and so on")
+	header$AddComment("citation needed")
+	
+	assertEqual(expectedText, header$ToSam())
+})
diff --git a/tests/src/R/tests/test_Cigar.R b/tests/src/R/tests/test_Cigar.R
new file mode 100644
index 0000000..dd3e544
--- /dev/null
+++ b/tests/src/R/tests/test_Cigar.R
@@ -0,0 +1,219 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+test_case("Cigar_TypeToChar", {
+    assertEqual('M', CigarOperation_TypeToChar('ALIGNMENT_MATCH'))
+	assertEqual('I', CigarOperation_TypeToChar('INSERTION'))
+	assertEqual('D', CigarOperation_TypeToChar('DELETION'))
+	assertEqual('N', CigarOperation_TypeToChar('REFERENCE_SKIP'))
+	assertEqual('S', CigarOperation_TypeToChar('SOFT_CLIP'))
+	assertEqual('H', CigarOperation_TypeToChar('HARD_CLIP'))
+	assertEqual('P', CigarOperation_TypeToChar('PADDING'))
+	assertEqual('=', CigarOperation_TypeToChar('SEQUENCE_MATCH'))
+	assertEqual('X', CigarOperation_TypeToChar('SEQUENCE_MISMATCH'))
+})
+
+test_case("Cigar_CharToType", {
+	
+    assertEqual('ALIGNMENT_MATCH',   CigarOperation_CharToType('M'))
+    assertEqual('INSERTION',         CigarOperation_CharToType('I'))
+    assertEqual('DELETION',          CigarOperation_CharToType('D'))
+    assertEqual('REFERENCE_SKIP',    CigarOperation_CharToType('N'))
+    assertEqual('SOFT_CLIP',         CigarOperation_CharToType('S'))
+    assertEqual('HARD_CLIP',         CigarOperation_CharToType('H'))
+    assertEqual('PADDING',           CigarOperation_CharToType('P'))
+    assertEqual('SEQUENCE_MATCH',    CigarOperation_CharToType('='))
+    assertEqual('SEQUENCE_MISMATCH', CigarOperation_CharToType('X'))
+})
+
+test_case("Cigar_SetType", {
+	
+    m = CigarOperation()
+    i = CigarOperation()
+    d = CigarOperation()
+    n = CigarOperation()
+    s = CigarOperation()
+    h = CigarOperation()
+    p = CigarOperation()
+    e = CigarOperation()
+    x = CigarOperation()
+    
+    m$Type('ALIGNMENT_MATCH')
+    i$Type('INSERTION')
+    d$Type('DELETION')
+    n$Type('REFERENCE_SKIP')
+    s$Type('SOFT_CLIP')
+    h$Type('HARD_CLIP')
+    p$Type('PADDING')
+    e$Type('SEQUENCE_MATCH')
+    x$Type('SEQUENCE_MISMATCH')
+    
+    assertEqual('M', m$Char())
+    assertEqual('I', i$Char())
+    assertEqual('D', d$Char())
+    assertEqual('N', n$Char())
+    assertEqual('S', s$Char())
+    assertEqual('H', h$Char())
+    assertEqual('P', p$Char())
+    assertEqual('=', e$Char())
+    assertEqual('X', x$Char())
+})
+
+test_case("Cigar_SetChar", {
+	
+    m = CigarOperation()
+    i = CigarOperation()
+    d = CigarOperation()
+    n = CigarOperation()
+    s = CigarOperation()
+    h = CigarOperation()
+    p = CigarOperation()
+    e = CigarOperation()
+    x = CigarOperation()
+
+    m$Char('M')
+    i$Char('I')
+    d$Char('D')
+    n$Char('N')
+    s$Char('S')
+    h$Char('H')
+    p$Char('P')
+    e$Char('=')
+    x$Char('X')
+
+    assertEqual('ALIGNMENT_MATCH',   m$Type())
+    assertEqual('INSERTION',         i$Type())
+    assertEqual('DELETION',          d$Type())
+    assertEqual('REFERENCE_SKIP',    n$Type())
+    assertEqual('SOFT_CLIP',         s$Type())
+    assertEqual('HARD_CLIP',         h$Type())
+    assertEqual('PADDING',           p$Type())
+    assertEqual('SEQUENCE_MATCH',    e$Type())
+    assertEqual('SEQUENCE_MISMATCH', x$Type())
+})
+
+test_case("Cigar_CigarOpCtors", {
+
+	c1 <- CigarOperation("S", 10)
+	c2 <- CigarOperation(CigarOperation_TypeToChar('SOFT_CLIP'), 10)
+
+	assertEqual('S', c1$Char())
+	assertEqual('S', c2$Char())
+	assertEqual('SOFT_CLIP', c1$Type())
+	assertEqual('SOFT_CLIP', c2$Type())
+	assertEqual(10L, c1$Length())
+	assertEqual(10L, c2$Length())
+})
+
+test_case("Cigar_FromEmptyString", {
+	
+	s <- ""
+	cigar <- Cigar(s)
+	assertEqual(0L, cigar$size())
+})
+
+test_case("Cigar_FromString", {
+	
+    singleCigarString <- "100="
+    multiCigarString  <- "100=2D34I6=6X6="
+    
+    singleCigar <- Cigar(singleCigarString)
+    multiCigar  <- Cigar(multiCigarString)
+    
+    assertEqual(1L, singleCigar$size())
+	
+	c <- singleCigar$front()
+	assertEqual('=',              c$Char())
+	assertEqual('SEQUENCE_MATCH', c$Type())
+	assertEqual(100L,             c$Length())
+
+    assertEqual(6L, multiCigar$size())
+	
+	# haven't quite figured out [ ] accessors via SWIG, 
+	# but this method does work w/ !ZERO!-based indices
+    op0 <- multiCigar$'__getitem__'(0) 
+    op1 <- multiCigar$'__getitem__'(1)
+    op2 <- multiCigar$'__getitem__'(2)
+    op3 <- multiCigar$'__getitem__'(3)
+    op4 <- multiCigar$'__getitem__'(4)
+    op5 <- multiCigar$'__getitem__'(5)
+    
+    assertEqual('=', op0$Char())
+    assertEqual('D', op1$Char())
+    assertEqual('I', op2$Char())
+    assertEqual('=', op3$Char())
+    assertEqual('X', op4$Char())
+    assertEqual('=', op5$Char())
+	assertEqual('SEQUENCE_MATCH',    op0$Type())
+	assertEqual('DELETION',          op1$Type())
+	assertEqual('INSERTION',         op2$Type())
+	assertEqual('SEQUENCE_MATCH',    op3$Type())
+    assertEqual('SEQUENCE_MISMATCH', op4$Type())
+    assertEqual('SEQUENCE_MATCH',    op5$Type())
+    assertEqual(100L, op0$Length())
+    assertEqual(2L,   op1$Length())
+    assertEqual(34L,  op2$Length())
+    assertEqual(6L,   op3$Length())
+    assertEqual(6L,   op4$Length())
+    assertEqual(6L,   op5$Length())
+})
+
+test_case("Cigar_ToEmptyString", {
+	
+	cigar <- Cigar()
+	assertEqual(0L, nchar(cigar$ToStdString())) # empty string is 1
+})
+
+test_case("Cigar_ToString", {
+	
+    singleCigarString <- "100="
+    multiCigarString  <- "100=2D34I6=6X6="
+    
+	singleCigar <- Cigar()
+	singleCigar$push_back( CigarOperation(CigarOperation_TypeToChar('SEQUENCE_MATCH'), 100) )
+
+	multiCigar <- Cigar()
+	multiCigar$push_back(CigarOperation('=', 100))
+	multiCigar$push_back(CigarOperation('D', 2))
+	multiCigar$push_back(CigarOperation('I', 34))
+	multiCigar$push_back(CigarOperation('=', 6))
+    multiCigar$push_back(CigarOperation('X', 6))
+    multiCigar$push_back(CigarOperation('=', 6))
+
+	assertEqual(singleCigarString, singleCigar$ToStdString())
+	assertEqual(multiCigarString,  multiCigar$ToStdString())
+})
diff --git a/tests/src/R/tests/test_EndToEnd.R b/tests/src/R/tests/test_EndToEnd.R
new file mode 100644
index 0000000..04a06ac
--- /dev/null
+++ b/tests/src/R/tests/test_EndToEnd.R
@@ -0,0 +1,102 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+originalNames <-function(inputFn, generatedFn) {
+	
+	result <- tryCatch(
+		{
+			file <- BamFile(inputFn)
+			writer <- BamWriter(generatedFn, file$Header())
+			entireFile <- EntireFileQuery(file)
+		
+			names_in <- list()
+			iter <- entireFile$begin()
+			end <- entireFile$end()
+			while ( iter$'__ne__'(end) ) {
+				record <- iter$value()
+				names_in <- c(names_in, record$FullName())
+				writer$Write(record)
+				iter$incr()
+			}
+			return(names_in)
+		},
+		error = function(e) {
+			assertTrue(FALSE)     # should not throw
+			return(list())
+		}
+	)
+	return(result)
+}
+
+generatedNames <- function(generatedFn) {
+	
+	result <- tryCatch(
+		{
+			file <- BamFile(generatedFn)
+			entireFile <- EntireFileQuery(file)
+	
+			names_out <- list()
+			iter <- entireFile$begin()
+			end <- entireFile$end()
+			while ( iter$'__ne__'(end) ) {
+				names_out <- c(names_out, iter$FullName())
+				iter$incr()
+			}
+			return(names_out)
+		},
+		error = function(e) {
+			assertTrue(FALSE)     # should not throw
+			return(list())
+		}
+	)
+	return(result)
+}
+
+test_case("EndToEnd_Placeholder", {
+	
+	inputFn     <- paste(test_data_path, "ex2.bam", sep="/")
+	generatedFn <- paste(test_data_path, "generated.bam", sep="/")
+
+	# loop over original file, store names, write to generated file
+	names_in  <- originalNames(inputFn, generatedFn)
+	
+	# read names from new file
+	names_out <- generatedNames(generatedFn)
+	
+	# ensure equal
+	assertEqual(names_in, names_out)
+})
diff --git a/tests/src/R/tests/test_Frames.R b/tests/src/R/tests/test_Frames.R
new file mode 100644
index 0000000..f9d6eb5
--- /dev/null
+++ b/tests/src/R/tests/test_Frames.R
@@ -0,0 +1,95 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTA,
+# SPECIA, 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.
+#
+# Author: Derek Barnett
+
+testFrames_rawData <- list(
+    0,  8,  140, 0,   0,  7,   4,  0,  85, 2,
+    1,  3,  2,   10,  1,  20,  47, 10, 9,  60,
+    20, 3,  12,  5,   13, 165, 6,  14, 22, 12,
+    2,  4,  9,   218, 27, 3,   15, 2,  17, 2,
+    45, 24, 89,  10,  7,  1,   11, 15, 0,  7,
+    0,  28, 17,  12,  6,  10,  37, 0,  12, 52,
+    0,  7,  1,   14,  3,  26,  12, 0,  20, 17,
+    2,  13, 2,   9,   13, 7,   15, 29, 3,   6,
+    2,  1,  28,  10,  3,  14,  7,  1,  22, 1,
+    6,  6,  0,   19,  31, 6,   2,  14, 0,  0,
+    1000, 947, 948
+)
+
+encodedFrames_rawData <- list(
+    0,     8,  102,   0,   0,   7,   4,   0,  75,   2,   1,   3,   2,
+    10,    1,   20,  47,  10,   9,  60,  20,   3,  12,   5,  13, 115,
+    6,    14,   22,  12,   2,   4,   9, 135,  27,   3,  15,   2,  17,
+    2,    45,   24,  77,  10,   7,   1,  11,  15,   0,   7,   0,  28,
+    17,   12,    6,  10,  37,   0,  12,  52,   0,   7,   1,  14,   3,
+    26,   12,    0,  20,  17,   2,  13,   2,   9,  13,   7,  15,  29,
+    3,     6,    2,   1,  28,  10,   3,  14,   7,   1,  22,   1,   6,
+    6,     0,   19,  31,   6,   2,  14,   0,   0,
+    255, 254,  255
+)
+
+testFrames <- UInt16List()
+for (x in testFrames_rawData) 
+	testFrames$push_back(x)
+
+encodedFrames <- UInt16List()
+for (x in encodedFrames_rawData) 
+	encodedFrames$push_back(x)
+
+test_case("Frames_Basic", {
+	
+	f <- Frames()
+	assertEqual(0L, f$Data()$size())
+	
+	f2 <- Frames(testFrames)
+	d <- f2$Data()
+	assertEqual(length(testFrames), length(d))
+	
+	numFrames <- length(testFrames)
+	for (i in 1:numFrames) 
+		assertEqual(testFrames[i], d[i])
+})
+
+test_case("Frames_Downsample", {
+	
+	f <- Frames(testFrames)
+	d <- f$Data()
+	assertEqual(length(encodedFrames), length(d))
+	
+	numFrames <- length(encodedFrames)
+	for (i in 1:numFrames)
+		assertEqual(encodedFrames[i], d[i])
+})
diff --git a/tests/src/R/tests/test_Intervals.R b/tests/src/R/tests/test_Intervals.R
new file mode 100644
index 0000000..5160449
--- /dev/null
+++ b/tests/src/R/tests/test_Intervals.R
@@ -0,0 +1,340 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+	
+test_case("Intervals_UnmappedPosition", { 
+	assertEqual(-1L, UnmappedPosition())
+})
+
+test_case("Intervals_Ctors", { 
+	
+	empty  <- PositionInterval()
+	single <- PositionInterval(4)
+	normal <- PositionInterval(5, 8)
+
+    assertEqual(0L, empty$Start())
+    assertEqual(0L, empty$Stop())
+    assertEqual(4L, single$Start())
+    assertEqual(5L, single$Stop())
+    assertEqual(5L, normal$Start())
+    assertEqual(8L, normal$Stop())
+})
+
+test_case("Intervals_Equality", { 
+	
+    empty           <- PositionInterval()
+    empty2          <- PositionInterval()
+    singleton       <- PositionInterval(4)
+    sameAsSingleton <- PositionInterval(4, 5)
+    normal          <- PositionInterval(5, 8)
+    sameAsNormal    <- PositionInterval(5, 8)
+    different       <- PositionInterval(20, 40)
+    
+    # self-equality
+    assertEqual(empty,     empty)
+    assertEqual(singleton, singleton)
+    assertEqual(normal,    normal)
+    assertEqual(different, different)
+
+    # same values
+	# TODO: fix this to work with == or *anything* cleaner
+	assertTrue(empty$'__eq__'(empty2))
+	assertTrue(singleton$'__eq__'(sameAsSingleton))
+	assertTrue(normal$'__eq__'(sameAsNormal))
+	
+    # different values
+    assertNotEqual(empty,     singleton)
+    assertNotEqual(empty,     normal)
+    assertNotEqual(empty,     different)
+    assertNotEqual(singleton, normal)
+    assertNotEqual(normal,    different)
+})
+
+test_case("Intervals_Copy", { 
+	
+    interval1 <- PositionInterval(5,8)
+    interval2 <- PositionInterval(interval1)
+    interval3 <- interval1
+
+	# TODO: fix this to work with == or *anything* cleaner
+	assertTrue(interval1$'__eq__'(interval1))
+	assertTrue(interval1$'__eq__'(interval2))
+	assertTrue(interval1$'__eq__'(interval3))
+})
+
+test_case("Intervals_Modifiers", { 
+	
+	interval1 <- PositionInterval(5,8)
+    interval2 <- PositionInterval(interval1)
+    interval2$Start(2)
+    interval2$Stop(10)
+        
+    assertNotEqual(interval1, interval2)
+    assertEqual(2L,  interval2$Start())
+    assertEqual(10L, interval2$Stop())
+})
+
+test_case("Intervals_Cover", { 
+	
+    a <- PositionInterval(2,4)
+    b <- PositionInterval(3,5)
+    c <- PositionInterval(6,8)
+    d <- PositionInterval(1,7)
+    e <- PositionInterval(5,8)
+    
+    #   0123456789  
+    # a   --
+    # b    --
+    # c       --
+    # d  ------
+    # e      ---
+
+    # self-cover
+    assertTrue(a$Covers(a)) 
+    assertTrue(a$CoveredBy(a))
+
+    # basic covers/covered
+    assertTrue(b$CoveredBy(d))
+    assertTrue(d$Covers(b))
+    assertNotEqual(b, d)
+    assertFalse(b$Covers(d))
+
+    # completely disjoint
+    assertFalse(b$Covers(c))
+    assertFalse(c$Covers(b))
+    assertFalse(b$CoveredBy(c))
+    assertFalse(c$CoveredBy(b))
+    
+    # b.stop == e.start
+    assertFalse(b$Covers(e))
+    assertFalse(b$CoveredBy(e))
+
+    # shared endpoint, start contained
+    assertTrue(e$Covers(c))
+    assertTrue(c$CoveredBy(e))
+})
+
+test_case("Intervals_Intersect", { 
+	
+    a <- PositionInterval(2,4)
+    b <- PositionInterval(3,5)
+    c <- PositionInterval(6,8)
+    d <- PositionInterval(1,7)
+    e <- PositionInterval(5,8)
+    
+    #   0123456789  
+    # a   --
+    # b    --
+    # c       --
+    # d  ------
+    # e      ---
+    
+    # self-intersection
+    assertTrue(a$Intersects(a))
+    
+    # intersection is commutative
+    assertTrue(a$Intersects(b))
+    assertTrue(b$Intersects(a))
+    
+    # covered implies intersection
+    assertTrue(d$Covers(a))
+    assertTrue(a$Intersects(d))
+    assertTrue(d$Intersects(a))
+
+    # c.start > b.stop (obvious disjoint)
+    assertFalse(b$Intersects(c))
+    
+    # b.stop == e.start (intervals are right-open, so disjoint)
+    assertFalse(b$Intersects(e))
+})
+
+test_case("Intervals_Validity", { 
+	
+    a <- PositionInterval()     # default ctor
+    b <- PositionInterval(0,0)  # start == stop (zero)
+    c <- PositionInterval(4,4)  # start == stop (nonzero)
+    d <- PositionInterval(0,1)  # start < stop  (start is zero)
+    e <- PositionInterval(4,5)  # start < stop  (start is nonzero)
+    f <- PositionInterval(5,4)  # start > stop
+    
+    assertFalse(a$IsValid())
+    assertFalse(b$IsValid())
+    assertFalse(c$IsValid())
+    assertTrue(d$IsValid())
+    assertTrue(e$IsValid())
+    assertFalse(f$IsValid())
+})
+
+test_case("Intervals_Length",{ 
+	
+    a <- PositionInterval(2,4)
+    b <- PositionInterval(3,5)
+    c <- PositionInterval(6,8)
+    d <- PositionInterval(1,7)
+    e <- PositionInterval(5,8)
+    
+    assertEqual(2L, a$Length())
+    assertEqual(2L, b$Length())
+    assertEqual(2L, c$Length())
+    assertEqual(6L, d$Length())
+    assertEqual(3L, e$Length()) 
+})
+
+test_case("GenomicIntervals_Ctors", { 
+	
+    empty  <- GenomicInterval()
+    normal <- GenomicInterval(0, 100, 200)
+    
+    assertEqual(-1L, empty$Id())
+    assertEqual(0L,  empty$Start())
+    assertEqual(0L,  empty$Stop())
+    
+    assertEqual(0L,   normal$Id())
+    assertEqual(100L, normal$Start())
+    assertEqual(200L, normal$Stop())
+})
+
+test_case("GenomicIntervals_Copy", { 
+	
+    a <- GenomicInterval(1, 10, 20)
+    b <- GenomicInterval(a)
+    c <- a
+    
+	# TODO: fix this to work with == or *anything* cleaner
+	assertTrue(a$'__eq__'(a))
+	assertTrue(a$'__eq__'(b))
+	assertTrue(a$'__eq__'(c))
+})
+
+test_case("GenomicIntervals_Modifiers", { 
+	
+    a <- GenomicInterval(1, 10, 20)
+    
+    b <- GenomicInterval(a)
+    b$Id(5)
+	b$Start(2)
+	b$Stop(10)
+    
+    c <- GenomicInterval(a)
+    c$Interval(b$Interval())
+    
+    assertNotEqual(a, b)
+	
+    assertEqual(5L,  b$Id())
+    assertEqual(2L,  b$Start())
+    assertEqual(10L, b$Stop())        
+	
+    assertEqual(a$Id(), c$Id())
+	
+	# TODO: fix this to work with == or *anything* cleaner
+	assertTrue(b$Interval()$'__eq__'(c$Interval()))
+})
+
+test_case("GenomicIntervals_Cover", { 
+	
+    a <- GenomicInterval(0,2,4)
+    b <- GenomicInterval(0,3,5)
+    c <- GenomicInterval(0,6,8)
+    d <- GenomicInterval(0,1,7)
+    e <- GenomicInterval(0,5,8)
+    f <- GenomicInterval(1,3,5)  # same as b, different ref
+    
+    #   0123456789  
+    # a   --
+    # b    --
+    # c       --
+    # d  ------
+    # e      ---
+    
+    # self-cover
+    assertTrue(a$Covers(a))
+    assertTrue(a$CoveredBy(a))
+    
+    # basic covers/covered
+    assertTrue(b$CoveredBy(d))
+    assertTrue(d$Covers(b))
+    assertNotEqual(b, d)
+    assertFalse(b$Covers(d))
+    
+    # same coords as b, but different ref
+    assertFalse(f$CoveredBy(d))
+    assertFalse(d$Covers(f))
+    assertNotEqual(f, d)
+    assertFalse(f$Covers(d))
+    
+    # obvious disjoint
+    assertFalse(b$Covers(c))
+    assertFalse(c$Covers(b))
+    assertFalse(b$CoveredBy(c))
+    assertFalse(c$CoveredBy(b))
+    
+    # b.stop == e.start (intervals are right-open, so disjoint)
+    assertFalse(b$Covers(e))
+    assertFalse(b$CoveredBy(e))
+    
+    # shared endpoint, start contained
+    assertTrue(e$Covers(c))
+    assertTrue(c$CoveredBy(e))
+	
+	# assertTrue(FALSE)
+})
+
+test_case("GenomicIntervals_Validity", { 
+	
+    a <- GenomicInterval()       # default
+    b <- GenomicInterval(0,0,0)  # valid id, start == stop (zero)
+    c <- GenomicInterval(0,4,4)  # valid id, start == stop (non-zero)
+    d <- GenomicInterval(0,0,1)  # valid id, start <  stop (start == zero)     OK
+    e <- GenomicInterval(0,4,5)  # valid id, start <  stop (start >  zero)     OK
+    f <- GenomicInterval(0,5,4)  # valid id, start >  stop 
+    g <- GenomicInterval(-1,0,0) # invalid id, start == stop (zero)
+    h <- GenomicInterval(-1,4,4) # invalid id, start == stop (non-zero)
+    i <- GenomicInterval(-1,0,1) # invalid id, start <  stop (start == zero)
+    j <- GenomicInterval(-1,4,5) # invalid id, start <  stop (start >  zero)
+    k <- GenomicInterval(-1,5,4) # invalid id, start >  stop 
+         
+    assertTrue(d$IsValid())
+    assertTrue(e$IsValid())
+    assertFalse(a$IsValid())
+    assertFalse(b$IsValid())
+    assertFalse(c$IsValid())
+    assertFalse(f$IsValid())
+    assertFalse(g$IsValid())
+    assertFalse(h$IsValid())
+    assertFalse(i$IsValid())
+    assertFalse(j$IsValid())
+    assertFalse(k$IsValid())
+})
diff --git a/tests/src/R/tests/test_QualityValues.R b/tests/src/R/tests/test_QualityValues.R
new file mode 100644
index 0000000..b0671d0
--- /dev/null
+++ b/tests/src/R/tests/test_QualityValues.R
@@ -0,0 +1,113 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+test_case("QualityValue_Defaults", { 
+	
+	value <- QualityValue()
+	assertEqual(0L, value$ToInt())
+	assertEqual('!', value$Fastq())
+})
+
+test_case("QualityValue_FromNumber", { 
+	
+    zero        <- QualityValue(0)
+    thirtythree <- QualityValue(33)
+    normal      <- QualityValue(42)
+    maxQV       <- QualityValue(93)
+    tooHigh     <- QualityValue(94)
+    max8bit     <- QualityValue(126)
+    
+    assertEqual(0L,  zero$ToInt())
+    assertEqual(33L, thirtythree$ToInt())
+    assertEqual(42L, normal$ToInt())
+    assertEqual(93L, maxQV$ToInt())
+    assertEqual(93L, tooHigh$ToInt())
+    assertEqual(93L, max8bit$ToInt())
+
+    assertEqual('!', zero$Fastq())
+    assertEqual('B', thirtythree$Fastq())
+    assertEqual('K', normal$Fastq())
+    assertEqual('~', maxQV$Fastq())
+    assertEqual('~', tooHigh$Fastq())
+    assertEqual('~', max8bit$Fastq())
+})
+
+test_case("QualityValue_FromFastq", { 
+	
+    zero        <- QualityValue_FromFastq('!')
+    thirtythree <- QualityValue_FromFastq('B')
+    normal      <- QualityValue_FromFastq('K')
+    maxQV       <- QualityValue_FromFastq('~')
+
+    assertEqual(0L,  zero$ToInt())
+    assertEqual(33L, thirtythree$ToInt())
+    assertEqual(42L, normal$ToInt())
+    assertEqual(93L, maxQV$ToInt())
+})
+
+test_case("QualityValues_Defaults", { 
+    values <- QualityValues()   
+	assertEqual(0L, nchar(values$Fastq()))
+})
+
+test_case("QualityValues_FromNumbers", { 
+	
+	fastqString <- "~~~KKBB!!"
+	values <- c(93, 93, 93, 42, 42, 33, 33, 0, 0)
+	
+	qvs <- QualityValues()
+	for (v in values) 
+		qvs$push_back(QualityValue(v))
+	
+	assertEqual(fastqString, qvs$Fastq())
+})
+
+test_case("QualityValues_FromFastq", { 
+	
+	fastqString <- "~~~KKBB!!"
+	values <- c(93L, 93L, 93L, 42L, 42L, 33L, 33L, 0L, 0L)
+	
+	qvs <- QualityValues(fastqString)
+	assertEqual(nchar(fastqString), qvs$size())
+	assertEqual(length(values),     qvs$size())
+	
+	numValues <- length(values)
+	for ( i in 1:numValues ) {
+		qv <- qvs$'__getitem__'(i-1)
+		assertEqual(values[i], qv$ToInt())
+	}
+})
diff --git a/tests/src/R/tests/utils.R b/tests/src/R/tests/utils.R
new file mode 100644
index 0000000..ff793a6
--- /dev/null
+++ b/tests/src/R/tests/utils.R
@@ -0,0 +1,307 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+# main test suite runner
+run_test_suite <- function(path) {
+	test_files <- dir(path, "^test.*\\.[rR]$", full.names = TRUE)
+	lapply(test_files, run_test_file)
+	invisible()
+}
+
+run_test_file <- function(filename) {
+	source(filename)
+	invisible()
+}
+
+# main test case definition
+#
+# Example:
+# test_case("name", {
+#     ...tested code here...   
+# })
+#
+test_case <- function(name, code) {
+	test_case_runner(name, substitute(code))
+	invisible()
+}
+
+# main assert definitions
+#
+# assertEqual(expected, actual)
+# assertNotEqual(expected, actual)
+# assertTrue(expr)
+# assertFalse(expr)
+#
+
+assertEqual <- function(expected, actual) {
+	assertHelper(identical(expected, actual), 
+	             TRUE, 
+				 expression_string("expected"), 
+				 deparse(expected), 
+				 expression_string("actual"), 
+				 deparse(actual), 
+				 "==")
+}
+
+assertAllEqual <- function(expected, actual) {
+	assertHelper(all.equal(expected, actual), 
+	             TRUE, 
+				 expression_string("expected"), 
+				 deparse(expected), 
+				 expression_string("actual"), 
+				 deparse(actual), 
+				 "==")
+}
+
+assertNotEqual <- function(expected, actual) {
+	assertHelper(identical(expected, actual), 
+	             FALSE, 
+				 expression_string("expected"), 
+				 deparse(expected), 
+				 expression_string("actual"), 
+				 deparse(actual), 
+				 "!=")
+}
+
+assertTrue <- function(expr) {
+	assertHelper(as.vector(expr), 
+	             TRUE, 
+				 "TRUE", 
+				 "TRUE", 
+				 expression_string("expr"), 
+				 deparse(expr), 
+				 "==")
+}
+
+assertFalse <- function(expr) {
+	assertHelper(as.vector(expr), 
+	             FALSE, 
+				 "FALSE", 
+				 "FALSE", 
+				 expression_string("expr"), 
+				 deparse(expr), 
+				 "==")
+}
+
+# TODO: (if needed) assertLessThan, assertGreaterThan, assertNull, etc
+
+# ------------------------------- #
+# internals 
+# ------------------------------- #
+
+expression_string <- function(name, env = parent.frame()) {
+  subs <- do.call("substitute", list(as.name(name), env))
+  paste0(deparse(subs, width.cutoff = 500), collapse = "\n")
+}
+
+assertHelper <- function(compare, 
+	                     to, 
+	                     expected_expr, 
+						 expected_value, 
+						 actual_expr, 
+						 actual_value,
+						 compare_type) 
+{
+	success <- identical(compare, to)
+	
+	result <- make_assert_result(success,
+    				             expected_expr, 
+                                 expected_value, 
+ 						         actual_expr, 
+ 						         actual_value,
+ 						         compare_type)
+	
+	
+	# record result with testCaseCollector
+	testCaseResults <- test_case_results()
+	testCaseResults$add_result(result)
+	invisible()
+}
+
+make_assert_result <- function(success,
+	                           expected_expr, 
+					           expected_value, 
+					           actual_expr, 
+					           actual_value,
+					           compare_type)
+{
+	structure(list(
+		success = success,
+		expectedExpression = expected_expr,
+		expectedValue = expected_value,
+		actualExpression = actual_expr,
+		actualValue = actual_value,
+		compareType = compare_type	
+	))					 	
+}
+
+TestCaseResults <- setRefClass("TestCaseResults",
+
+	fields = list(
+		test = "character",
+		anyFailed = "logical",
+		results = "list"
+	),
+	methods = list(
+		initialize = function(...) {
+			test <<- ""
+			anyFailed <<- FALSE
+		
+			initFields(...)
+		},
+	
+		start_test = function(name) {
+			test <<- name
+			results <<- list()
+		},
+		
+		add_result = function(result) {
+			if (!result$success) 
+				anyFailed <<- TRUE
+			results <<- c(results, list(result))
+		},
+		
+		end_test = function() {
+		
+			# summarize test case results
+			testOutput <- format_results()
+		
+			# report to test collector
+			suiteResults <- test_suite_results()
+			suiteResults$add_test_case_result(anyFailed, testOutput)
+		
+			# reset
+			test <<- ""
+			anyFailed <<- FALSE
+			results <<- list()
+		},
+		
+		format_results = function() {
+			
+			lines <- list()
+			
+			status <- "OK"
+			if (anyFailed) 
+				status <- "FAILED"
+			
+			headerLine <- paste("TestCase:", test, "...", status, sep=" ")
+			lines <- c(lines, list(headerLine))
+			
+			for (result in results) {
+				if (!result$success) {
+					valueOfLabel <- paste(result$actualExpression, result$compareType, result$expectedExpression, sep=" ")
+					valueOf  <- paste("  Value of:", valueOfLabel,         sep=" ")
+					actual   <- paste("    Actual:", result$actualValue,   sep=" ")
+					expected <- paste("  Expected:", result$expectedValue, sep=" ")
+					lines <- c(lines, valueOf, actual, expected, "")
+				}
+			}
+			invisible(lines)
+		} 
+	)
+)
+
+TestSuiteResults <- setRefClass("TestSuiteResults",
+
+	fields = list(
+		numTests = "integer",
+		numFailed = "integer",
+		results = "list"
+	),
+	methods = list(
+		initialize = function(...) {
+			numTests <<- 0L
+			numFailed <<- 0L
+			results <<- list()
+		
+			initFields(...)
+		},
+		
+		add_test_case_result = function(testHasFailures, testOutput) {  #(results)
+			numTests <<- numTests + 1L
+			if (testHasFailures)
+				numFailed <<- numFailed + 1L
+			results <<- c(results, testOutput)
+		},
+		
+		any_failed = function() {
+			return (numFailed != 0L)
+		},
+		
+		print_summary = function(...) {
+				
+			cat("\n")
+			cat("-------------------------\n")
+			cat("Tests Complete\n")
+			cat("-------------------------\n")
+			cat("\n")
+			
+			for (result in results) {
+				cat(result)
+				cat("\n")
+			}
+			cat("-------------------------\n")
+			
+			if (numFailed == 1L) {
+				footer <- paste(numFailed, "test failed out of", numTests, sep=" ")
+			} else {
+				footer <- paste(numFailed, "tests failed out of", numTests, sep=" ")
+			}
+			cat(footer)
+			cat("\n\n")
+		}
+	)
+)
+
+test_env = new.env()
+test_env$testSuiteResults <- TestSuiteResults$new()
+test_env$testCaseResults <- TestCaseResults$new()
+
+test_suite_results <- function() {
+	test_env$testSuiteResults
+}
+
+test_case_results <- function() {
+	test_env$testCaseResults
+}
+
+test_case_runner <- function(name, code) {
+	testCaseResults <- test_case_results()
+	testCaseResults$start_test(name)
+	eval(code, test_env)
+	testCaseResults$end_test()
+}
diff --git a/tests/src/TestData.h.in b/tests/src/TestData.h.in
new file mode 100644
index 0000000..e4d786c
--- /dev/null
+++ b/tests/src/TestData.h.in
@@ -0,0 +1,56 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef TESTDATA_H
+#define TESTDATA_H
+
+#include <string>
+
+namespace PacBio {
+namespace BAM {
+namespace tests {
+
+const std::string Source_Dir   = std::string("@PacBioBAM_TestsDir@");
+const std::string Bin_Dir      = std::string("@CMAKE_CURRENT_BINARY_DIR@");
+const std::string Data_Dir     = std::string("@PacBioBAM_TestsDir@/data");
+const std::string Samtools_Bin = std::string("@Samtools_Bin@");
+
+} // namespace tests
+} // namespace BAM
+} // namespace PacBio
+
+#endif // TESTDATA_H
diff --git a/tests/src/python/check_swig.py b/tests/src/python/check_swig.py
new file mode 100755
index 0000000..9a17f7e
--- /dev/null
+++ b/tests/src/python/check_swig.py
@@ -0,0 +1,44 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+try:
+    import PacBioBam as bam
+    header = bam.BamHeader()
+    print "\nPython wrapper OK.\n"
+except ImportError:
+    print "\nPython wrapper failed!\n"
+
diff --git a/tests/src/python/test/__init__.py b/tests/src/python/test/__init__.py
new file mode 100755
index 0000000..fb74df1
--- /dev/null
+++ b/tests/src/python/test/__init__.py
@@ -0,0 +1,39 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+# EMPTY ON PURPOSE. 
+# This file just needs to exist for unit test discovery.
diff --git a/tests/src/python/test/config.py.in b/tests/src/python/test/config.py.in
new file mode 100644
index 0000000..c2b900e
--- /dev/null
+++ b/tests/src/python/test/config.py.in
@@ -0,0 +1,43 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+class TestData(object):
+    def __init__(self):
+        
+        # Main test data directory
+        self.directory = "@PacBioBAM_TestsDir@/data"
+        
\ No newline at end of file
diff --git a/tests/src/python/test/test_Accuracy.py b/tests/src/python/test/test_Accuracy.py
new file mode 100755
index 0000000..7bef5db
--- /dev/null
+++ b/tests/src/python/test/test_Accuracy.py
@@ -0,0 +1,65 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config 
+import unittest
+
+class AccuracyTest(unittest.TestCase):
+    
+    # ------------ SETUP --------------
+    
+    def runTest(self):
+        self.test_clamp()
+        
+    # ------------ TESTS --------------
+        
+    def test_clamp(self):
+        a_zero     = PacBioBam.Accuracy(0)
+        a_neg      = PacBioBam.Accuracy(-1)
+        a_min      = PacBioBam.Accuracy(0)
+        a_normal   = PacBioBam.Accuracy(300)
+        a_max      = PacBioBam.Accuracy(1000)
+        a_tooLarge = PacBioBam.Accuracy(2000)
+        
+        self.assertEqual(0,    int(a_zero))
+        self.assertEqual(0,    int(a_neg))
+        self.assertEqual(0,    int(a_min))
+        self.assertEqual(300,  int(a_normal))
+        self.assertEqual(1000, int(a_max))
+        self.assertEqual(1000, int(a_tooLarge))
+        
\ No newline at end of file
diff --git a/tests/src/python/test/test_BamFile.py b/tests/src/python/test/test_BamFile.py
new file mode 100755
index 0000000..214b2a8
--- /dev/null
+++ b/tests/src/python/test/test_BamFile.py
@@ -0,0 +1,63 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config 
+import unittest
+
+class BamFileTest(unittest.TestCase):
+    
+    # ------------ SETUP --------------
+    
+    def setUp(self):
+        self.data = config.TestData()
+        self.ex2BamFn = self.data.directory + "/ex2.bam"
+    
+    def runTest(self):
+        self.test_ctor()
+        self.test_nonExistentFile()
+    
+    # ------------ TESTS --------------
+        
+    def test_ctor(self):
+        f = PacBioBam.BamFile(self.ex2BamFn)
+        self.assertFalse(f.IsPacBioBAM())
+        
+    def test_nonExistentFile(self):
+        with self.assertRaises(RuntimeError):
+            f = PacBioBam.BamFile("non_existent_file.bam")
+            
\ No newline at end of file
diff --git a/tests/src/python/test/test_BamHeader.py b/tests/src/python/test/test_BamHeader.py
new file mode 100755
index 0000000..076683b
--- /dev/null
+++ b/tests/src/python/test/test_BamHeader.py
@@ -0,0 +1,157 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config 
+import unittest
+
+class BamHeaderTest(unittest.TestCase):
+    
+    # ------------ SETUP --------------
+    
+    def runTest(self):
+        self.test_defaultCtor()
+        self.test_decode()
+        self.test_encode()
+        
+    # ------------ TESTS --------------
+    
+    def test_defaultCtor(self):   
+             
+        header = PacBioBam.BamHeader()
+
+        self.assertFalse(header.Version())
+        self.assertFalse(header.SortOrder())
+        self.assertEqual(0, len(header.ReadGroups()))
+        self.assertEqual(0, len(header.Sequences()))
+        self.assertEqual(0, len(header.Programs()))
+        self.assertEqual(0, len(header.Comments()))
+        
+        with self.assertRaises(RuntimeError):
+            pg = header.Program("foo")
+            rg = header.ReadGroup("foo")
+            sq = header.SequenceId("foo")
+            sl = header.SequenceLength(42)
+            sn = header.SequenceName(42)
+        
+        
+    def test_decode(self):
+        
+        text = ("@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+               "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+               "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+               "@RG\tID:rg1\tSM:control\n"
+               "@RG\tID:rg2\tSM:condition1\n"
+               "@RG\tID:rg3\tSM:condition1\n"
+               "@PG\tID:_foo_\tPN:ide\n"
+               "@CO\tipsum and so on\n"
+               "@CO\tcitation needed\n")
+
+        header = PacBioBam.BamHeader(text)
+
+        self.assertEqual("1.1",       header.Version())
+        self.assertEqual("queryname", header.SortOrder())
+        self.assertEqual("3.0b3",     header.PacBioBamVersion())
+
+        self.assertEqual(3, len(header.ReadGroups()))
+        self.assertTrue(header.HasReadGroup("rg1"))
+        self.assertTrue(header.HasReadGroup("rg2"))
+        self.assertTrue(header.HasReadGroup("rg3"))
+        self.assertEqual("control",    header.ReadGroup("rg1").Sample())
+        self.assertEqual("condition1", header.ReadGroup("rg2").Sample())
+        self.assertEqual("condition1", header.ReadGroup("rg3").Sample())
+
+        self.assertEqual(2, len(header.Sequences()))
+        self.assertTrue(header.HasSequence("chr1"))
+        self.assertTrue(header.HasSequence("chr2"))
+        self.assertEqual("chocobo", header.Sequence("chr1").Species())
+        self.assertEqual("chocobo", header.Sequence("chr2").Species())
+        self.assertEqual("2038",    header.Sequence("chr1").Length())
+        self.assertEqual("3042",    header.Sequence("chr2").Length())
+
+        self.assertEqual(1, len(header.Programs()))
+        self.assertTrue(header.HasProgram("_foo_"))
+        self.assertEqual("ide", header.Program("_foo_").Name())
+
+        self.assertEqual(2, len(header.Comments()))
+        self.assertEqual("ipsum and so on", header.Comments()[0])
+        self.assertEqual("citation needed", header.Comments()[1])
+        
+    def test_encode(self):
+        
+        expectedText = ("@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+                        "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+                        "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+                        "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control\n"
+                        "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+                        "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+                        "@PG\tID:_foo_\tPN:ide\n"
+                        "@CO\tipsum and so on\n"
+                        "@CO\tcitation needed\n")
+
+        rg1 = PacBioBam.ReadGroupInfo("rg1")
+        rg1.Sample("control")
+        rg2 = PacBioBam.ReadGroupInfo("rg2")
+        rg2.Sample("condition1")
+        rg3 = PacBioBam.ReadGroupInfo("rg3")
+        rg3.Sample("condition1")
+
+        seq1 = PacBioBam.SequenceInfo("chr1")
+        seq1.Length("2038")
+        seq1.Species("chocobo")
+        seq2 = PacBioBam.SequenceInfo("chr2")
+        seq2.Length("3042")
+        seq2.Species("chocobo")
+
+        prog1 = PacBioBam.ProgramInfo("_foo_")
+        prog1.Name("ide")
+
+        header = PacBioBam.BamHeader()
+        header.Version("1.1")
+        header.SortOrder("queryname")
+        header.PacBioBamVersion("3.0b3")
+        header.AddReadGroup(rg1)
+        header.AddReadGroup(rg2)
+        header.AddReadGroup(rg3)
+        header.AddSequence(seq1)
+        header.AddSequence(seq2)
+        header.AddProgram(prog1)
+        header.AddComment("ipsum and so on")
+        header.AddComment("citation needed")
+
+        self.assertEqual(expectedText, header.ToSam())
+        
\ No newline at end of file
diff --git a/tests/src/python/test/test_Cigar.py b/tests/src/python/test/test_Cigar.py
new file mode 100755
index 0000000..7b3f1df
--- /dev/null
+++ b/tests/src/python/test/test_Cigar.py
@@ -0,0 +1,214 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config 
+import unittest
+
+class CigarTest(unittest.TestCase):
+    
+    # ------------ SETUP --------------
+    
+    def runTest(self):
+        self.test_typeToChar()
+        self.test_charToType()
+        self.test_setType()
+        self.test_setChar()
+        self.test_cigarOpCtors()
+        self.test_fromEmptyString()
+        self.test_fromString()
+        self.test_toEmptyString()
+        self.test_toString()
+        
+    # ------------ TESTS --------------
+    
+    def test_typeToChar(self):
+        self.assertEqual('M', PacBioBam.CigarOperation.TypeToChar(PacBioBam.ALIGNMENT_MATCH))
+        self.assertEqual('I', PacBioBam.CigarOperation.TypeToChar(PacBioBam.INSERTION))
+        self.assertEqual('D', PacBioBam.CigarOperation.TypeToChar(PacBioBam.DELETION))
+        self.assertEqual('N', PacBioBam.CigarOperation.TypeToChar(PacBioBam.REFERENCE_SKIP))
+        self.assertEqual('S', PacBioBam.CigarOperation.TypeToChar(PacBioBam.SOFT_CLIP))
+        self.assertEqual('H', PacBioBam.CigarOperation.TypeToChar(PacBioBam.HARD_CLIP))
+        self.assertEqual('P', PacBioBam.CigarOperation.TypeToChar(PacBioBam.PADDING))
+        self.assertEqual('=', PacBioBam.CigarOperation.TypeToChar(PacBioBam.SEQUENCE_MATCH))
+        self.assertEqual('X', PacBioBam.CigarOperation.TypeToChar(PacBioBam.SEQUENCE_MISMATCH))
+        
+    def test_charToType(self):
+        self.assertEqual(PacBioBam.ALIGNMENT_MATCH,   PacBioBam.CigarOperation.CharToType('M'))
+        self.assertEqual(PacBioBam.INSERTION,         PacBioBam.CigarOperation.CharToType('I'))
+        self.assertEqual(PacBioBam.DELETION,          PacBioBam.CigarOperation.CharToType('D'))
+        self.assertEqual(PacBioBam.REFERENCE_SKIP,    PacBioBam.CigarOperation.CharToType('N'))
+        self.assertEqual(PacBioBam.SOFT_CLIP,         PacBioBam.CigarOperation.CharToType('S'))
+        self.assertEqual(PacBioBam.HARD_CLIP,         PacBioBam.CigarOperation.CharToType('H'))
+        self.assertEqual(PacBioBam.PADDING,           PacBioBam.CigarOperation.CharToType('P'))
+        self.assertEqual(PacBioBam.SEQUENCE_MATCH,    PacBioBam.CigarOperation.CharToType('='))
+        self.assertEqual(PacBioBam.SEQUENCE_MISMATCH, PacBioBam.CigarOperation.CharToType('X'))
+        
+    def test_setType(self):
+        m = PacBioBam.CigarOperation()
+        i = PacBioBam.CigarOperation()
+        d = PacBioBam.CigarOperation()
+        n = PacBioBam.CigarOperation()
+        s = PacBioBam.CigarOperation()
+        h = PacBioBam.CigarOperation()
+        p = PacBioBam.CigarOperation()
+        e = PacBioBam.CigarOperation()
+        x = PacBioBam.CigarOperation()
+        
+        m.Type(PacBioBam.ALIGNMENT_MATCH)
+        i.Type(PacBioBam.INSERTION)
+        d.Type(PacBioBam.DELETION)
+        n.Type(PacBioBam.REFERENCE_SKIP)
+        s.Type(PacBioBam.SOFT_CLIP)
+        h.Type(PacBioBam.HARD_CLIP)
+        p.Type(PacBioBam.PADDING)
+        e.Type(PacBioBam.SEQUENCE_MATCH)
+        x.Type(PacBioBam.SEQUENCE_MISMATCH)
+        
+        self.assertEqual('M', m.Char())
+        self.assertEqual('I', i.Char())
+        self.assertEqual('D', d.Char())
+        self.assertEqual('N', n.Char())
+        self.assertEqual('S', s.Char())
+        self.assertEqual('H', h.Char())
+        self.assertEqual('P', p.Char())
+        self.assertEqual('=', e.Char())
+        self.assertEqual('X', x.Char())
+        
+    def test_setChar(self):
+        m = PacBioBam.CigarOperation()
+        i = PacBioBam.CigarOperation()
+        d = PacBioBam.CigarOperation()
+        n = PacBioBam.CigarOperation()
+        s = PacBioBam.CigarOperation()
+        h = PacBioBam.CigarOperation()
+        p = PacBioBam.CigarOperation()
+        e = PacBioBam.CigarOperation()
+        x = PacBioBam.CigarOperation()
+        
+        m.Char('M')
+        i.Char('I')
+        d.Char('D')
+        n.Char('N')
+        s.Char('S')
+        h.Char('H')
+        p.Char('P')
+        e.Char('=')
+        x.Char('X')
+        
+        self.assertEqual(PacBioBam.ALIGNMENT_MATCH,   m.Type())
+        self.assertEqual(PacBioBam.INSERTION,         i.Type())
+        self.assertEqual(PacBioBam.DELETION,          d.Type())
+        self.assertEqual(PacBioBam.REFERENCE_SKIP,    n.Type())
+        self.assertEqual(PacBioBam.SOFT_CLIP,         s.Type())
+        self.assertEqual(PacBioBam.HARD_CLIP,         h.Type())
+        self.assertEqual(PacBioBam.PADDING,           p.Type())
+        self.assertEqual(PacBioBam.SEQUENCE_MATCH,    e.Type())
+        self.assertEqual(PacBioBam.SEQUENCE_MISMATCH, x.Type())
+        
+    def test_cigarOpCtors(self):
+        c1 = PacBioBam.CigarOperation('S', 10)
+        c2 = PacBioBam.CigarOperation(PacBioBam.SOFT_CLIP, 10)
+        
+        self.assertEqual('S', c1.Char())
+        self.assertEqual('S', c2.Char())
+        self.assertEqual(PacBioBam.SOFT_CLIP, c1.Type())
+        self.assertEqual(PacBioBam.SOFT_CLIP, c2.Type())
+        self.assertEqual(10, c1.Length())
+        self.assertEqual(10, c2.Length())
+        
+    def test_fromEmptyString(self):
+        s = ""
+        cigar = PacBioBam.Cigar(s)
+        self.assertEqual(0, len(cigar))
+        
+    def test_fromString(self):
+        singleCigarString = "100="
+        multiCigarString  = "100=2D34I6=6X6="
+        
+        singleCigar = PacBioBam.Cigar(singleCigarString)
+        multiCigar  = PacBioBam.Cigar(multiCigarString)
+        
+        self.assertEqual(1, len(singleCigar))
+        c = singleCigar[0]
+        self.assertEqual('=', c.Char())
+        self.assertEqual(100, c.Length())
+
+        self.assertEqual(6, len(multiCigar))
+        op0 = multiCigar[0]
+        op1 = multiCigar[1]
+        op2 = multiCigar[2]
+        op3 = multiCigar[3]
+        op4 = multiCigar[4]
+        op5 = multiCigar[5]
+
+        self.assertEqual('=', op0.Char())
+        self.assertEqual('D', op1.Char())
+        self.assertEqual('I', op2.Char())
+        self.assertEqual('=', op3.Char())
+        self.assertEqual('X', op4.Char())
+        self.assertEqual('=', op5.Char())
+        self.assertEqual(100, op0.Length())
+        self.assertEqual(2,   op1.Length())
+        self.assertEqual(34,  op2.Length())
+        self.assertEqual(6,   op3.Length())
+        self.assertEqual(6,   op4.Length())
+        self.assertEqual(6,   op5.Length())
+        
+    def test_toEmptyString(self):
+        cigar = PacBioBam.Cigar()
+        self.assertFalse(cigar.ToStdString())
+
+    def test_toString(self):
+        
+        singleCigarString = "100="
+        multiCigarString  = "100=2D34I6=6X6="
+        
+        singleCigar = PacBioBam.Cigar()
+        singleCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MATCH, 100))
+        
+        multiCigar = PacBioBam.Cigar()
+        multiCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MATCH, 100))
+        multiCigar.append(PacBioBam.CigarOperation(PacBioBam.DELETION,         2))
+        multiCigar.append(PacBioBam.CigarOperation(PacBioBam.INSERTION,       34))
+        multiCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MATCH,   6))
+        multiCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MISMATCH,6))
+        multiCigar.append(PacBioBam.CigarOperation(PacBioBam.SEQUENCE_MATCH,   6))
+        
+        self.assertEqual(singleCigarString, singleCigar.ToStdString())
+        self.assertEqual(multiCigarString,  multiCigar.ToStdString())
+        
diff --git a/tests/src/python/test/test_EndToEnd.py b/tests/src/python/test/test_EndToEnd.py
new file mode 100755
index 0000000..8c8bab9
--- /dev/null
+++ b/tests/src/python/test/test_EndToEnd.py
@@ -0,0 +1,89 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config 
+
+import os
+import unittest
+
+class EndToEndTest(unittest.TestCase):
+        
+    def originalNames(self):
+        # loop over original file, store names, write to generated file
+        try:
+            file = PacBioBam.BamFile(self.ex2BamFn)
+            writer = PacBioBam.BamWriter(self.generatedBamFn, file.Header())
+            
+            dataset = PacBioBam.DataSet(self.ex2BamFn)
+            entireFile = PacBioBam.EntireFileQuery(dataset)
+         
+            names_in = []
+            for record in PacBioBam.Iterate(entireFile):
+                names_in.append(record.FullName())
+                writer.Write(record)
+            return names_in
+            
+        except RuntimeError:
+            self.assertTrue(False) # should not throw
+        
+    def generatedNames(self):
+        try:   
+            # open dataset on generated BAM file, read in names
+            dataset = PacBioBam.DataSet(self.generatedBamFn)
+            entireFile = PacBioBam.EntireFileQuery(dataset)
+            names_out = []
+            for record in PacBioBam.Iterate(entireFile):
+                names_out.append(record.FullName())
+            return names_out
+                
+        except RuntimeError:
+            self.assertTrue(False) # should not throw
+        
+    def runTest(self):
+        
+        self.testData = config.TestData()
+        self.ex2BamFn = self.testData.directory + "/ex2.bam"
+        self.generatedBamFn = self.testData.directory + "/generated.bam"
+        
+        # compare input records to generated copy's records
+        names_in = self.originalNames()
+        names_out = self.generatedNames()
+        self.assertEqual(names_in, names_out)
+        
+        # clean up
+        os.remove(self.generatedBamFn)
diff --git a/tests/src/python/test/test_Frames.py b/tests/src/python/test/test_Frames.py
new file mode 100755
index 0000000..7855bbb
--- /dev/null
+++ b/tests/src/python/test/test_Frames.py
@@ -0,0 +1,95 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config 
+import unittest
+
+class FramesTest(unittest.TestCase):
+    
+    # ------------ SETUP --------------
+    
+    def setUp(self):
+        self.testframes = [
+            0,  8,  140, 0,   0,  7,   4,  0,  85, 2,
+            1,  3,  2,   10,  1,  20,  47, 10, 9,  60,
+            20, 3,  12,  5,   13, 165, 6,  14, 22, 12,
+            2,  4,  9,   218, 27, 3,   15, 2,  17, 2,
+            45, 24, 89,  10,  7,  1,   11, 15, 0,  7,
+            0,  28, 17,  12,  6,  10,  37, 0,  12, 52,
+            0,  7,  1,   14,  3,  26,  12, 0,  20, 17,
+            2,  13, 2,   9,   13, 7,   15, 29, 3,   6,
+            2,  1,  28,  10,  3,  14,  7,  1,  22, 1,
+            6,  6,  0,   19,  31, 6,   2,  14, 0,  0,
+            1000, 947, 948
+        ]
+
+        self.encoded  = [
+            0,     8,  102,   0,   0,   7,   4,   0,  75,   2,   1,   3,   2,
+            10,    1,   20,  47,  10,   9,  60,  20,   3,  12,   5,  13, 115,
+            6,    14,   22,  12,   2,   4,   9, 135,  27,   3,  15,   2,  17,
+            2,    45,   24,  77,  10,   7,   1,  11,  15,   0,   7,   0,  28,
+            17,   12,    6,  10,  37,   0,  12,  52,   0,   7,   1,  14,   3,
+            26,   12,    0,  20,  17,   2,  13,   2,   9,  13,   7,  15,  29,
+            3,     6,    2,   1,  28,  10,   3,  14,   7,   1,  22,   1,   6,
+            6,     0,   19,  31,   6,   2,  14,   0,   0,
+            255, 254,  255
+        ]
+        
+    def runTest(self):
+        self.test_ctors()
+        self.test_encode()
+        
+    # ------------ TESTS --------------
+    
+    def test_ctors(self):
+        f = PacBioBam.Frames()
+        self.assertEqual(0, len(f.Data()))
+
+        f2 = PacBioBam.Frames(self.testframes)
+        d  = f2.Data()
+        self.assertEqual(len(self.testframes), len(d))
+        for i, v in enumerate(d):
+            self.assertEqual(int(self.testframes[i]), int(v))
+    
+    def test_encode(self):
+        f = PacBioBam.Frames(self.testframes)
+        e = f.Encode()
+        self.assertEqual(len(self.encoded), len(e))
+        for i, v in enumerate(e):
+            self.assertEqual(int(self.encoded[i]), int(v))
+        
\ No newline at end of file
diff --git a/tests/src/python/test/test_Intervals.py b/tests/src/python/test/test_Intervals.py
new file mode 100755
index 0000000..9e484eb
--- /dev/null
+++ b/tests/src/python/test/test_Intervals.py
@@ -0,0 +1,348 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config 
+import unittest
+
+class IntervalsTest(unittest.TestCase):
+    
+    # ------------ SETUP --------------
+    
+    def runTest(self):
+        self.test_unmappedPosition()
+        self.test_ctors()
+        self.test_equality()
+        self.test_copy()
+        self.test_modifiers()
+        self.test_cover()
+        self.test_intersect()
+        self.test_validity()
+        self.test_length()
+        
+    # ------------ TESTS --------------
+    
+    def test_unmappedPosition(self):
+        self.assertEqual(-1, PacBioBam.UnmappedPosition)
+    
+    def test_ctors(self):
+        empty  = PacBioBam.PositionInterval()
+        single = PacBioBam.PositionInterval(4)
+        normal = PacBioBam.PositionInterval(5, 8)
+        
+        self.assertEqual(0, empty.Start())
+        self.assertEqual(0, empty.Stop())
+        self.assertEqual(4, single.Start())
+        self.assertEqual(5, single.Stop())
+        self.assertEqual(5, normal.Start())
+        self.assertEqual(8, normal.Stop())
+        
+    def test_equality(self):
+        
+        empty           = PacBioBam.PositionInterval()
+        empty2          = PacBioBam.PositionInterval()
+        singleton       = PacBioBam.PositionInterval(4)
+        sameAsSingleton = PacBioBam.PositionInterval(4, 5)
+        normal          = PacBioBam.PositionInterval(5, 8)
+        sameAsNormal    = PacBioBam.PositionInterval(5, 8)
+        different       = PacBioBam.PositionInterval(20, 40)
+        
+        # self-equality
+        self.assertEqual(empty, empty)
+        self.assertEqual(singleton, singleton)
+        self.assertEqual(normal, normal)
+        self.assertEqual(different, different)
+
+        # same values
+        self.assertEqual(empty, empty2)
+        self.assertEqual(singleton, sameAsSingleton)
+        self.assertEqual(normal, sameAsNormal)
+        
+        # different values
+        self.assertNotEqual(empty, singleton)
+        self.assertNotEqual(empty, normal)
+        self.assertNotEqual(empty, different)
+        self.assertNotEqual(singleton, normal)
+        self.assertNotEqual(normal, different)
+        
+    def test_copy(self):
+        interval1 = PacBioBam.PositionInterval(5,8)
+        interval2 = PacBioBam.PositionInterval(interval1)
+        interval3 = interval1
+        
+        self.assertEqual(interval1, interval1)
+        self.assertEqual(interval1, interval2)
+        self.assertEqual(interval1, interval3)
+        
+    def test_modifiers(self):
+        
+        interval1 = PacBioBam.PositionInterval(5,8)
+        interval2 = PacBioBam.PositionInterval(interval1)
+        interval2.Start(2)
+        interval2.Stop(10)
+        
+        self.assertNotEqual(interval1, interval2)
+        self.assertEqual(2,  interval2.Start())
+        self.assertEqual(10, interval2.Stop())
+        
+    def test_cover(self):
+        
+        a = PacBioBam.PositionInterval(2,4)
+        b = PacBioBam.PositionInterval(3,5)
+        c = PacBioBam.PositionInterval(6,8)
+        d = PacBioBam.PositionInterval(1,7)
+        e = PacBioBam.PositionInterval(5,8)
+        
+        #   0123456789  
+        # a   --
+        # b    --
+        # c       --
+        # d  ------
+        # e      ---
+
+        # self-cover
+        self.assertTrue(a.Covers(a)) 
+        self.assertTrue(a.CoveredBy(a))
+
+        # basic covers/covered
+        self.assertTrue(b.CoveredBy(d))
+        self.assertTrue(d.Covers(b))
+        self.assertNotEqual(b, d)
+        self.assertFalse(b.Covers(d))
+ 
+        # completely disjoint
+        self.assertFalse(b.Covers(c))
+        self.assertFalse(c.Covers(b))
+        self.assertFalse(b.CoveredBy(c))
+        self.assertFalse(c.CoveredBy(b))
+        
+        # b.stop == e.start
+        self.assertFalse(b.Covers(e))
+        self.assertFalse(b.CoveredBy(e))
+
+        # shared endpoint, start contained
+        self.assertTrue(e.Covers(c))
+        self.assertTrue(c.CoveredBy(e))
+        
+    def test_intersect(self):
+        
+        a = PacBioBam.PositionInterval(2,4)
+        b = PacBioBam.PositionInterval(3,5)
+        c = PacBioBam.PositionInterval(6,8)
+        d = PacBioBam.PositionInterval(1,7)
+        e = PacBioBam.PositionInterval(5,8)
+        
+        #   0123456789  
+        # a   --
+        # b    --
+        # c       --
+        # d  ------
+        # e      ---
+        
+        # self-intersection
+        self.assertTrue(a.Intersects(a))
+        
+        # intersection is commutative
+        self.assertTrue(a.Intersects(b))
+        self.assertTrue(b.Intersects(a))
+        
+        # covered implies intersection
+        self.assertTrue(d.Covers(a))
+        self.assertTrue(a.Intersects(d))
+        self.assertTrue(d.Intersects(a))
+
+        # c.start > b.stop (obvious disjoint)
+        self.assertFalse(b.Intersects(c))
+        
+        # b.stop == e.start (intervals are right-open, so disjoint)
+        self.assertFalse(b.Intersects(e))
+
+    def test_validity(self):
+        
+        a = PacBioBam.PositionInterval()     # default ctor
+        b = PacBioBam.PositionInterval(0,0)  # start == stop (zero)
+        c = PacBioBam.PositionInterval(4,4)  # start == stop (nonzero)
+        d = PacBioBam.PositionInterval(0,1)  # start < stop  (start is zero)
+        e = PacBioBam.PositionInterval(4,5)  # start < stop  (start is nonzero)
+        f = PacBioBam.PositionInterval(5,4)  # start > stop
+        
+        self.assertFalse(a.IsValid())
+        self.assertFalse(b.IsValid())
+        self.assertFalse(c.IsValid())
+        self.assertTrue(d.IsValid())
+        self.assertTrue(e.IsValid())
+        self.assertFalse(f.IsValid())
+        
+    def test_length(self):
+        
+        a = PacBioBam.PositionInterval(2,4)
+        b = PacBioBam.PositionInterval(3,5)
+        c = PacBioBam.PositionInterval(6,8)
+        d = PacBioBam.PositionInterval(1,7)
+        e = PacBioBam.PositionInterval(5,8)
+        
+        self.assertEqual(2, a.Length())
+        self.assertEqual(2, b.Length())
+        self.assertEqual(2, c.Length())
+        self.assertEqual(6, d.Length())
+        self.assertEqual(3, e.Length())
+        
+class GenomicIntervalsTest(unittest.TestCase):
+    
+    # ------------ SETUP --------------
+    
+    def runTest(self):
+        self.test_ctors()
+        self.test_copy()
+        self.test_modifiers()
+        self.test_cover()
+        self.test_validity()
+    
+    # ------------ TESTS --------------
+    
+    def test_ctors(self):
+        
+        empty  = PacBioBam.GenomicInterval()
+        normal = PacBioBam.GenomicInterval("foo", 100, 200)
+        
+        self.assertEqual("", empty.Name())
+        self.assertEqual(0,  empty.Start())
+        self.assertEqual(0,  empty.Stop())
+        
+        self.assertEqual("foo", normal.Name())
+        self.assertEqual(100,   normal.Start())
+        self.assertEqual(200,   normal.Stop())
+
+        
+    def test_copy(self):
+        
+        a = PacBioBam.GenomicInterval("foo", 10, 20)
+        b = PacBioBam.GenomicInterval(a)
+        c = a
+        
+        self.assertEqual(a, a)
+        self.assertEqual(a, b)
+        self.assertEqual(a, c)
+        
+    def test_modifiers(self):
+        
+        a = PacBioBam.GenomicInterval("foo", 10, 20)
+        
+        b = PacBioBam.GenomicInterval(a)
+        b.Name("bar").Start(2).Stop(10)
+        
+        c = PacBioBam.GenomicInterval(a)
+        c.Interval(b.Interval())
+        
+        self.assertNotEqual(a, b)
+        self.assertEqual("bar",  b.Name())
+        self.assertEqual(2,  b.Start())
+        self.assertEqual(10, b.Stop())        
+        self.assertEqual(a.Name(), c.Name())
+        self.assertEqual(b.Interval(), c.Interval())
+        
+    def test_cover(self):
+        
+        a = PacBioBam.GenomicInterval("foo",2,4)
+        b = PacBioBam.GenomicInterval("foo",3,5)
+        c = PacBioBam.GenomicInterval("foo",6,8)
+        d = PacBioBam.GenomicInterval("foo",1,7)
+        e = PacBioBam.GenomicInterval("foo",5,8)
+        f = PacBioBam.GenomicInterval("bar",3,5)  # same as b, different ref
+        
+        #   0123456789  
+        # a   --
+        # b    --
+        # c       --
+        # d  ------
+        # e      ---
+        
+        # self-cover
+        self.assertTrue(a.Covers(a))
+        self.assertTrue(a.CoveredBy(a))
+        
+        # basic covers/covered
+        self.assertTrue(b.CoveredBy(d))
+        self.assertTrue(d.Covers(b))
+        self.assertNotEqual(b, d)
+        self.assertFalse(b.Covers(d))
+        
+        # same coords as b, but different ref
+        self.assertFalse(f.CoveredBy(d))
+        self.assertFalse(d.Covers(f))
+        self.assertNotEqual(f, d)
+        self.assertFalse(f.Covers(d))
+        
+        # obvious disjoint
+        self.assertFalse(b.Covers(c))
+        self.assertFalse(c.Covers(b))
+        self.assertFalse(b.CoveredBy(c))
+        self.assertFalse(c.CoveredBy(b))
+        
+        # b.stop == e.start (intervals are right-open, so disjoint)
+        self.assertFalse(b.Covers(e))
+        self.assertFalse(b.CoveredBy(e))
+        
+        # shared endpoint, start contained
+        self.assertTrue(e.Covers(c))
+        self.assertTrue(c.CoveredBy(e)) 
+        
+    def test_validity(self):
+        
+        a = PacBioBam.GenomicInterval()       # default
+        b = PacBioBam.GenomicInterval("foo",0,0)  # valid id, start == stop (zero)
+        c = PacBioBam.GenomicInterval("foo",4,4)  # valid id, start == stop (non-zero)
+        d = PacBioBam.GenomicInterval("foo",0,1)  # valid id, start <  stop (start == zero)     OK
+        e = PacBioBam.GenomicInterval("foo",4,5)  # valid id, start <  stop (start >  zero)     OK
+        f = PacBioBam.GenomicInterval("foo",5,4)  # valid id, start >  stop 
+        g = PacBioBam.GenomicInterval("",0,0) # invalid id, start == stop (zero)
+        h = PacBioBam.GenomicInterval("",4,4) # invalid id, start == stop (non-zero)
+        i = PacBioBam.GenomicInterval("",0,1) # invalid id, start <  stop (start == zero)
+        j = PacBioBam.GenomicInterval("",4,5) # invalid id, start <  stop (start >  zero)
+        k = PacBioBam.GenomicInterval("",5,4) # invalid id, start >  stop 
+             
+        self.assertTrue(d.IsValid())
+        self.assertTrue(e.IsValid())
+        self.assertFalse(a.IsValid())
+        self.assertFalse(b.IsValid())
+        self.assertFalse(c.IsValid())
+        self.assertFalse(f.IsValid())
+        self.assertFalse(g.IsValid())
+        self.assertFalse(h.IsValid())
+        self.assertFalse(i.IsValid())
+        self.assertFalse(j.IsValid())
+        self.assertFalse(k.IsValid())
diff --git a/tests/src/python/test/test_QualityValues.py b/tests/src/python/test/test_QualityValues.py
new file mode 100755
index 0000000..41bf8c3
--- /dev/null
+++ b/tests/src/python/test/test_QualityValues.py
@@ -0,0 +1,131 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+import PacBioBam
+import config 
+import unittest
+
+class QualityValueTest(unittest.TestCase):
+    
+    # ------------ SETUP --------------
+    
+    def runTest(self):
+        self.test_defaults()
+        self.test_fromNumber()
+        self.test_fromFastq()
+        
+    # ------------ TESTS --------------
+    
+    def test_defaults(self):
+        value = PacBioBam.QualityValue()    
+        self.assertEqual(0,  int(value))
+        self.assertEqual('!', value.Fastq())
+        
+    def test_fromNumber(self):
+        
+        zero        = PacBioBam.QualityValue(0)
+        thirtythree = PacBioBam.QualityValue(33)
+        normal      = PacBioBam.QualityValue(42)
+        maxQV       = PacBioBam.QualityValue(93)
+        tooHigh     = PacBioBam.QualityValue(94)
+        max8bit     = PacBioBam.QualityValue(126)
+        
+        self.assertEqual(0,  int(zero))
+        self.assertEqual(33, int(thirtythree))
+        self.assertEqual(42, int(normal))
+        self.assertEqual(93, int(maxQV))
+        self.assertEqual(93, int(tooHigh))
+        self.assertEqual(93, int(max8bit))
+
+        self.assertEqual('!', zero.Fastq())
+        self.assertEqual('B', thirtythree.Fastq())
+        self.assertEqual('K', normal.Fastq())
+        self.assertEqual('~', maxQV.Fastq())
+        self.assertEqual('~', tooHigh.Fastq())
+        self.assertEqual('~', max8bit.Fastq())
+
+    def test_fromFastq(self):
+        
+        zero        = PacBioBam.QualityValue.FromFastq('!')
+        thirtythree = PacBioBam.QualityValue.FromFastq('B')
+        normal      = PacBioBam.QualityValue.FromFastq('K')
+        maxQV       = PacBioBam.QualityValue.FromFastq('~')
+        
+        self.assertEqual(0,  int(zero))
+        self.assertEqual(33, int(thirtythree))
+        self.assertEqual(42, int(normal))
+        self.assertEqual(93, int(maxQV))
+        
+class QualityValuesTest(unittest.TestCase):
+    
+    # ------------ SETUP --------------
+    
+    def runTest(self):
+        self.test_defaults()
+        self.test_fromNumbers()
+        self.test_fromFastq()
+        
+    # ------------ TESTS --------------
+    
+    def test_defaults(self):
+        values = PacBioBam.QualityValues()    
+        self.assertFalse(values.Fastq()) 
+        
+    def test_fromNumbers(self):
+        
+        fastqString = "~~~KKBB!!"
+        values = [ 93, 93, 93, 42, 42, 33, 33, 0, 0 ]
+        
+        qvs = PacBioBam.QualityValues()
+        for value in values:
+            qvs.append(PacBioBam.QualityValue(value))
+            
+        self.assertEqual(fastqString, qvs.Fastq())
+
+    def test_fromFastq(self):
+        
+        fastqString = "~~~KKBB!!"
+        values = [ 93, 93, 93, 42, 42, 33, 33, 0, 0 ]
+        
+        qvs = PacBioBam.QualityValues.FromFastq(fastqString)
+        
+        self.assertEqual(len(fastqString), len(qvs))
+        self.assertEqual(len(values),      len(qvs))
+        
+        for i, v in enumerate(values):
+            self.assertEqual(v, int(qvs[i]))
+    
\ No newline at end of file
diff --git a/tests/src/python/test_pbbam.py b/tests/src/python/test_pbbam.py
new file mode 100755
index 0000000..8ca3c90
--- /dev/null
+++ b/tests/src/python/test_pbbam.py
@@ -0,0 +1,48 @@
+# Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted (subject to the limitations in the
+# disclaimer below) provided that the following conditions are met:
+#
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+#  * 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.
+#
+#  * Neither the name of Pacific Biosciences nor the names of its
+#    contributors may be used to endorse or promote products derived
+#    from this software without specific prior written permission.
+#
+# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+# GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+# BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+# 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.
+#
+# Author: Derek Barnett
+
+import sys
+import unittest
+
+if __name__ == "__main__":
+    suite  = unittest.TestLoader().discover('.', pattern = "test_*.py")
+    result = unittest.TextTestRunner(verbosity=2).run(suite)
+    if result.wasSuccessful():
+        sys.exit(0)
+    else:
+        sys.exit(1)
+    
\ No newline at end of file
diff --git a/tests/src/test_Accuracy.cpp b/tests/src/test_Accuracy.cpp
new file mode 100644
index 0000000..17d1f59
--- /dev/null
+++ b/tests/src/test_Accuracy.cpp
@@ -0,0 +1,63 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/Accuracy.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(AccuracyTest, ClampValues)
+{
+    Accuracy a_zero(0);
+    Accuracy a_neg(-1);
+    Accuracy a_min(0);
+    Accuracy a_normal(300);
+    Accuracy a_max(1000);
+    Accuracy a_tooLarge(2000);
+
+    EXPECT_EQ(0,    a_zero);
+    EXPECT_EQ(0,    a_neg);
+    EXPECT_EQ(0,    a_min);
+    EXPECT_EQ(300,  a_normal);
+    EXPECT_EQ(1000, a_max);
+    EXPECT_EQ(1000, a_tooLarge);
+}
diff --git a/tests/src/test_AlignmentPrinter.cpp b/tests/src/test_AlignmentPrinter.cpp
new file mode 100644
index 0000000..0034f2d
--- /dev/null
+++ b/tests/src/test_AlignmentPrinter.cpp
@@ -0,0 +1,102 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+
+#include "pbbam/AlignmentPrinter.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/IndexedFastaReader.h"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string lambdaFasta = tests::Data_Dir + "/lambdaNEB.fa";
+const string singleInsertionBam = tests::Data_Dir + "/aligned.bam";
+
+TEST(AlignmentPrinterTest, Print)
+{
+    IndexedFastaReader r(lambdaFasta);
+
+    BamFile bamFile(singleInsertionBam);
+    EntireFileQuery bamQuery(bamFile);
+
+    auto it = bamQuery.begin();
+    
+
+    // std::cerr << record.AlignedStart() << std::endl;
+    // std::cerr << record.Sequence(Orientation::GENOMIC, true) << std::endl;
+    // std::cerr << record.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+
+    AlignmentPrinter pretty(r);
+
+    // std::string expected =
+    // "Read        : singleInsertion2\n"
+    // "Reference   : lambda_NEB3011\n"
+    // "\n"
+    // "Read-length : 49\n"
+    // "Concordance : 0.96\n"
+    // "\n"
+    // "   GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT\n"
+    // "   |||||||| ||||||||||||||||||| |||||||||||||||||||||\n"
+    // "   GGCTGCAG-GTACAGCGGTCAGGAGGCCAATTGATGCCGGACTGGCTGAT\n";
+    // EXPECT_EQ(expected, pretty.Print(record, Orientation::NATIVE));
+
+    auto record = *it++;
+    std::cerr << pretty.Print(record, Orientation::GENOMIC);
+    std::cerr << std::endl << std::endl;
+    record = *it++;
+    std::cerr << pretty.Print(record, Orientation::GENOMIC);
+    std::cerr << std::endl << std::endl;
+    record = *it++;
+    std::cerr << pretty.Print(record, Orientation::GENOMIC);
+    std::cerr << std::endl << std::endl;
+    record = *it++;
+    std::cerr << pretty.Print(record, Orientation::GENOMIC);
+    std::cerr << std::endl << std::endl;
+}
diff --git a/tests/src/test_BamFile.cpp b/tests/src/test_BamFile.cpp
new file mode 100644
index 0000000..4ca910d
--- /dev/null
+++ b/tests/src/test_BamFile.cpp
@@ -0,0 +1,69 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/BamFile.h>
+#include <stdexcept>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(BamFileTest, NonExistentFileThrows)
+{
+    EXPECT_THROW(
+    {
+       BamFile file("does_not_exist.bam");
+       (void)file;
+    },
+    std::exception);
+}
+
+TEST(BamFileTest, NonBamFileThrows)
+{
+    EXPECT_THROW(
+    {
+        const std::string& fn = tests::Data_Dir + "/lambdaNEB.fa.fai";
+        BamFile file(fn);
+        (void)file;
+    },
+    std::exception);
+}
diff --git a/tests/src/test_BamHeader.cpp b/tests/src/test_BamHeader.cpp
new file mode 100644
index 0000000..c4f872a
--- /dev/null
+++ b/tests/src/test_BamHeader.cpp
@@ -0,0 +1,281 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <htslib/sam.h>
+#include <pbbam/BamHeader.h>
+#include <iostream>
+#include <string>
+#include <utility>
+#include <vector>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+struct BamHdrDeleter
+{
+    void operator()(bam_hdr_t* hdr) {
+        if (hdr)
+            bam_hdr_destroy(hdr);
+        hdr = nullptr;
+    }
+};
+
+} // namespace tests
+
+TEST(BamHeaderTest, DefaultConstruction)
+{
+    BamHeader header;
+    EXPECT_TRUE(header.Version().empty());
+    EXPECT_TRUE(header.SortOrder().empty()); // default to unknown ?
+    EXPECT_TRUE(header.ReadGroups().empty());
+    EXPECT_TRUE(header.Sequences().empty());
+    EXPECT_TRUE(header.Programs().empty());
+    EXPECT_TRUE(header.Comments().empty());
+
+    EXPECT_THROW(header.Program("foo"),     std::exception);
+    EXPECT_THROW(header.ReadGroup("foo"),   std::exception);
+    EXPECT_THROW(header.SequenceId("foo"),  std::exception);
+    EXPECT_THROW(header.SequenceLength(42), std::exception);
+    EXPECT_THROW(header.SequenceName(42),   std::exception);
+}
+
+TEST(BamHeaderTest, DecodeTest)
+{
+    const string& text = "@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+                         "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+                         "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+                         "@RG\tID:rg1\tSM:control\n"
+                         "@RG\tID:rg2\tSM:condition1\n"
+                         "@RG\tID:rg3\tSM:condition1\n"
+                         "@PG\tID:_foo_\tPN:ide\n"
+                         "@CO\tipsum and so on\n"
+                         "@CO\tcitation needed\n";
+
+    BamHeader header = BamHeader(text);
+
+    EXPECT_EQ(string("1.1"),       header.Version());
+    EXPECT_EQ(string("queryname"), header.SortOrder());
+    EXPECT_EQ(string("3.0b3"),     header.PacBioBamVersion());
+
+    EXPECT_EQ(3, header.ReadGroups().size());
+    EXPECT_TRUE(header.HasReadGroup("rg1"));
+    EXPECT_TRUE(header.HasReadGroup("rg2"));
+    EXPECT_TRUE(header.HasReadGroup("rg3"));
+
+    EXPECT_EQ(string("control"),    header.ReadGroup("rg1").Sample());
+    EXPECT_EQ(string("condition1"), header.ReadGroup("rg2").Sample());
+    EXPECT_EQ(string("condition1"), header.ReadGroup("rg3").Sample());
+
+    EXPECT_EQ(2, header.Sequences().size());
+    EXPECT_TRUE(header.HasSequence("chr1"));
+    EXPECT_TRUE(header.HasSequence("chr2"));
+    EXPECT_EQ(string("chocobo"), header.Sequence("chr1").Species());
+    EXPECT_EQ(string("chocobo"), header.Sequence("chr2").Species());
+    EXPECT_EQ(string("2038"), header.Sequence("chr1").Length());
+    EXPECT_EQ(string("3042"), header.Sequence("chr2").Length());
+
+    EXPECT_EQ(1, header.Programs().size());
+    EXPECT_TRUE(header.HasProgram("_foo_"));
+    EXPECT_EQ(string("ide"), header.Program("_foo_").Name());
+
+    EXPECT_EQ(2, header.Comments().size());
+    EXPECT_EQ(string("ipsum and so on"), header.Comments().at(0));
+    EXPECT_EQ(string("citation needed"), header.Comments().at(1));
+}
+
+TEST(BamHeaderCodecTest, EncodeTest)
+{
+    ReadGroupInfo rg1("rg1");
+    rg1.Sample("control");
+    ReadGroupInfo rg2("rg2");
+    rg2.Sample("condition1");
+    ReadGroupInfo rg3("rg3");
+    rg3.Sample("condition1");
+
+    SequenceInfo seq1("chr1");
+    seq1.Length("2038").Species("chocobo");
+    SequenceInfo seq2("chr2");
+    seq2.Length("3042").Species("chocobo");
+
+    ProgramInfo prog1("_foo_");
+    prog1.Name("ide");
+
+    BamHeader header;
+    header.Version("1.1")
+          .SortOrder("queryname")
+          .PacBioBamVersion("3.0b3")
+          .AddReadGroup(rg1)
+          .AddReadGroup(rg2)
+          .AddReadGroup(rg3)
+          .AddSequence(seq1)
+          .AddSequence(seq2)
+          .AddProgram(prog1)
+          .AddComment("ipsum and so on")
+          .AddComment("citation needed");
+
+    const string& expectedText = "@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+                                 "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+                                 "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+                                 "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control\n"
+                                 "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+                                 "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+                                 "@PG\tID:_foo_\tPN:ide\n"
+                                 "@CO\tipsum and so on\n"
+                                 "@CO\tcitation needed\n";
+
+    const string& text = header.ToSam();
+    EXPECT_EQ(expectedText, text);
+}
+
+TEST(BamHeaderTest, ConvertToRawDataOk)
+{
+    ReadGroupInfo rg1("rg1");
+    rg1.Sample("control");
+    ReadGroupInfo rg2("rg2");
+    rg2.Sample("condition1");
+    ReadGroupInfo rg3("rg3");
+    rg3.Sample("condition1");
+
+    SequenceInfo seq1("chr1");
+    seq1.Length("2038").Species("chocobo");
+    SequenceInfo seq2("chr2");
+    seq2.Length("3042").Species("chocobo");
+
+    ProgramInfo prog1("_foo_");
+    prog1.Name("ide");
+
+    BamHeader header;
+    header.Version("1.1")
+          .SortOrder("queryname")
+          .PacBioBamVersion("3.0b3")
+          .AddReadGroup(rg1)
+          .AddReadGroup(rg2)
+          .AddReadGroup(rg3)
+          .AddSequence(seq1)
+          .AddSequence(seq2)
+          .AddProgram(prog1)
+          .AddComment("ipsum and so on")
+          .AddComment("citation needed");
+
+    const string& expectedText = "@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+                                 "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+                                 "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+                                 "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control\n"
+                                 "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+                                 "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+                                 "@PG\tID:_foo_\tPN:ide\n"
+                                 "@CO\tipsum and so on\n"
+                                 "@CO\tcitation needed\n";
+
+
+    const string& text = header.ToSam();
+    PBBAM_SHARED_PTR<bam_hdr_t> rawData(sam_hdr_parse(text.size(), text.c_str()), tests::BamHdrDeleter());
+    rawData->ignore_sam_err = 0;
+    rawData->cigar_tab = NULL;
+    rawData->l_text = text.size();
+    rawData->text = (char*)calloc(rawData->l_text + 1, 1);
+    memcpy(rawData->text, text.c_str(), rawData->l_text);
+
+    const string& rawText = string(rawData->text, rawData->l_text);
+    EXPECT_EQ(expectedText, rawText);
+}
+
+TEST(BamHeaderTest, ExtractFromRawDataOk)
+{
+    ReadGroupInfo rg1("rg1");
+    rg1.Sample("control");
+    ReadGroupInfo rg2("rg2");
+    rg2.Sample("condition1");
+    ReadGroupInfo rg3("rg3");
+    rg3.Sample("condition1");
+
+    SequenceInfo seq1("chr1");
+    seq1.Length("2038").Species("chocobo");
+    SequenceInfo seq2("chr2");
+    seq2.Length("3042").Species("chocobo");
+
+    ProgramInfo prog1("_foo_");
+    prog1.Name("ide");
+
+    BamHeader header;
+    header.Version("1.1")
+          .SortOrder("queryname")
+          .PacBioBamVersion("3.0b3")
+          .AddReadGroup(rg1)
+          .AddReadGroup(rg2)
+          .AddReadGroup(rg3)
+          .AddSequence(seq1)
+          .AddSequence(seq2)
+          .AddProgram(prog1)
+          .AddComment("ipsum and so on")
+          .AddComment("citation needed");
+
+    const string& expectedText = "@HD\tVN:1.1\tSO:queryname\tpb:3.0b3\n"
+                                 "@SQ\tSN:chr1\tLN:2038\tSP:chocobo\n"
+                                 "@SQ\tSN:chr2\tLN:3042\tSP:chocobo\n"
+                                 "@RG\tID:rg1\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:control\n"
+                                 "@RG\tID:rg2\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+                                 "@RG\tID:rg3\tPL:PACBIO\tDS:READTYPE=UNKNOWN\tSM:condition1\n"
+                                 "@PG\tID:_foo_\tPN:ide\n"
+                                 "@CO\tipsum and so on\n"
+                                 "@CO\tcitation needed\n";
+
+
+    string text = header.ToSam();
+    PBBAM_SHARED_PTR<bam_hdr_t> rawData(sam_hdr_parse(text.size(), text.c_str()), tests::BamHdrDeleter());
+    rawData->ignore_sam_err = 0;
+    rawData->cigar_tab = NULL;
+    rawData->l_text = text.size();
+    rawData->text = (char*)calloc(rawData->l_text + 1, 1);
+    memcpy(rawData->text, text.c_str(), rawData->l_text);
+
+    const BamHeader newHeader = BamHeader(string(rawData->text, rawData->l_text));
+
+    EXPECT_EQ(header.Version(),          newHeader.Version());
+    EXPECT_EQ(header.SortOrder(),        newHeader.SortOrder());
+    EXPECT_EQ(header.PacBioBamVersion(), newHeader.PacBioBamVersion());
+
+    text = newHeader.ToSam();
+    EXPECT_EQ(expectedText, text);
+}
diff --git a/tests/src/test_BamRecord.cpp b/tests/src/test_BamRecord.cpp
new file mode 100644
index 0000000..e32ad2e
--- /dev/null
+++ b/tests/src/test_BamRecord.cpp
@@ -0,0 +1,1993 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecord.h>
+#include <pbbam/BamTagCodec.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+static
+BamRecordImpl CreateBamImpl(void)
+{
+    BamRecordImpl bam;
+    bam.Bin(42);
+    bam.Flag(42);
+    bam.InsertSize(42);
+    bam.MapQuality(42);
+    bam.MatePosition(42);
+    bam.MateReferenceId(42);
+    bam.Position(42);
+    bam.ReferenceId(42);
+
+    TagCollection tags;
+    tags["HX"] = string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = vector<uint8_t>({34, 5, 125});
+    tags["XY"] = static_cast<int32_t>(-42);
+    bam.Tags(tags);
+
+    return bam;
+}
+
+static
+BamRecord CreateBam(void)
+{
+    BamRecord bam;
+    bam.impl_ = CreateBamImpl();
+    return bam;
+}
+
+static
+void CheckRawData(const BamRecordImpl& bam)
+{
+    // ensure raw data (lengths at least) matches API-facing data
+
+    const uint32_t expectedNameLength  = bam.Name().size() + 1;
+    const uint32_t expectedNumCigarOps = bam.CigarData().size();
+    const int32_t  expectedSeqLength   = bam.Sequence().length();
+    const size_t   expectedTagsLength  = BamTagCodec::Encode(bam.Tags()).size();
+
+    //  Name        CIGAR         Sequence       Quals      Tags
+    // l_qname + (n_cigar * 4) + (l_qseq+1)/2 + l_qseq + << TAGS >>
+
+    const int expectedTotalDataLength = expectedNameLength +
+                                        (expectedNumCigarOps * 4) +
+                                        (expectedSeqLength+1)/2 +
+                                         expectedSeqLength +
+                                         expectedTagsLength;
+
+    EXPECT_TRUE((bool)bam.d_);
+    EXPECT_EQ(expectedNameLength,      bam.d_->core.l_qname);
+    EXPECT_EQ(expectedNumCigarOps,     bam.d_->core.n_cigar);
+    EXPECT_EQ(expectedSeqLength,       bam.d_->core.l_qseq);
+    EXPECT_EQ(expectedTotalDataLength, bam.d_->l_data);
+}
+
+static
+void CheckRawData(const BamRecord& bam)
+{ CheckRawData(bam.impl_); }
+
+static
+BamRecordImpl MakeCigaredImpl(const string& seq,
+                              const string& cigar,
+                              const bool isReverseStrand)
+{
+    BamRecordImpl impl;
+    impl.SetMapped(true).ReferenceId(0).Position(0).MapQuality(0);
+    impl.CigarData(Cigar::FromStdString(cigar));
+    impl.MateReferenceId(-1).MatePosition(-1).InsertSize(0);
+    impl.SetSequenceAndQualities(seq, string(seq.size(), '*'));
+    impl.SetReverseStrand(isReverseStrand);
+    return impl;
+}
+
+static
+BamRecord MakeCigaredRecord(const string& seq,
+                            const string& cigar,
+                            const bool isReverseStrand)
+{
+    const BamRecordImpl impl = MakeCigaredImpl(seq, cigar, isReverseStrand);
+    return BamRecord(std::move(impl));
+}
+
+static
+BamRecord MakeCigaredBaseRecord(const string& bases,
+                                const string& cigar,
+                                const bool isReverseStrand)
+{
+    const string seq = string(bases.size(), 'N');
+    BamRecordImpl impl = MakeCigaredImpl(seq, cigar, isReverseStrand);
+
+    TagCollection tags;
+    tags["dt"] = bases;
+    tags["st"] = bases;
+    impl.Tags(tags);
+
+    return BamRecord(std::move(impl));
+}
+
+static
+BamRecord MakeCigaredFrameRecord(const vector<uint16_t>& frames,
+                                 const string& cigar,
+                                 const bool isReverseStrand)
+{
+    const string seq = string(frames.size(), 'N');
+    BamRecordImpl impl = MakeCigaredImpl(seq, cigar, isReverseStrand);
+
+    TagCollection tags;
+    tags["ip"] = frames;
+    tags["pw"] = frames;
+    impl.Tags(tags);
+
+    return BamRecord(std::move(impl));
+}
+
+static
+BamRecord MakeCigaredQualRecord(const string& quals,
+                                const string& cigar,
+                                const bool isReverseStrand)
+{
+    const string seq = string(quals.size(), 'N');
+    BamRecordImpl impl = MakeCigaredImpl(seq, cigar, isReverseStrand);
+
+    TagCollection tags;
+    tags["dq"] = quals;
+    tags["iq"] = quals;
+    tags["mq"] = quals;
+    tags["sq"] = quals;
+    impl.Tags(tags);
+
+    return BamRecord(std::move(impl));
+}
+
+} // namespace tests
+
+TEST(BamRecordTest, DefaultValues)
+{
+    BamRecord bam;
+    const string emptyString;
+
+    // BamRecordImpl data
+    EXPECT_EQ(0, bam.impl_.Bin());
+    EXPECT_EQ(BamRecordImpl::UNMAPPED, bam.impl_.Flag());  // forced init unmapped
+    EXPECT_EQ(0, bam.impl_.InsertSize());
+    EXPECT_EQ(255, bam.impl_.MapQuality());
+    EXPECT_EQ(-1, bam.impl_.MateReferenceId());
+    EXPECT_EQ(-1, bam.impl_.MatePosition());
+    EXPECT_EQ(-1, bam.impl_.Position());
+    EXPECT_EQ(-1, bam.impl_.ReferenceId());
+    EXPECT_EQ(0, bam.impl_.Tags().size());
+
+    EXPECT_FALSE(bam.impl_.IsDuplicate());
+    EXPECT_FALSE(bam.impl_.IsFailedQC());
+    EXPECT_FALSE(bam.impl_.IsFirstMate());
+    EXPECT_FALSE(bam.impl_.IsMapped());             // forced init unmapped
+    EXPECT_TRUE(bam.impl_.IsMateMapped());
+    EXPECT_FALSE(bam.impl_.IsMateReverseStrand());
+    EXPECT_FALSE(bam.impl_.IsPaired());
+    EXPECT_TRUE(bam.impl_.IsPrimaryAlignment());
+    EXPECT_FALSE(bam.impl_.IsProperPair());
+    EXPECT_FALSE(bam.impl_.IsReverseStrand());
+    EXPECT_FALSE(bam.impl_.IsSecondMate());
+    EXPECT_FALSE(bam.impl_.IsSupplementaryAlignment());
+
+    EXPECT_EQ(emptyString, bam.impl_.Name());
+    EXPECT_EQ(emptyString, bam.impl_.CigarData().ToStdString());
+    EXPECT_EQ(emptyString, bam.impl_.Sequence());
+    EXPECT_EQ(emptyString, bam.impl_.Qualities().Fastq());
+
+    // PacBio data
+    EXPECT_EQ(-1, bam.AlignedStart());
+    EXPECT_EQ(-1, bam.AlignedEnd());
+    EXPECT_THROW(bam.HoleNumber(), std::exception);
+    // 8888888888888888888888888888888888888
+//    EXPECT_EQ(-1, bam.NumPasses());
+//    EXPECT_EQ(-1, bam.QueryStart());
+//    EXPECT_EQ(-1, bam.QueryEnd());
+//    EXPECT_EQ(0, bam.ReadAccuracy());
+//    EXPECT_EQ(-1, bam.ReferenceStart());
+//    EXPECT_EQ(-1, bam.ReferenceEnd());
+    // 8888888888888888888888888888888888888
+
+    EXPECT_THROW(bam.DeletionQV(), std::exception);
+    EXPECT_THROW(bam.DeletionTag(), std::exception);
+    EXPECT_THROW(bam.InsertionQV(), std::exception);
+    EXPECT_THROW(bam.MergeQV(), std::exception);
+    EXPECT_THROW(bam.SubstitutionQV(), std::exception);
+    EXPECT_THROW(bam.SubstitutionTag(), std::exception);
+
+    // 8888888888888888888888888888888888888
+//    EXPECT_FALSE(bam.HasDeletionQV());
+//    EXPECT_FALSE(bam.HasDeletionTag());
+//    EXPECT_FALSE(bam.HasInsertionQV());
+//    EXPECT_FALSE(bam.HasMergeQV());
+//    EXPECT_FALSE(bam.HasSubstitutionQV());
+//    EXPECT_FALSE(bam.HasSubstitutionTag());
+
+//    EXPECT_EQ(emptyString, bam.MovieName());
+//    EXPECT_EQ(emptyString, bam.ReadGroupId());
+    // 8888888888888888888888888888888888888
+
+    // raw data
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordTest, FromBamRecordImpl)
+{
+    // check generic data
+    BamRecordImpl genericBam = tests::CreateBamImpl();
+
+    EXPECT_EQ(42, genericBam.Bin());
+    EXPECT_EQ(42, genericBam.Flag());
+    EXPECT_EQ(42, genericBam.InsertSize());
+    EXPECT_EQ(42, genericBam.MapQuality());
+    EXPECT_EQ(42, genericBam.MateReferenceId());
+    EXPECT_EQ(42, genericBam.MatePosition());
+    EXPECT_EQ(42, genericBam.Position());
+    EXPECT_EQ(42, genericBam.ReferenceId());
+
+    const TagCollection& genericTags = genericBam.Tags();
+    EXPECT_TRUE(genericTags.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(string("1abc75"), genericTags.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), genericTags.at("XY").ToInt32());
+    EXPECT_EQ(vector<uint8_t>({34, 5, 125}), genericTags.at("CA").ToUInt8Array());
+
+    // copy ctor
+    BamRecord bam1(genericBam);
+
+    EXPECT_EQ(42, bam1.impl_.Bin());
+    EXPECT_EQ(42, bam1.impl_.Flag());
+    EXPECT_EQ(42, bam1.impl_.InsertSize());
+    EXPECT_EQ(42, bam1.impl_.MapQuality());
+    EXPECT_EQ(42, bam1.impl_.MateReferenceId());
+    EXPECT_EQ(42, bam1.impl_.MatePosition());
+    EXPECT_EQ(42, bam1.impl_.Position());
+    EXPECT_EQ(42, bam1.impl_.ReferenceId());
+
+    const TagCollection& bam1Tags = bam1.impl_.Tags();
+    EXPECT_TRUE(bam1Tags.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(string("1abc75"), bam1Tags.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), bam1Tags.at("XY").ToInt32());
+    EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam1Tags.at("CA").ToUInt8Array());
+
+    // copy assignment
+    BamRecord bam2;
+    bam2 = genericBam;
+
+    EXPECT_EQ(42, bam2.impl_.Bin());
+    EXPECT_EQ(42, bam2.impl_.Flag());
+    EXPECT_EQ(42, bam2.impl_.InsertSize());
+    EXPECT_EQ(42, bam2.impl_.MapQuality());
+    EXPECT_EQ(42, bam2.impl_.MateReferenceId());
+    EXPECT_EQ(42, bam2.impl_.MatePosition());
+    EXPECT_EQ(42, bam2.impl_.Position());
+    EXPECT_EQ(42, bam2.impl_.ReferenceId());
+
+    const TagCollection& bam2Tags = bam2.impl_.Tags();
+    EXPECT_TRUE(bam2Tags.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(string("1abc75"), bam2Tags.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), bam2Tags.at("XY").ToInt32());
+    EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam2Tags.at("CA").ToUInt8Array());
+
+    // change genericBam, make sure we deep copied bam1 & bam2
+    genericBam.Position(2000);
+
+    EXPECT_EQ(2000, genericBam.Position());
+    EXPECT_EQ(42, bam1.impl_.Position());
+    EXPECT_EQ(42, bam2.impl_.Position());
+
+    // move ctor
+    BamRecord bam3(move(tests::CreateBamImpl()));
+
+    EXPECT_EQ(42, bam3.impl_.Bin());
+    EXPECT_EQ(42, bam3.impl_.Flag());
+    EXPECT_EQ(42, bam3.impl_.InsertSize());
+    EXPECT_EQ(42, bam3.impl_.MapQuality());
+    EXPECT_EQ(42, bam3.impl_.MateReferenceId());
+    EXPECT_EQ(42, bam3.impl_.MatePosition());
+    EXPECT_EQ(42, bam3.impl_.Position());
+    EXPECT_EQ(42, bam3.impl_.ReferenceId());
+
+    const TagCollection& bam3Tags = bam3.impl_.Tags();
+    EXPECT_TRUE(bam3Tags.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(string("1abc75"), bam3Tags.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), bam3Tags.at("XY").ToInt32());
+    EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam3Tags.at("CA").ToUInt8Array());
+
+    // move assignment
+    BamRecord bam4;
+    bam4 = move(tests::CreateBamImpl());
+
+    EXPECT_EQ(42, bam4.impl_.Bin());
+    EXPECT_EQ(42, bam4.impl_.Flag());
+    EXPECT_EQ(42, bam4.impl_.InsertSize());
+    EXPECT_EQ(42, bam4.impl_.MapQuality());
+    EXPECT_EQ(42, bam4.impl_.MateReferenceId());
+    EXPECT_EQ(42, bam4.impl_.MatePosition());
+    EXPECT_EQ(42, bam4.impl_.Position());
+    EXPECT_EQ(42, bam4.impl_.ReferenceId());
+
+    const TagCollection& bam4Tags = bam4.impl_.Tags();
+    EXPECT_TRUE(bam4Tags.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(string("1abc75"), bam4Tags.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), bam4Tags.at("XY").ToInt32());
+    EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam4Tags.at("CA").ToUInt8Array());
+}
+
+TEST(BamRecordTest, SelfAssignmentTolerated)
+{
+    BamRecord bam1;
+    bam1.impl_.Bin(42);
+    bam1.impl_.Flag(42);
+    bam1.impl_.InsertSize(42);
+    bam1.impl_.MapQuality(42);
+    bam1.impl_.MatePosition(42);
+    bam1.impl_.MateReferenceId(42);
+    bam1.impl_.Position(42);
+    bam1.impl_.ReferenceId(42);
+
+    TagCollection tags;
+    tags["HX"] = string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = vector<uint8_t>({34, 5, 125});
+    tags["XY"] = static_cast<int32_t>(-42);
+    bam1.impl_.Tags(tags);
+
+    bam1 = bam1;
+
+    EXPECT_EQ(42, bam1.impl_.Bin());
+    EXPECT_EQ(42, bam1.impl_.Flag());
+    EXPECT_EQ(42, bam1.impl_.InsertSize());
+    EXPECT_EQ(42, bam1.impl_.MapQuality());
+    EXPECT_EQ(42, bam1.impl_.MateReferenceId());
+    EXPECT_EQ(42, bam1.impl_.MatePosition());
+    EXPECT_EQ(42, bam1.impl_.Position());
+    EXPECT_EQ(42, bam1.impl_.ReferenceId());
+
+    const TagCollection& fetchedTags1 = bam1.impl_.Tags();
+    EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(string("1abc75"), fetchedTags1.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+    EXPECT_EQ(vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+    tests::CheckRawData(bam1);
+}
+
+TEST(BamRecordTest, CoreSetters)
+{
+    // create basic BAM with (generic) data
+    BamRecord bam = tests::CreateBam();
+
+    QualityValues testQVs;
+    testQVs.push_back(0);
+    testQVs.push_back(1);
+
+    const string testTags = "GATTACA";
+
+    // now set PacBio data
+//    bam.AlignedStart(42);
+//    bam.AlignedEnd(42);
+//    bam.DeletionQVs(testQVs);
+//    bam.DeletionTags(testTags);
+//    bam.HoleNumber(42);
+//    bam.InsertionQVs(testQVs);
+//    bam.MergeQVs(testQVs);
+//    bam.NumPasses(42);
+//    bam.QueryEnd(42);
+//    bam.QueryStart(42);
+//    bam.ReadAccuracy(42);
+//    bam.ReferenceEnd(42);
+//    bam.ReferenceStart(42);
+//    bam.SubstitutionQVs(testQVs);
+//    bam.SubstitutionTags(testTags);
+
+    // check generic data
+    EXPECT_EQ(42, bam.impl_.Bin());
+    EXPECT_EQ(42, bam.impl_.Flag());
+    EXPECT_EQ(42, bam.impl_.InsertSize());
+    EXPECT_EQ(42, bam.impl_.MapQuality());
+    EXPECT_EQ(42, bam.impl_.MateReferenceId());
+    EXPECT_EQ(42, bam.impl_.MatePosition());
+    EXPECT_EQ(42, bam.impl_.Position());
+    EXPECT_EQ(42, bam.impl_.ReferenceId());
+
+    // check PacBio data
+//    EXPECT_EQ(42, bam.AlignedStart());
+//    EXPECT_EQ(42, bam.AlignedEnd());
+//    EXPECT_EQ(testQVs, bam.DeletionQVs());
+//    EXPECT_EQ(testTags, bam.DeletionTags());
+//    EXPECT_EQ(42, bam.HoleNumber());
+//    EXPECT_EQ(testQVs, bam.InsertionQVs());
+//    EXPECT_EQ(testQVs, bam.MergeQVs());
+//    EXPECT_EQ(42, bam.NumPasses());
+//    EXPECT_EQ(42, bam.QueryEnd());
+//    EXPECT_EQ(42, bam.QueryStart());
+//    EXPECT_EQ(42, bam.ReadAccuracy());
+//    EXPECT_EQ(42, bam.ReferenceEnd());
+//    EXPECT_EQ(42, bam.ReferenceStart());
+//    EXPECT_EQ(testQVs, bam.SubstitutionQVs());
+//    EXPECT_EQ(testTags, bam.SubstitutionTags());
+
+    // check tags
+    const TagCollection& fetchedTags = bam.impl_.Tags();
+    EXPECT_TRUE(fetchedTags.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(string("1abc75"), fetchedTags.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags.at("XY").ToInt32());
+    EXPECT_EQ(vector<uint8_t>({34, 5, 125}), fetchedTags.at("CA").ToUInt8Array());
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordTest, SequenceOrientation)
+{
+    const string sequence = "ATATATCCCGGCG";
+    const string revSeq   = "CGCCGGGATATAT";
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    BamRecordImpl forwardImpl;
+    forwardImpl.SetSequenceAndQualities(sequence);
+    forwardImpl.SetReverseStrand(false);
+
+    BamRecord forwardRead(forwardImpl);
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(forwardRead.Sequence(Orientation::NATIVE),
+              forwardRead.Sequence(Orientation::GENOMIC));
+    //  - genomic output == genomic input
+    EXPECT_EQ(sequence, forwardRead.Sequence(Orientation::GENOMIC));
+    //  - native output == genomic input
+    EXPECT_EQ(sequence, forwardRead.Sequence(Orientation::NATIVE));
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    BamRecordImpl reverseImpl;
+    reverseImpl.SetSequenceAndQualities(sequence);
+    reverseImpl.SetReverseStrand(true);
+
+    BamRecord reverseRead(reverseImpl);
+
+    //  - "native" != "genomic"
+    EXPECT_NE(reverseRead.Sequence(Orientation::NATIVE),
+              reverseRead.Sequence(Orientation::GENOMIC));
+    //  - genomic output == genomic input
+    EXPECT_EQ(sequence, reverseRead.Sequence(Orientation::GENOMIC));
+    //  - genomic (raw) input != native output
+    EXPECT_NE(sequence, reverseRead.Sequence(Orientation::NATIVE));
+    //  - native output should be reverse complement
+    EXPECT_EQ(revSeq, reverseRead.Sequence(Orientation::NATIVE));
+}
+
+TEST(BamRecordTest, QualitiesOrientation)
+{
+    const string sequence = "ATATATCCCGGCG";
+    const string qualities = "?]?]?]?]?]?]*";
+    const string revQuals  = "*]?]?]?]?]?]?";
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    BamRecordImpl forwardImpl;
+    forwardImpl.SetSequenceAndQualities(sequence, qualities);
+    forwardImpl.SetReverseStrand(false);
+
+    BamRecord forwardRead(forwardImpl);
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(forwardRead.Qualities(Orientation::NATIVE),
+              forwardRead.Qualities(Orientation::GENOMIC));
+    //  - genomic (raw) input == genomic input
+    EXPECT_EQ(qualities, forwardRead.Qualities(Orientation::GENOMIC).Fastq());
+    //  - native output == genomic input
+    EXPECT_EQ(qualities, forwardRead.Qualities(Orientation::NATIVE).Fastq());
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    BamRecordImpl reverseImpl;
+    reverseImpl.SetSequenceAndQualities(sequence, qualities);
+    reverseImpl.SetReverseStrand(true);
+
+    BamRecord reverseRead(reverseImpl);
+
+    //  - "native" != "genomic"
+    EXPECT_NE(reverseRead.Qualities(Orientation::NATIVE),
+              reverseRead.Qualities(Orientation::GENOMIC));
+    //  - genomic output == genomic input
+    EXPECT_EQ(qualities, reverseRead.Qualities(Orientation::GENOMIC).Fastq());
+    //  - genomic (raw) input != native output
+    EXPECT_NE(qualities, reverseRead.Qualities(Orientation::NATIVE).Fastq());
+    //  - native output should be reverse
+    EXPECT_EQ(revQuals, reverseRead.Qualities(Orientation::NATIVE).Fastq());
+}
+
+TEST(BamRecordTest, SequenceTagsOrientation)
+{
+    const string tag    = "ATATATCCCGGCG";
+    const string revTag = "CGCCGGGATATAT";
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    BamRecordImpl forwardImpl;
+    forwardImpl.SetReverseStrand(false);
+    forwardImpl.AddTag("dt", tag);
+    forwardImpl.AddTag("st", tag);
+
+    BamRecord forwardRead(forwardImpl);
+
+    // sanity check
+    EXPECT_TRUE(forwardImpl.HasTag("dt"));
+    EXPECT_TRUE(forwardImpl.HasTag("st"));
+    EXPECT_TRUE(forwardRead.HasDeletionTag());
+    EXPECT_TRUE(forwardRead.HasSubstitutionTag());
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(forwardRead.DeletionTag(Orientation::NATIVE),
+              forwardRead.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(forwardRead.SubstitutionTag(Orientation::NATIVE),
+              forwardRead.SubstitutionTag(Orientation::GENOMIC));
+
+    //  - genomic output == genomic input
+    EXPECT_EQ(tag, forwardRead.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tag, forwardRead.SubstitutionTag(Orientation::GENOMIC));
+
+    //  - native output == genomic input
+    EXPECT_EQ(tag, forwardRead.DeletionTag(Orientation::NATIVE));
+    EXPECT_EQ(tag, forwardRead.SubstitutionTag(Orientation::NATIVE));
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    BamRecordImpl reverseImpl;
+    reverseImpl.SetReverseStrand(true);
+    reverseImpl.AddTag("dt", revTag);
+    reverseImpl.AddTag("st", revTag);
+
+    BamRecord reverseRead(reverseImpl);
+
+    // sanity check
+    EXPECT_TRUE(reverseImpl.HasTag("dt"));
+    EXPECT_TRUE(reverseImpl.HasTag("st"));
+    EXPECT_TRUE(reverseRead.HasDeletionTag());
+    EXPECT_TRUE(reverseRead.HasSubstitutionTag());
+
+    //  - "native" != "genomic"
+    EXPECT_NE(reverseRead.DeletionTag(Orientation::NATIVE),
+              reverseRead.DeletionTag(Orientation::GENOMIC));
+    EXPECT_NE(reverseRead.SubstitutionTag(Orientation::NATIVE),
+              reverseRead.SubstitutionTag(Orientation::GENOMIC));
+
+    //  - genomic output == genomic input
+    EXPECT_EQ(tag, reverseRead.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tag, reverseRead.SubstitutionTag(Orientation::GENOMIC));
+
+    //  - genomic (raw) input != native output
+    EXPECT_NE(tag, reverseRead.DeletionTag(Orientation::NATIVE));
+    EXPECT_NE(tag, reverseRead.SubstitutionTag(Orientation::NATIVE));
+
+    //  - native output should be reverse
+    EXPECT_EQ(revTag, reverseRead.DeletionTag(Orientation::NATIVE));
+    EXPECT_EQ(revTag, reverseRead.SubstitutionTag(Orientation::NATIVE));
+}
+
+TEST(BamRecordTest, FrameTagsOrientation)
+{
+    vector<uint16_t> frameData;
+    vector<uint16_t> revFrameData;
+    for (int i = 0, j = 4; i < 5; ++i, --j) {
+        frameData.push_back(i*10);
+        revFrameData.push_back(j*10);
+    }
+    const Frames frames(frameData);
+    const Frames revFrames(revFrameData);
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    BamRecordImpl forwardImpl;
+    forwardImpl.SetReverseStrand(false);
+    forwardImpl.AddTag("ip", frames.Data());
+    forwardImpl.AddTag("pw", frames.Data());
+
+    BamRecord forwardRead(forwardImpl);
+
+    // sanity check
+    EXPECT_TRUE(forwardImpl.HasTag("ip"));
+    EXPECT_TRUE(forwardImpl.HasTag("pw"));
+    EXPECT_TRUE(forwardRead.HasIPD());
+    EXPECT_TRUE(forwardRead.HasPulseWidth());
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(forwardRead.IPD(Orientation::NATIVE),
+              forwardRead.IPD(Orientation::GENOMIC));
+    EXPECT_EQ(forwardRead.PulseWidth(Orientation::NATIVE),
+              forwardRead.PulseWidth(Orientation::GENOMIC));
+
+    //  - genomic output == genomic input
+    EXPECT_EQ(frames, forwardRead.IPD(Orientation::GENOMIC));
+    EXPECT_EQ(frames, forwardRead.PulseWidth(Orientation::GENOMIC));
+
+    //  - native output == genomic input
+    EXPECT_EQ(frames, forwardRead.IPD(Orientation::NATIVE));
+    EXPECT_EQ(frames, forwardRead.PulseWidth(Orientation::NATIVE));
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    BamRecordImpl reverseImpl;
+    reverseImpl.SetReverseStrand(true);
+    reverseImpl.AddTag("ip", revFrames.Data());
+    reverseImpl.AddTag("pw", revFrames.Data());
+
+    BamRecord reverseRead(reverseImpl);
+
+    // sanity check
+    EXPECT_TRUE(reverseImpl.HasTag("ip"));
+    EXPECT_TRUE(reverseImpl.HasTag("pw"));
+    EXPECT_TRUE(reverseRead.HasIPD());
+    EXPECT_TRUE(reverseRead.HasPulseWidth());
+
+    //  - "native" != "genomic"
+    EXPECT_NE(reverseRead.IPD(Orientation::NATIVE),
+              reverseRead.IPD(Orientation::GENOMIC));
+    EXPECT_NE(reverseRead.PulseWidth(Orientation::NATIVE),
+              reverseRead.PulseWidth(Orientation::GENOMIC));
+
+    //  - genomic output == genomic input
+    EXPECT_EQ(frames, reverseRead.IPD(Orientation::GENOMIC));
+    EXPECT_EQ(frames, reverseRead.PulseWidth(Orientation::GENOMIC));
+
+    //  - genomic (raw) input != native output
+    EXPECT_NE(frames, reverseRead.IPD(Orientation::NATIVE));
+    EXPECT_NE(frames, reverseRead.PulseWidth(Orientation::NATIVE));
+
+    //  - native output should be reverse
+    EXPECT_EQ(revFrames, reverseRead.IPD(Orientation::NATIVE));
+    EXPECT_EQ(revFrames, reverseRead.PulseWidth(Orientation::NATIVE));
+}
+
+TEST(BamRecordTest, QualityTagsOrientation)
+{
+    const string qualities = "?]?]?]?]?]?]*";
+    const string revQuals  = "*]?]?]?]?]?]?";
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    BamRecordImpl forwardImpl;
+    forwardImpl.SetReverseStrand(false);
+    forwardImpl.AddTag("dq", qualities);
+    forwardImpl.AddTag("iq", qualities);
+    forwardImpl.AddTag("mq", qualities);
+    forwardImpl.AddTag("sq", qualities);
+
+    BamRecord forwardRead(forwardImpl);
+
+    // sanity check
+    EXPECT_TRUE(forwardImpl.HasTag("dq"));
+    EXPECT_TRUE(forwardImpl.HasTag("iq"));
+    EXPECT_TRUE(forwardImpl.HasTag("mq"));
+    EXPECT_TRUE(forwardImpl.HasTag("sq"));
+    EXPECT_TRUE(forwardRead.HasDeletionQV());
+    EXPECT_TRUE(forwardRead.HasInsertionQV());
+    EXPECT_TRUE(forwardRead.HasMergeQV());
+    EXPECT_TRUE(forwardRead.HasSubstitutionQV());
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(forwardRead.DeletionQV(Orientation::NATIVE),
+              forwardRead.DeletionQV(Orientation::GENOMIC));
+    EXPECT_EQ(forwardRead.InsertionQV(Orientation::NATIVE),
+              forwardRead.InsertionQV(Orientation::GENOMIC));
+    EXPECT_EQ(forwardRead.MergeQV(Orientation::NATIVE),
+              forwardRead.MergeQV(Orientation::GENOMIC));
+    EXPECT_EQ(forwardRead.SubstitutionQV(Orientation::NATIVE),
+              forwardRead.SubstitutionQV(Orientation::GENOMIC));
+
+    //  - genomic output == genomic input
+    EXPECT_EQ(qualities, forwardRead.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(qualities, forwardRead.InsertionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(qualities, forwardRead.MergeQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(qualities, forwardRead.SubstitutionQV(Orientation::GENOMIC).Fastq());
+
+    //  - native output == genomic input
+    EXPECT_EQ(qualities, forwardRead.DeletionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(qualities, forwardRead.InsertionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(qualities, forwardRead.MergeQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(qualities, forwardRead.SubstitutionQV(Orientation::NATIVE).Fastq());
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    BamRecordImpl reverseImpl;
+    reverseImpl.SetReverseStrand(true);
+    reverseImpl.AddTag("dq", revQuals);
+    reverseImpl.AddTag("iq", revQuals);
+    reverseImpl.AddTag("mq", revQuals);
+    reverseImpl.AddTag("sq", revQuals);
+
+    BamRecord reverseRead(reverseImpl);
+
+    // sanity check
+    EXPECT_TRUE(reverseImpl.HasTag("dq"));
+    EXPECT_TRUE(reverseImpl.HasTag("iq"));
+    EXPECT_TRUE(reverseImpl.HasTag("mq"));
+    EXPECT_TRUE(reverseImpl.HasTag("sq"));
+    EXPECT_TRUE(reverseRead.HasDeletionQV());
+    EXPECT_TRUE(reverseRead.HasInsertionQV());
+    EXPECT_TRUE(reverseRead.HasMergeQV());
+    EXPECT_TRUE(reverseRead.HasSubstitutionQV());
+
+    //  - "native" != "genomic"
+    EXPECT_NE(reverseRead.DeletionQV(Orientation::NATIVE),
+              reverseRead.DeletionQV(Orientation::GENOMIC));
+    EXPECT_NE(reverseRead.InsertionQV(Orientation::NATIVE),
+              reverseRead.InsertionQV(Orientation::GENOMIC));
+    EXPECT_NE(reverseRead.MergeQV(Orientation::NATIVE),
+              reverseRead.MergeQV(Orientation::GENOMIC));
+    EXPECT_NE(reverseRead.SubstitutionQV(Orientation::NATIVE),
+              reverseRead.SubstitutionQV(Orientation::GENOMIC));
+
+    //  - genomic output == genomic input
+    EXPECT_EQ(qualities, reverseRead.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(qualities, reverseRead.InsertionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(qualities, reverseRead.MergeQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(qualities, reverseRead.SubstitutionQV(Orientation::GENOMIC).Fastq());
+
+    //  - genomic (raw) input != native output
+    EXPECT_NE(qualities, reverseRead.DeletionQV(Orientation::NATIVE).Fastq());
+    EXPECT_NE(qualities, reverseRead.InsertionQV(Orientation::NATIVE).Fastq());
+    EXPECT_NE(qualities, reverseRead.MergeQV(Orientation::NATIVE).Fastq());
+    EXPECT_NE(qualities, reverseRead.SubstitutionQV(Orientation::NATIVE).Fastq());
+
+    //  - native output should be reverse
+    EXPECT_EQ(revQuals, reverseRead.DeletionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(revQuals, reverseRead.InsertionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(revQuals, reverseRead.MergeQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(revQuals, reverseRead.SubstitutionQV(Orientation::NATIVE).Fastq());
+}
+
+TEST(BamRecordTest, ClippingAndOrientation)
+{
+    // forward string names, cigar, seq
+    // reverse strand records have same cigar and **input** seq as forward strand
+    // (native output will be rev-comp'd)
+
+    const string s1_cigar = "10=";
+    const string s2_cigar = "3=4N3=";
+    const string s3_cigar = "1S8=1S";
+    const string s4_cigar = "1H8=1H";
+    const string s5_cigar = "2S6=2S";
+    const string s6_cigar = "2S3=2I3=2S";
+    const string s7_cigar = "2H6=2H";
+
+    const string s1_seq  = "ATCCGCGGTT";
+    const string s2_seq  = "ACGTT";
+    const string s3_seq  = "ACCCGCGGTT";
+    const string s4_seq  = "ATCGCGGT";
+    const string s5_seq  = "AGCCGCGGTT";
+    const string s6_seq  = "ATCCGNNCGGTT";
+    const string s7_seq  = "CAGCGG";
+
+    const string s1_seq_clipped  = "ATCCGCGGTT";
+    const string s2_seq_clipped  = "ACGTT";
+    const string s3_seq_clipped  = "CCCGCGGT";
+    const string s4_seq_clipped  = "ATCGCGGT";
+    const string s5_seq_clipped  = "CCGCGG";
+    const string s6_seq_clipped  = "CCGNNCGG";
+    const string s7_seq_clipped  = "CAGCGG";
+
+    const string s1_revseq = "AACCGCGGAT";
+    const string s2_revseq = "AACGT";
+    const string s3_revseq = "AACCGCGGGT";
+    const string s4_revseq = "ACCGCGAT";
+    const string s5_revseq = "AACCGCGGCT";
+    const string s6_revseq = "AACCGNNCGGAT";
+    const string s7_revseq = "CCGCTG";
+
+    const string s1_revseq_clipped = "AACCGCGGAT";
+    const string s2_revseq_clipped = "AACGT";
+    const string s3_revseq_clipped = "ACCGCGGG";
+    const string s4_revseq_clipped = "ACCGCGAT";
+    const string s5_revseq_clipped = "CCGCGG";
+    const string s6_revseq_clipped = "CCGNNCGG";
+    const string s7_revseq_clipped = "CCGCTG";
+
+    const BamRecord s1 = tests::MakeCigaredRecord(s1_seq, s1_cigar, false);
+    const BamRecord s2 = tests::MakeCigaredRecord(s2_seq, s2_cigar, false);
+    const BamRecord s3 = tests::MakeCigaredRecord(s3_seq, s3_cigar, false);
+    const BamRecord s4 = tests::MakeCigaredRecord(s4_seq, s4_cigar, false);
+    const BamRecord s5 = tests::MakeCigaredRecord(s5_seq, s5_cigar, false);
+    const BamRecord s6 = tests::MakeCigaredRecord(s6_seq, s6_cigar, false);
+    const BamRecord s7 = tests::MakeCigaredRecord(s7_seq, s7_cigar, false);
+    const BamRecord s1_reverse = tests::MakeCigaredRecord(s1_seq, s1_cigar, true);
+    const BamRecord s2_reverse = tests::MakeCigaredRecord(s2_seq, s2_cigar, true);
+    const BamRecord s3_reverse = tests::MakeCigaredRecord(s3_seq, s3_cigar, true);
+    const BamRecord s4_reverse = tests::MakeCigaredRecord(s4_seq, s4_cigar, true);
+    const BamRecord s5_reverse = tests::MakeCigaredRecord(s5_seq, s5_cigar, true);
+    const BamRecord s6_reverse = tests::MakeCigaredRecord(s6_seq, s6_cigar, true);
+    const BamRecord s7_reverse = tests::MakeCigaredRecord(s7_seq, s7_cigar, true);
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(s1.Sequence(Orientation::NATIVE), s1.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2.Sequence(Orientation::NATIVE), s2.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3.Sequence(Orientation::NATIVE), s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s4.Sequence(Orientation::NATIVE), s4.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s5.Sequence(Orientation::NATIVE), s5.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s6.Sequence(Orientation::NATIVE), s6.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s7.Sequence(Orientation::NATIVE), s7.Sequence(Orientation::GENOMIC));
+
+    //  - unclipped, unaligned genomic output == genomic input
+    EXPECT_EQ(s1_seq, s1.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2_seq, s2.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_seq, s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s4_seq, s4.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s5_seq, s5.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s6_seq, s6.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s7_seq, s7.Sequence(Orientation::GENOMIC));
+
+    //  - unclipped, unaligned native output == genomic input
+    EXPECT_EQ(s1_seq, s1.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s2_seq, s2.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s3_seq, s3.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s4_seq, s4.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s5_seq, s5.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s6_seq, s6.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s7_seq, s7.Sequence(Orientation::NATIVE));
+
+    //  - clipped, unaligned native output == clipped genomic input
+    EXPECT_EQ(s1_seq_clipped, s1.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s2_seq_clipped, s2.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s3_seq_clipped, s3.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s4_seq_clipped, s4.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s5_seq_clipped, s5.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s6_seq_clipped, s6.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s7_seq_clipped, s7.Sequence(Orientation::NATIVE, false, true));
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    //  - "native" != "genomic"
+    EXPECT_NE(s1_reverse.Sequence(Orientation::NATIVE), s1_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.Sequence(Orientation::NATIVE), s2_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.Sequence(Orientation::NATIVE), s3_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.Sequence(Orientation::NATIVE), s4_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.Sequence(Orientation::NATIVE), s5_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.Sequence(Orientation::NATIVE), s6_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s7_reverse.Sequence(Orientation::NATIVE), s7_reverse.Sequence(Orientation::GENOMIC));
+
+    //  - unclipped, unaligned genomic output == genomic input
+    EXPECT_EQ(s1_seq, s1_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2_seq, s2_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_seq, s3_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s4_seq, s4_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s5_seq, s5_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s6_seq, s6_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s7_seq, s7_reverse.Sequence(Orientation::GENOMIC));
+
+    //  - unclipped, unaligned native output != genomic (raw) input
+    EXPECT_NE(s1_seq, s1_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_NE(s2_seq, s2_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_NE(s3_seq, s3_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_NE(s4_seq, s4_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_NE(s5_seq, s5_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_NE(s6_seq, s6_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_NE(s7_seq, s7_reverse.Sequence(Orientation::NATIVE));
+
+    //  - unclipped, unaligned native output should be reverse
+    EXPECT_EQ(s1_revseq, s1_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s2_revseq, s2_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s3_revseq, s3_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s4_revseq, s4_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s5_revseq, s5_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s6_revseq, s6_reverse.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(s7_revseq, s7_reverse.Sequence(Orientation::NATIVE));
+
+    //  - clipped, unaligned native output == clipped genomic input
+    EXPECT_EQ(s1_revseq_clipped, s1_reverse.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s2_revseq_clipped, s2_reverse.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s3_revseq_clipped, s3_reverse.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s4_revseq_clipped, s4_reverse.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s5_revseq_clipped, s5_reverse.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s6_revseq_clipped, s6_reverse.Sequence(Orientation::NATIVE, false, true));
+    EXPECT_EQ(s7_revseq_clipped, s7_reverse.Sequence(Orientation::NATIVE, false, true));
+}
+
+TEST(BamRecordTest, ClippingOrientationAndAlignment)
+{
+    // forward string names, cigar, seq
+    // reverse strand records have same cigar and **input** seq as forward strand
+    // (native output will be rev-comp'd)
+
+    const string s1_cigar = "4=3D4=";
+    const string s2_cigar = "4=1D2I2D4=";
+    const string s3_cigar = "4=1D2P2I2P2D4=";
+    const string s4_cigar = "2S4=3D4=3S";
+    const string s5_cigar = "2H4=3D4=3H";
+    const string s6_cigar = "2H2S4=3D4=3S3H";
+
+    const string s1_seq = "AACCGTTA";
+    const string s2_seq = "ATCCTAGGTT";
+    const string s3_seq = "ATCCTAGGTT";
+    const string s4_seq = "TTAACCGTTACCG";
+    const string s5_seq = "AACCGTTA";
+    const string s6_seq = "TTAACCGTTACCG";
+
+    const string s1_seq_aligned = "AACC---GTTA";
+    const string s2_seq_aligned = "ATCC-TA--GGTT";
+    const string s3_seq_aligned = "ATCC-**TA**--GGTT";
+    const string s4_seq_aligned = "TTAACC---GTTACCG";
+    const string s5_seq_aligned = "AACC---GTTA";
+    const string s6_seq_aligned = "TTAACC---GTTACCG";
+
+    const string s1_seq_aligned_clipped = "AACC---GTTA";
+    const string s2_seq_aligned_clipped = "ATCC-TA--GGTT";
+    const string s3_seq_aligned_clipped = "ATCC-**TA**--GGTT";
+    const string s4_seq_aligned_clipped = "AACC---GTTA";
+    const string s5_seq_aligned_clipped = "AACC---GTTA";
+    const string s6_seq_aligned_clipped = "AACC---GTTA";
+
+    const string s1_revseq = "TAACGGTT";
+    const string s2_revseq = "AACCTAGGAT";
+    const string s3_revseq = "AACCTAGGAT";
+    const string s4_revseq = "CGGTAACGGTTAA";
+    const string s5_revseq = "TAACGGTT";
+    const string s6_revseq = "CGGTAACGGTTAA";
+
+    const string s1_revseq_aligned = "TAAC---GGTT";
+    const string s2_revseq_aligned = "AACC--TA-GGAT";
+    const string s3_revseq_aligned = "AACC--**TA**-GGAT";
+    const string s4_revseq_aligned = "CGGTAAC---GGTTAA";
+    const string s5_revseq_aligned = "TAAC---GGTT";
+    const string s6_revseq_aligned = "CGGTAAC---GGTTAA";
+
+    const string s1_revseq_aligned_clipped = "TAAC---GGTT";
+    const string s2_revseq_aligned_clipped = "AACC--TA-GGAT";
+    const string s3_revseq_aligned_clipped = "AACC--**TA**-GGAT";
+    const string s4_revseq_aligned_clipped = "TAAC---GGTT";
+    const string s5_revseq_aligned_clipped = "TAAC---GGTT";
+    const string s6_revseq_aligned_clipped = "TAAC---GGTT";
+
+    const BamRecord s1 = tests::MakeCigaredRecord(s1_seq, s1_cigar, false);
+    const BamRecord s2 = tests::MakeCigaredRecord(s2_seq, s2_cigar, false);
+    const BamRecord s3 = tests::MakeCigaredRecord(s3_seq, s3_cigar, false);
+    const BamRecord s4 = tests::MakeCigaredRecord(s4_seq, s4_cigar, false);
+    const BamRecord s5 = tests::MakeCigaredRecord(s5_seq, s5_cigar, false);
+    const BamRecord s6 = tests::MakeCigaredRecord(s6_seq, s6_cigar, false);
+    const BamRecord s1_reverse = tests::MakeCigaredRecord(s1_seq, s1_cigar, true);
+    const BamRecord s2_reverse = tests::MakeCigaredRecord(s2_seq, s2_cigar, true);
+    const BamRecord s3_reverse = tests::MakeCigaredRecord(s3_seq, s3_cigar, true);
+    const BamRecord s4_reverse = tests::MakeCigaredRecord(s4_seq, s4_cigar, true);
+    const BamRecord s5_reverse = tests::MakeCigaredRecord(s5_seq, s5_cigar, true);
+    const BamRecord s6_reverse = tests::MakeCigaredRecord(s6_seq, s6_cigar, true);
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(s1.Sequence(Orientation::NATIVE), s1.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2.Sequence(Orientation::NATIVE), s2.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3.Sequence(Orientation::NATIVE), s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s4.Sequence(Orientation::NATIVE), s4.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s5.Sequence(Orientation::NATIVE), s5.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s6.Sequence(Orientation::NATIVE), s6.Sequence(Orientation::GENOMIC));
+
+    //  - unaligned, unclipped genomic output == genomic input
+    EXPECT_EQ(s1_seq, s1.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s2_seq, s2.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s3_seq, s3.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s4_seq, s4.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s5_seq, s5.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s6_seq, s6.Sequence(Orientation::GENOMIC, false, false));
+
+    //  - aligned, unclipped genomic output == aligned, unclipped genomic input
+    EXPECT_EQ(s1_seq_aligned, s1.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s2_seq_aligned, s2.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s3_seq_aligned, s3.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s4_seq_aligned, s4.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s5_seq_aligned, s5.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s6_seq_aligned, s6.Sequence(Orientation::GENOMIC, true, false));
+
+    //  - aligned, clipped genomic output == aligned, clipped genomic output
+    EXPECT_EQ(s1_seq_aligned_clipped, s1.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s2_seq_aligned_clipped, s2.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s3_seq_aligned_clipped, s3.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s4_seq_aligned_clipped, s4.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s5_seq_aligned_clipped, s5.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s6_seq_aligned_clipped, s6.Sequence(Orientation::GENOMIC, true, true));
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    //  - "native" != "genomic"
+    EXPECT_NE(s1_reverse.Sequence(Orientation::NATIVE), s1_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.Sequence(Orientation::NATIVE), s2_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.Sequence(Orientation::NATIVE), s3_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.Sequence(Orientation::NATIVE), s4_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.Sequence(Orientation::NATIVE), s5_reverse.Sequence(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.Sequence(Orientation::NATIVE), s6_reverse.Sequence(Orientation::GENOMIC));
+
+    //  - unaligned, unclipped genomic output
+    EXPECT_EQ(s1_seq, s1_reverse.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s2_seq, s2_reverse.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s3_seq, s3_reverse.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s4_seq, s4_reverse.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s5_seq, s5_reverse.Sequence(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s6_seq, s6_reverse.Sequence(Orientation::GENOMIC, false, false));
+
+    //  - unaligned, unclipped native output
+    EXPECT_EQ(s1_revseq, s1_reverse.Sequence(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s2_revseq, s2_reverse.Sequence(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s3_revseq, s3_reverse.Sequence(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s4_revseq, s4_reverse.Sequence(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s5_revseq, s5_reverse.Sequence(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s6_revseq, s6_reverse.Sequence(Orientation::NATIVE, false, false));
+
+    //  - aligned, unclipped genomic output
+    EXPECT_EQ(s1_seq_aligned, s1_reverse.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s2_seq_aligned, s2_reverse.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s3_seq_aligned, s3_reverse.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s4_seq_aligned, s4_reverse.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s5_seq_aligned, s5_reverse.Sequence(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s6_seq_aligned, s6_reverse.Sequence(Orientation::GENOMIC, true, false));
+
+    //  - aligned, unclipped native output
+    EXPECT_EQ(s1_revseq_aligned, s1_reverse.Sequence(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s2_revseq_aligned, s2_reverse.Sequence(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s3_revseq_aligned, s3_reverse.Sequence(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s4_revseq_aligned, s4_reverse.Sequence(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s5_revseq_aligned, s5_reverse.Sequence(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s6_revseq_aligned, s6_reverse.Sequence(Orientation::NATIVE, true, false));
+
+    //  - aligned, clipped genomic output
+    EXPECT_EQ(s1_seq_aligned_clipped, s1_reverse.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s2_seq_aligned_clipped, s2_reverse.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s3_seq_aligned_clipped, s3_reverse.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s4_seq_aligned_clipped, s4_reverse.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s5_seq_aligned_clipped, s5_reverse.Sequence(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s6_seq_aligned_clipped, s6_reverse.Sequence(Orientation::GENOMIC, true, true));
+
+    //  - aligned, clipped native output
+    EXPECT_EQ(s1_revseq_aligned_clipped, s1_reverse.Sequence(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s2_revseq_aligned_clipped, s2_reverse.Sequence(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s3_revseq_aligned_clipped, s3_reverse.Sequence(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s4_revseq_aligned_clipped, s4_reverse.Sequence(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s5_revseq_aligned_clipped, s5_reverse.Sequence(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s6_revseq_aligned_clipped, s6_reverse.Sequence(Orientation::NATIVE, true, true));
+}
+
+
+TEST(BamRecordTest, QualityTagsClippedAndAligned)
+{
+    // NOTE - FASTQ for QV=0 is '!'. Thus deletions/padding will be rendered as '!'s.
+
+    const string s1_cigar = "4=3D4=";
+    const string s2_cigar = "4=1D2I2D4=";
+    const string s3_cigar = "4=1D2P2I2P2D4=";
+    const string s4_cigar = "3S4=3D4=3S";
+    const string s5_cigar = "2H4=3D4=3H";
+    const string s6_cigar = "2H3S4=3D4=3S3H";
+
+    const string s1_quals = "?]?]?]?@";
+    const string s2_quals = "?]?]87?]?@";
+    const string s3_quals = "?]?]87?]?@";
+    const string s4_quals = "vvv?]?]?]?@xxx";
+    const string s5_quals = "?]?]?]?@";
+    const string s6_quals = "vvv?]?]?]?@xxx";
+
+    const string s1_quals_aligned = "?]?]!!!?]?@";
+    const string s2_quals_aligned = "?]?]!87!!?]?@";
+    const string s3_quals_aligned = "?]?]!!!87!!!!?]?@";
+    const string s4_quals_aligned = "vvv?]?]!!!?]?@xxx";
+    const string s5_quals_aligned = "?]?]!!!?]?@";
+    const string s6_quals_aligned = "vvv?]?]!!!?]?@xxx";
+
+    const string s1_quals_aligned_clipped = "?]?]!!!?]?@";
+    const string s2_quals_aligned_clipped = "?]?]!87!!?]?@";
+    const string s3_quals_aligned_clipped = "?]?]!!!87!!!!?]?@";
+    const string s4_quals_aligned_clipped = "?]?]!!!?]?@";
+    const string s5_quals_aligned_clipped = "?]?]!!!?]?@";
+    const string s6_quals_aligned_clipped = "?]?]!!!?]?@";
+
+    const string s1_revquals = "@?]?]?]?";
+    const string s2_revquals = "@?]?78]?]?";
+    const string s3_revquals = "@?]?78]?]?";
+    const string s4_revquals = "xxx@?]?]?]?vvv";
+    const string s5_revquals = "@?]?]?]?";
+    const string s6_revquals = "xxx@?]?]?]?vvv";
+
+    const string s1_revquals_aligned = "@?]?!!!]?]?";
+    const string s2_revquals_aligned = "@?]?!78!!]?]?";
+    const string s3_revquals_aligned = "@?]?!!!78!!!!]?]?";
+    const string s4_revquals_aligned = "xxx@?]?!!!]?]?vvv";
+    const string s5_revquals_aligned = "@?]?!!!]?]?";
+    const string s6_revquals_aligned = "xxx@?]?!!!]?]?vvv";
+
+    const string s1_revquals_aligned_clipped = "@?]?!!!]?]?";
+    const string s2_revquals_aligned_clipped = "@?]?!78!!]?]?";
+    const string s3_revquals_aligned_clipped = "@?]?!!!78!!!!]?]?";
+    const string s4_revquals_aligned_clipped = "@?]?!!!]?]?";
+    const string s5_revquals_aligned_clipped = "@?]?!!!]?]?";
+    const string s6_revquals_aligned_clipped = "@?]?!!!]?]?";
+
+    const BamRecord s1 = tests::MakeCigaredQualRecord(s1_quals, s1_cigar, false);
+    const BamRecord s2 = tests::MakeCigaredQualRecord(s2_quals, s2_cigar, false);
+    const BamRecord s3 = tests::MakeCigaredQualRecord(s3_quals, s3_cigar, false);
+    const BamRecord s4 = tests::MakeCigaredQualRecord(s4_quals, s4_cigar, false);
+    const BamRecord s5 = tests::MakeCigaredQualRecord(s5_quals, s5_cigar, false);
+    const BamRecord s6 = tests::MakeCigaredQualRecord(s6_quals, s6_cigar, false);
+    const BamRecord s1_reverse = tests::MakeCigaredQualRecord(s1_quals, s1_cigar, true);
+    const BamRecord s2_reverse = tests::MakeCigaredQualRecord(s2_quals, s2_cigar, true);
+    const BamRecord s3_reverse = tests::MakeCigaredQualRecord(s3_quals, s3_cigar, true);
+    const BamRecord s4_reverse = tests::MakeCigaredQualRecord(s4_quals, s4_cigar, true);
+    const BamRecord s5_reverse = tests::MakeCigaredQualRecord(s5_quals, s5_cigar, true);
+    const BamRecord s6_reverse = tests::MakeCigaredQualRecord(s6_quals, s6_cigar, true);
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(s1.DeletionQV(Orientation::NATIVE), s1.DeletionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s2.DeletionQV(Orientation::NATIVE), s2.DeletionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s3.DeletionQV(Orientation::NATIVE), s3.DeletionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s4.DeletionQV(Orientation::NATIVE), s4.DeletionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s5.DeletionQV(Orientation::NATIVE), s5.DeletionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s6.DeletionQV(Orientation::NATIVE), s6.DeletionQV(Orientation::GENOMIC));
+
+    EXPECT_EQ(s1.InsertionQV(Orientation::NATIVE), s1.InsertionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s2.InsertionQV(Orientation::NATIVE), s2.InsertionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s3.InsertionQV(Orientation::NATIVE), s3.InsertionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s4.InsertionQV(Orientation::NATIVE), s4.InsertionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s5.InsertionQV(Orientation::NATIVE), s5.InsertionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s6.InsertionQV(Orientation::NATIVE), s6.InsertionQV(Orientation::GENOMIC));
+
+    EXPECT_EQ(s1.MergeQV(Orientation::NATIVE), s1.MergeQV(Orientation::GENOMIC));
+    EXPECT_EQ(s2.MergeQV(Orientation::NATIVE), s2.MergeQV(Orientation::GENOMIC));
+    EXPECT_EQ(s3.MergeQV(Orientation::NATIVE), s3.MergeQV(Orientation::GENOMIC));
+    EXPECT_EQ(s4.MergeQV(Orientation::NATIVE), s4.MergeQV(Orientation::GENOMIC));
+    EXPECT_EQ(s5.MergeQV(Orientation::NATIVE), s5.MergeQV(Orientation::GENOMIC));
+    EXPECT_EQ(s6.MergeQV(Orientation::NATIVE), s6.MergeQV(Orientation::GENOMIC));
+
+    EXPECT_EQ(s1.SubstitutionQV(Orientation::NATIVE), s1.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s2.SubstitutionQV(Orientation::NATIVE), s2.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s3.SubstitutionQV(Orientation::NATIVE), s3.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s4.SubstitutionQV(Orientation::NATIVE), s4.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s5.SubstitutionQV(Orientation::NATIVE), s5.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_EQ(s6.SubstitutionQV(Orientation::NATIVE), s6.SubstitutionQV(Orientation::GENOMIC));
+
+    //  - unaligned, unclipped genomic output == genomic input
+    EXPECT_EQ(s1_quals, s1.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_quals, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_quals, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s4_quals, s4.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s5_quals, s5.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s6_quals, s6.DeletionQV(Orientation::GENOMIC).Fastq());
+
+    EXPECT_EQ(s1_quals, s1.InsertionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_quals, s2.InsertionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_quals, s3.InsertionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s4_quals, s4.InsertionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s5_quals, s5.InsertionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s6_quals, s6.InsertionQV(Orientation::GENOMIC).Fastq());
+
+    EXPECT_EQ(s1_quals, s1.MergeQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_quals, s2.MergeQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_quals, s3.MergeQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s4_quals, s4.MergeQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s5_quals, s5.MergeQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s6_quals, s6.MergeQV(Orientation::GENOMIC).Fastq());
+
+    EXPECT_EQ(s1_quals, s1.SubstitutionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_quals, s2.SubstitutionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_quals, s3.SubstitutionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s4_quals, s4.SubstitutionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s5_quals, s5.SubstitutionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s6_quals, s6.SubstitutionQV(Orientation::GENOMIC).Fastq());
+
+    //  - aligned, unclipped genomic output == aligned, unclipped genomic input
+    EXPECT_EQ(s1_quals_aligned, s1.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s2_quals_aligned, s2.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s3_quals_aligned, s3.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s4_quals_aligned, s4.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s5_quals_aligned, s5.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s6_quals_aligned, s6.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned, s1.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s2_quals_aligned, s2.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s3_quals_aligned, s3.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s4_quals_aligned, s4.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s5_quals_aligned, s5.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s6_quals_aligned, s6.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned, s1.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s2_quals_aligned, s2.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s3_quals_aligned, s3.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s4_quals_aligned, s4.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s5_quals_aligned, s5.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s6_quals_aligned, s6.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned, s1.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s2_quals_aligned, s2.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s3_quals_aligned, s3.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s4_quals_aligned, s4.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s5_quals_aligned, s5.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s6_quals_aligned, s6.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+
+    //  - aligned, clipped genomic output == aligned, clipped genomic output
+    EXPECT_EQ(s1_quals_aligned_clipped, s1.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s2_quals_aligned_clipped, s2.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s3_quals_aligned_clipped, s3.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s4_quals_aligned_clipped, s4.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s5_quals_aligned_clipped, s5.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s6_quals_aligned_clipped, s6.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned_clipped, s1.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s2_quals_aligned_clipped, s2.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s3_quals_aligned_clipped, s3.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s4_quals_aligned_clipped, s4.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s5_quals_aligned_clipped, s5.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s6_quals_aligned_clipped, s6.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned_clipped, s1.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s2_quals_aligned_clipped, s2.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s3_quals_aligned_clipped, s3.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s4_quals_aligned_clipped, s4.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s5_quals_aligned_clipped, s5.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s6_quals_aligned_clipped, s6.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned_clipped, s1.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s2_quals_aligned_clipped, s2.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s3_quals_aligned_clipped, s3.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s4_quals_aligned_clipped, s4.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s5_quals_aligned_clipped, s5.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s6_quals_aligned_clipped, s6.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    //  - "native" != "genomic"
+    EXPECT_NE(s1_reverse.DeletionQV(Orientation::NATIVE), s1_reverse.DeletionQV(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.DeletionQV(Orientation::NATIVE), s2_reverse.DeletionQV(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.DeletionQV(Orientation::NATIVE), s3_reverse.DeletionQV(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.DeletionQV(Orientation::NATIVE), s4_reverse.DeletionQV(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.DeletionQV(Orientation::NATIVE), s5_reverse.DeletionQV(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.DeletionQV(Orientation::NATIVE), s6_reverse.DeletionQV(Orientation::GENOMIC));
+
+    EXPECT_NE(s1_reverse.InsertionQV(Orientation::NATIVE), s1_reverse.InsertionQV(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.InsertionQV(Orientation::NATIVE), s2_reverse.InsertionQV(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.InsertionQV(Orientation::NATIVE), s3_reverse.InsertionQV(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.InsertionQV(Orientation::NATIVE), s4_reverse.InsertionQV(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.InsertionQV(Orientation::NATIVE), s5_reverse.InsertionQV(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.InsertionQV(Orientation::NATIVE), s6_reverse.InsertionQV(Orientation::GENOMIC));
+
+    EXPECT_NE(s1_reverse.MergeQV(Orientation::NATIVE), s1_reverse.MergeQV(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.MergeQV(Orientation::NATIVE), s2_reverse.MergeQV(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.MergeQV(Orientation::NATIVE), s3_reverse.MergeQV(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.MergeQV(Orientation::NATIVE), s4_reverse.MergeQV(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.MergeQV(Orientation::NATIVE), s5_reverse.MergeQV(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.MergeQV(Orientation::NATIVE), s6_reverse.MergeQV(Orientation::GENOMIC));
+
+    EXPECT_NE(s1_reverse.SubstitutionQV(Orientation::NATIVE), s1_reverse.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.SubstitutionQV(Orientation::NATIVE), s2_reverse.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.SubstitutionQV(Orientation::NATIVE), s3_reverse.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.SubstitutionQV(Orientation::NATIVE), s4_reverse.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.SubstitutionQV(Orientation::NATIVE), s5_reverse.SubstitutionQV(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.SubstitutionQV(Orientation::NATIVE), s6_reverse.SubstitutionQV(Orientation::GENOMIC));
+
+    //  - unaligned, unclipped genomic output (rev-comp of native input)
+    EXPECT_EQ(s1_revquals, s1_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s2_revquals, s2_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s3_revquals, s3_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s4_revquals, s4_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s5_revquals, s5_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s6_revquals, s6_reverse.DeletionQV(Orientation::GENOMIC, false, false).Fastq());
+
+    EXPECT_EQ(s1_revquals, s1_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s2_revquals, s2_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s3_revquals, s3_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s4_revquals, s4_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s5_revquals, s5_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s6_revquals, s6_reverse.InsertionQV(Orientation::GENOMIC, false, false).Fastq());
+
+    EXPECT_EQ(s1_revquals, s1_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s2_revquals, s2_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s3_revquals, s3_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s4_revquals, s4_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s5_revquals, s5_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s6_revquals, s6_reverse.MergeQV(Orientation::GENOMIC, false, false).Fastq());
+
+    EXPECT_EQ(s1_revquals, s1_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s2_revquals, s2_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s3_revquals, s3_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s4_revquals, s4_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s5_revquals, s5_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+    EXPECT_EQ(s6_revquals, s6_reverse.SubstitutionQV(Orientation::GENOMIC, false, false).Fastq());
+
+    //  - unaligned, unclipped native output (native input)
+    EXPECT_EQ(s1_quals, s1_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s2_quals, s2_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s3_quals, s3_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s4_quals, s4_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s5_quals, s5_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s6_quals, s6_reverse.DeletionQV(Orientation::NATIVE, false, false).Fastq());
+
+    EXPECT_EQ(s1_quals, s1_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s2_quals, s2_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s3_quals, s3_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s4_quals, s4_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s5_quals, s5_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s6_quals, s6_reverse.InsertionQV(Orientation::NATIVE, false, false).Fastq());
+
+    EXPECT_EQ(s1_quals, s1_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s2_quals, s2_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s3_quals, s3_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s4_quals, s4_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s5_quals, s5_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s6_quals, s6_reverse.MergeQV(Orientation::NATIVE, false, false).Fastq());
+
+    EXPECT_EQ(s1_quals, s1_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s2_quals, s2_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s3_quals, s3_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s4_quals, s4_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s5_quals, s5_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+    EXPECT_EQ(s6_quals, s6_reverse.SubstitutionQV(Orientation::NATIVE, false, false).Fastq());
+
+    //  - aligned, unclipped genomic output (rev-comp of native input)
+    EXPECT_EQ(s1_revquals_aligned, s1_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s2_revquals_aligned, s2_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s3_revquals_aligned, s3_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s4_revquals_aligned, s4_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s5_revquals_aligned, s5_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s6_revquals_aligned, s6_reverse.DeletionQV(Orientation::GENOMIC, true, false).Fastq());
+
+    EXPECT_EQ(s1_revquals_aligned, s1_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s2_revquals_aligned, s2_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s3_revquals_aligned, s3_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s4_revquals_aligned, s4_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s5_revquals_aligned, s5_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s6_revquals_aligned, s6_reverse.InsertionQV(Orientation::GENOMIC, true, false).Fastq());
+
+    EXPECT_EQ(s1_revquals_aligned, s1_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s2_revquals_aligned, s2_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s3_revquals_aligned, s3_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s4_revquals_aligned, s4_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s5_revquals_aligned, s5_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s6_revquals_aligned, s6_reverse.MergeQV(Orientation::GENOMIC, true, false).Fastq());
+
+    EXPECT_EQ(s1_revquals_aligned, s1_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s2_revquals_aligned, s2_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s3_revquals_aligned, s3_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s4_revquals_aligned, s4_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s5_revquals_aligned, s5_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+    EXPECT_EQ(s6_revquals_aligned, s6_reverse.SubstitutionQV(Orientation::GENOMIC, true, false).Fastq());
+
+    //  - aligned, unclipped native output (native input)
+    EXPECT_EQ(s1_quals_aligned, s1_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s2_quals_aligned, s2_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s3_quals_aligned, s3_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s4_quals_aligned, s4_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s5_quals_aligned, s5_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s6_quals_aligned, s6_reverse.DeletionQV(Orientation::NATIVE, true, false).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned, s1_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s2_quals_aligned, s2_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s3_quals_aligned, s3_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s4_quals_aligned, s4_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s5_quals_aligned, s5_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s6_quals_aligned, s6_reverse.InsertionQV(Orientation::NATIVE, true, false).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned, s1_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s2_quals_aligned, s2_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s3_quals_aligned, s3_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s4_quals_aligned, s4_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s5_quals_aligned, s5_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s6_quals_aligned, s6_reverse.MergeQV(Orientation::NATIVE, true, false).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned, s1_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s2_quals_aligned, s2_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s3_quals_aligned, s3_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s4_quals_aligned, s4_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s5_quals_aligned, s5_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+    EXPECT_EQ(s6_quals_aligned, s6_reverse.SubstitutionQV(Orientation::NATIVE, true, false).Fastq());
+
+    //  - aligned, clipped genomic output (rev-comp of native input)
+    EXPECT_EQ(s1_revquals_aligned_clipped, s1_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s2_revquals_aligned_clipped, s2_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s3_revquals_aligned_clipped, s3_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s4_revquals_aligned_clipped, s4_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s5_revquals_aligned_clipped, s5_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s6_revquals_aligned_clipped, s6_reverse.DeletionQV(Orientation::GENOMIC, true, true).Fastq());
+
+    EXPECT_EQ(s1_revquals_aligned_clipped, s1_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s2_revquals_aligned_clipped, s2_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s3_revquals_aligned_clipped, s3_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s4_revquals_aligned_clipped, s4_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s5_revquals_aligned_clipped, s5_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s6_revquals_aligned_clipped, s6_reverse.InsertionQV(Orientation::GENOMIC, true, true).Fastq());
+
+    EXPECT_EQ(s1_revquals_aligned_clipped, s1_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s2_revquals_aligned_clipped, s2_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s3_revquals_aligned_clipped, s3_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s4_revquals_aligned_clipped, s4_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s5_revquals_aligned_clipped, s5_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s6_revquals_aligned_clipped, s6_reverse.MergeQV(Orientation::GENOMIC, true, true).Fastq());
+
+    EXPECT_EQ(s1_revquals_aligned_clipped, s1_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s2_revquals_aligned_clipped, s2_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s3_revquals_aligned_clipped, s3_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s4_revquals_aligned_clipped, s4_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s5_revquals_aligned_clipped, s5_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+    EXPECT_EQ(s6_revquals_aligned_clipped, s6_reverse.SubstitutionQV(Orientation::GENOMIC, true, true).Fastq());
+
+    //  - aligned, clipped native output (native input)
+    EXPECT_EQ(s1_quals_aligned_clipped, s1_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s2_quals_aligned_clipped, s2_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s3_quals_aligned_clipped, s3_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s4_quals_aligned_clipped, s4_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s5_quals_aligned_clipped, s5_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s6_quals_aligned_clipped, s6_reverse.DeletionQV(Orientation::NATIVE, true, true).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned_clipped, s1_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s2_quals_aligned_clipped, s2_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s3_quals_aligned_clipped, s3_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s4_quals_aligned_clipped, s4_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s5_quals_aligned_clipped, s5_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s6_quals_aligned_clipped, s6_reverse.InsertionQV(Orientation::NATIVE, true, true).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned_clipped, s1_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s2_quals_aligned_clipped, s2_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s3_quals_aligned_clipped, s3_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s4_quals_aligned_clipped, s4_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s5_quals_aligned_clipped, s5_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s6_quals_aligned_clipped, s6_reverse.MergeQV(Orientation::NATIVE, true, true).Fastq());
+
+    EXPECT_EQ(s1_quals_aligned_clipped, s1_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s2_quals_aligned_clipped, s2_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s3_quals_aligned_clipped, s3_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s4_quals_aligned_clipped, s4_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s5_quals_aligned_clipped, s5_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+    EXPECT_EQ(s6_quals_aligned_clipped, s6_reverse.SubstitutionQV(Orientation::NATIVE, true, true).Fastq());
+}
+
+TEST(BamRecordTest, BaseTagsClippedAndAligned)
+{
+    const string s1_cigar = "4=3D4=";
+    const string s2_cigar = "4=1D2I2D4=";
+    const string s3_cigar = "4=1D2P2I2P2D4=";
+    const string s4_cigar = "3S4=3D4=3S";
+    const string s5_cigar = "2H4=3D4=3H";
+    const string s6_cigar = "2H3S4=3D4=3S3H";
+
+    const string s1_seq = "AACCGTTA";
+    const string s2_seq = "ATCCTAGGTT";
+    const string s3_seq = "ATCCTAGGTT";
+    const string s4_seq = "TTTAACCGTTACCG";
+    const string s5_seq = "AACCGTTA";
+    const string s6_seq = "TTTAACCGTTACCG";
+
+    const string s1_seq_aligned = "AACC---GTTA";
+    const string s2_seq_aligned = "ATCC-TA--GGTT";
+    const string s3_seq_aligned = "ATCC-**TA**--GGTT";
+    const string s4_seq_aligned = "TTTAACC---GTTACCG";
+    const string s5_seq_aligned = "AACC---GTTA";
+    const string s6_seq_aligned = "TTTAACC---GTTACCG";
+
+    const string s1_seq_aligned_clipped = "AACC---GTTA";
+    const string s2_seq_aligned_clipped = "ATCC-TA--GGTT";
+    const string s3_seq_aligned_clipped = "ATCC-**TA**--GGTT";
+    const string s4_seq_aligned_clipped = "AACC---GTTA";
+    const string s5_seq_aligned_clipped = "AACC---GTTA";
+    const string s6_seq_aligned_clipped = "AACC---GTTA";
+
+    const string s1_revseq = "TAACGGTT";
+    const string s2_revseq = "AACCTAGGAT";
+    const string s3_revseq = "AACCTAGGAT";
+    const string s4_revseq = "CGGTAACGGTTAAA";
+    const string s5_revseq = "TAACGGTT";
+    const string s6_revseq = "CGGTAACGGTTAAA";
+
+    const string s1_revseq_aligned = "TAAC---GGTT";
+    const string s2_revseq_aligned = "AACC-TA--GGAT";
+    const string s3_revseq_aligned = "AACC-**TA**--GGAT";
+    const string s4_revseq_aligned = "CGGTAAC---GGTTAAA";
+    const string s5_revseq_aligned = "TAAC---GGTT";
+    const string s6_revseq_aligned = "CGGTAAC---GGTTAAA";
+
+    const string s1_revseq_aligned_clipped = "TAAC---GGTT";
+    const string s2_revseq_aligned_clipped = "AACC-TA--GGAT";
+    const string s3_revseq_aligned_clipped = "AACC-**TA**--GGAT";
+    const string s4_revseq_aligned_clipped = "TAAC---GGTT";
+    const string s5_revseq_aligned_clipped = "TAAC---GGTT";
+    const string s6_revseq_aligned_clipped = "TAAC---GGTT";
+
+    const BamRecord s1 = tests::MakeCigaredBaseRecord(s1_seq, s1_cigar, false);
+    const BamRecord s2 = tests::MakeCigaredBaseRecord(s2_seq, s2_cigar, false);
+    const BamRecord s3 = tests::MakeCigaredBaseRecord(s3_seq, s3_cigar, false);
+    const BamRecord s4 = tests::MakeCigaredBaseRecord(s4_seq, s4_cigar, false);
+    const BamRecord s5 = tests::MakeCigaredBaseRecord(s5_seq, s5_cigar, false);
+    const BamRecord s6 = tests::MakeCigaredBaseRecord(s6_seq, s6_cigar, false);
+    const BamRecord s1_reverse = tests::MakeCigaredBaseRecord(s1_seq, s1_cigar, true);
+    const BamRecord s2_reverse = tests::MakeCigaredBaseRecord(s2_seq, s2_cigar, true);
+    const BamRecord s3_reverse = tests::MakeCigaredBaseRecord(s3_seq, s3_cigar, true);
+    const BamRecord s4_reverse = tests::MakeCigaredBaseRecord(s4_seq, s4_cigar, true);
+    const BamRecord s5_reverse = tests::MakeCigaredBaseRecord(s5_seq, s5_cigar, true);
+    const BamRecord s6_reverse = tests::MakeCigaredBaseRecord(s6_seq, s6_cigar, true);
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(s1.DeletionTag(Orientation::NATIVE), s1.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2.DeletionTag(Orientation::NATIVE), s2.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3.DeletionTag(Orientation::NATIVE), s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s4.DeletionTag(Orientation::NATIVE), s4.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s5.DeletionTag(Orientation::NATIVE), s5.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s6.DeletionTag(Orientation::NATIVE), s6.DeletionTag(Orientation::GENOMIC));
+
+    EXPECT_EQ(s1.SubstitutionTag(Orientation::NATIVE), s1.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2.SubstitutionTag(Orientation::NATIVE), s2.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3.SubstitutionTag(Orientation::NATIVE), s3.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s4.SubstitutionTag(Orientation::NATIVE), s4.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s5.SubstitutionTag(Orientation::NATIVE), s5.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s6.SubstitutionTag(Orientation::NATIVE), s6.SubstitutionTag(Orientation::GENOMIC));
+
+    //  - unaligned, unclipped genomic output == genomic input
+    EXPECT_EQ(s1_seq, s1.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2_seq, s2.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_seq, s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s4_seq, s4.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s5_seq, s5.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s6_seq, s6.DeletionTag(Orientation::GENOMIC));
+
+    EXPECT_EQ(s1_seq, s1.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2_seq, s2.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_seq, s3.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s4_seq, s4.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s5_seq, s5.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s6_seq, s6.SubstitutionTag(Orientation::GENOMIC));
+
+    //  - aligned, unclipped genomic output == aligned, unclipped genomic input
+    EXPECT_EQ(s1_seq_aligned, s1.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s2_seq_aligned, s2.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s3_seq_aligned, s3.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s4_seq_aligned, s4.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s5_seq_aligned, s5.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s6_seq_aligned, s6.DeletionTag(Orientation::GENOMIC, true, false));
+
+    EXPECT_EQ(s1_seq_aligned, s1.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s2_seq_aligned, s2.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s3_seq_aligned, s3.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s4_seq_aligned, s4.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s5_seq_aligned, s5.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s6_seq_aligned, s6.SubstitutionTag(Orientation::GENOMIC, true, false));
+
+    //  - aligned, clipped genomic output == aligned, clipped genomic output
+    EXPECT_EQ(s1_seq_aligned_clipped, s1.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s2_seq_aligned_clipped, s2.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s3_seq_aligned_clipped, s3.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s4_seq_aligned_clipped, s4.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s5_seq_aligned_clipped, s5.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s6_seq_aligned_clipped, s6.DeletionTag(Orientation::GENOMIC, true, true));
+
+    EXPECT_EQ(s1_seq_aligned_clipped, s1.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s2_seq_aligned_clipped, s2.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s3_seq_aligned_clipped, s3.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s4_seq_aligned_clipped, s4.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s5_seq_aligned_clipped, s5.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s6_seq_aligned_clipped, s6.SubstitutionTag(Orientation::GENOMIC, true, true));
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    //  - "native" != "genomic"
+    EXPECT_NE(s1_reverse.DeletionTag(Orientation::NATIVE), s1_reverse.DeletionTag(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.DeletionTag(Orientation::NATIVE), s2_reverse.DeletionTag(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.DeletionTag(Orientation::NATIVE), s3_reverse.DeletionTag(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.DeletionTag(Orientation::NATIVE), s4_reverse.DeletionTag(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.DeletionTag(Orientation::NATIVE), s5_reverse.DeletionTag(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.DeletionTag(Orientation::NATIVE), s6_reverse.DeletionTag(Orientation::GENOMIC));
+
+    EXPECT_NE(s1_reverse.SubstitutionTag(Orientation::NATIVE), s1_reverse.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.SubstitutionTag(Orientation::NATIVE), s2_reverse.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.SubstitutionTag(Orientation::NATIVE), s3_reverse.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.SubstitutionTag(Orientation::NATIVE), s4_reverse.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.SubstitutionTag(Orientation::NATIVE), s5_reverse.SubstitutionTag(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.SubstitutionTag(Orientation::NATIVE), s6_reverse.SubstitutionTag(Orientation::GENOMIC));
+
+    //  - unaligned, unclipped genomic output (rev-comp of native input)
+    EXPECT_EQ(s1_revseq, s1_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s2_revseq, s2_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s3_revseq, s3_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s4_revseq, s4_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s5_revseq, s5_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s6_revseq, s6_reverse.DeletionTag(Orientation::GENOMIC, false, false));
+
+    EXPECT_EQ(s1_revseq, s1_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s2_revseq, s2_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s3_revseq, s3_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s4_revseq, s4_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s5_revseq, s5_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+    EXPECT_EQ(s6_revseq, s6_reverse.SubstitutionTag(Orientation::GENOMIC, false, false));
+
+    //  - unaligned, unclipped native output (native input)
+    EXPECT_EQ(s1_seq, s1_reverse.DeletionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s2_seq, s2_reverse.DeletionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s3_seq, s3_reverse.DeletionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s4_seq, s4_reverse.DeletionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s5_seq, s5_reverse.DeletionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s6_seq, s6_reverse.DeletionTag(Orientation::NATIVE, false, false));
+
+    EXPECT_EQ(s1_seq, s1_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s2_seq, s2_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s3_seq, s3_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s4_seq, s4_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s5_seq, s5_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+    EXPECT_EQ(s6_seq, s6_reverse.SubstitutionTag(Orientation::NATIVE, false, false));
+
+    //  - aligned, unclipped genomic output (rev-comp of native input)
+    EXPECT_EQ(s1_revseq_aligned, s1_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s2_revseq_aligned, s2_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s3_revseq_aligned, s3_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s4_revseq_aligned, s4_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s5_revseq_aligned, s5_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s6_revseq_aligned, s6_reverse.DeletionTag(Orientation::GENOMIC, true, false));
+
+    EXPECT_EQ(s1_revseq_aligned, s1_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s2_revseq_aligned, s2_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s3_revseq_aligned, s3_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s4_revseq_aligned, s4_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s5_revseq_aligned, s5_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+    EXPECT_EQ(s6_revseq_aligned, s6_reverse.SubstitutionTag(Orientation::GENOMIC, true, false));
+
+    //  - aligned, unclipped native output (native input)
+    EXPECT_EQ(s1_seq_aligned, s1_reverse.DeletionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s2_seq_aligned, s2_reverse.DeletionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s3_seq_aligned, s3_reverse.DeletionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s4_seq_aligned, s4_reverse.DeletionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s5_seq_aligned, s5_reverse.DeletionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s6_seq_aligned, s6_reverse.DeletionTag(Orientation::NATIVE, true, false));
+
+    EXPECT_EQ(s1_seq_aligned, s1_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s2_seq_aligned, s2_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s3_seq_aligned, s3_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s4_seq_aligned, s4_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s5_seq_aligned, s5_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+    EXPECT_EQ(s6_seq_aligned, s6_reverse.SubstitutionTag(Orientation::NATIVE, true, false));
+
+    //  - aligned, clipped genomic output (rev-comp of native input)
+    EXPECT_EQ(s1_revseq_aligned_clipped, s1_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s2_revseq_aligned_clipped, s2_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s3_revseq_aligned_clipped, s3_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s4_revseq_aligned_clipped, s4_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s5_revseq_aligned_clipped, s5_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s6_revseq_aligned_clipped, s6_reverse.DeletionTag(Orientation::GENOMIC, true, true));
+
+    EXPECT_EQ(s1_revseq_aligned_clipped, s1_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s2_revseq_aligned_clipped, s2_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s3_revseq_aligned_clipped, s3_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s4_revseq_aligned_clipped, s4_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s5_revseq_aligned_clipped, s5_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+    EXPECT_EQ(s6_revseq_aligned_clipped, s6_reverse.SubstitutionTag(Orientation::GENOMIC, true, true));
+
+    //  - aligned, clipped native output (native input)
+    EXPECT_EQ(s1_seq_aligned_clipped, s1_reverse.DeletionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s2_seq_aligned_clipped, s2_reverse.DeletionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s3_seq_aligned_clipped, s3_reverse.DeletionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s4_seq_aligned_clipped, s4_reverse.DeletionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s5_seq_aligned_clipped, s5_reverse.DeletionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s6_seq_aligned_clipped, s6_reverse.DeletionTag(Orientation::NATIVE, true, true));
+
+    EXPECT_EQ(s1_seq_aligned_clipped, s1_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s2_seq_aligned_clipped, s2_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s3_seq_aligned_clipped, s3_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s4_seq_aligned_clipped, s4_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s5_seq_aligned_clipped, s5_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+    EXPECT_EQ(s6_seq_aligned_clipped, s6_reverse.SubstitutionTag(Orientation::NATIVE, true, true));
+
+}
+
+TEST(BamRecordTest, FrameTagsClippedAndAligned)
+{
+    const string s1_cigar = "4=3D4=";
+    const string s2_cigar = "4=1D2I2D4=";
+    const string s3_cigar = "4=1D2P2I2P2D4=";
+    const string s4_cigar = "3S4=3D4=3S";
+    const string s5_cigar = "2H4=3D4=3H";
+    const string s6_cigar = "2H3S4=3D4=3S3H";
+
+    typedef vector<uint16_t> f_data;
+
+    const f_data s1_frames = { 10, 20, 10, 20, 10, 20, 10, 30 };
+    const f_data s2_frames = { 10, 20, 10, 20, 80, 70, 10, 20, 10, 30 };
+    const f_data s3_frames = { 10, 20, 10, 20, 80, 70, 10, 20, 10, 30 };
+    const f_data s4_frames = { 40, 40, 40, 10, 20, 10, 20, 10, 20, 10, 30, 50, 50, 50 };
+    const f_data s5_frames = { 10, 20, 10, 20, 10, 20, 10, 30 };
+    const f_data s6_frames = { 40, 40, 40, 10, 20, 10, 20, 10, 20, 10, 30, 50, 50, 50 };
+
+    const f_data s1_frames_aligned = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+    const f_data s2_frames_aligned = { 10, 20, 10, 20, 0, 80, 70, 0, 0, 10, 20, 10, 30 };
+    const f_data s3_frames_aligned = { 10, 20, 10, 20, 0, 0, 0, 80, 70, 0, 0, 0, 0, 10, 20, 10, 30 };
+    const f_data s4_frames_aligned = { 40, 40, 40, 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30, 50, 50, 50 };
+    const f_data s5_frames_aligned = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+    const f_data s6_frames_aligned = { 40, 40, 40, 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30, 50, 50, 50 };
+
+    const f_data s1_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+    const f_data s2_frames_aligned_clipped = { 10, 20, 10, 20, 0, 80, 70, 0, 0, 10, 20, 10, 30 };
+    const f_data s3_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 80, 70, 0, 0, 0, 0, 10, 20, 10, 30 };
+    const f_data s4_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+    const f_data s5_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+    const f_data s6_frames_aligned_clipped = { 10, 20, 10, 20, 0, 0, 0, 10, 20, 10, 30 };
+
+    const f_data s1_revframes = { 30, 10, 20, 10, 20, 10, 20, 10 };
+    const f_data s2_revframes = { 30, 10, 20, 10, 70, 80, 20, 10, 20, 10 };
+    const f_data s3_revframes = { 30, 10, 20, 10, 70, 80, 20, 10, 20, 10 };
+    const f_data s4_revframes = { 50, 50, 50, 30, 10, 20, 10, 20, 10, 20, 10, 40, 40, 40 };
+    const f_data s5_revframes = { 30, 10, 20, 10, 20, 10, 20, 10 };
+    const f_data s6_revframes = { 50, 50, 50, 30, 10, 20, 10, 20, 10, 20, 10, 40, 40, 40 };
+
+    const f_data s1_revframes_aligned = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+    const f_data s2_revframes_aligned = { 30, 10, 20, 10, 0, 70, 80, 0, 0, 20, 10, 20, 10 };
+    const f_data s3_revframes_aligned = { 30, 10, 20, 10, 0, 0, 0, 70, 80, 0, 0, 0, 0, 20, 10, 20, 10 };
+    const f_data s4_revframes_aligned = { 50, 50, 50, 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10, 40, 40, 40 };
+    const f_data s5_revframes_aligned = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+    const f_data s6_revframes_aligned = { 50, 50, 50, 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10, 40, 40, 40 };
+
+    const f_data s1_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+    const f_data s2_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 70, 80, 0, 0, 20, 10, 20, 10 };
+    const f_data s3_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 70, 80, 0, 0, 0, 0, 20, 10, 20, 10 };
+    const f_data s4_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+    const f_data s5_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+    const f_data s6_revframes_aligned_clipped = { 30, 10, 20, 10, 0, 0, 0, 20, 10, 20, 10 };
+
+    const BamRecord s1 = tests::MakeCigaredFrameRecord(s1_frames, s1_cigar, false);
+    const BamRecord s2 = tests::MakeCigaredFrameRecord(s2_frames, s2_cigar, false);
+    const BamRecord s3 = tests::MakeCigaredFrameRecord(s3_frames, s3_cigar, false);
+    const BamRecord s4 = tests::MakeCigaredFrameRecord(s4_frames, s4_cigar, false);
+    const BamRecord s5 = tests::MakeCigaredFrameRecord(s5_frames, s5_cigar, false);
+    const BamRecord s6 = tests::MakeCigaredFrameRecord(s6_frames, s6_cigar, false);
+    const BamRecord s1_reverse = tests::MakeCigaredFrameRecord(s1_frames, s1_cigar, true);
+    const BamRecord s2_reverse = tests::MakeCigaredFrameRecord(s2_frames, s2_cigar, true);
+    const BamRecord s3_reverse = tests::MakeCigaredFrameRecord(s3_frames, s3_cigar, true);
+    const BamRecord s4_reverse = tests::MakeCigaredFrameRecord(s4_frames, s4_cigar, true);
+    const BamRecord s5_reverse = tests::MakeCigaredFrameRecord(s5_frames, s5_cigar, true);
+    const BamRecord s6_reverse = tests::MakeCigaredFrameRecord(s6_frames, s6_cigar, true);
+
+    // ----------------
+    // forward strand
+    // ----------------
+
+    //  - "native" == "genomic"
+    EXPECT_EQ(s1.IPD(Orientation::NATIVE), s1.IPD(Orientation::GENOMIC));
+    EXPECT_EQ(s2.IPD(Orientation::NATIVE), s2.IPD(Orientation::GENOMIC));
+    EXPECT_EQ(s3.IPD(Orientation::NATIVE), s3.IPD(Orientation::GENOMIC));
+    EXPECT_EQ(s4.IPD(Orientation::NATIVE), s4.IPD(Orientation::GENOMIC));
+    EXPECT_EQ(s5.IPD(Orientation::NATIVE), s5.IPD(Orientation::GENOMIC));
+    EXPECT_EQ(s6.IPD(Orientation::NATIVE), s6.IPD(Orientation::GENOMIC));
+
+    EXPECT_EQ(s1.PulseWidth(Orientation::NATIVE), s1.PulseWidth(Orientation::GENOMIC));
+    EXPECT_EQ(s2.PulseWidth(Orientation::NATIVE), s2.PulseWidth(Orientation::GENOMIC));
+    EXPECT_EQ(s3.PulseWidth(Orientation::NATIVE), s3.PulseWidth(Orientation::GENOMIC));
+    EXPECT_EQ(s4.PulseWidth(Orientation::NATIVE), s4.PulseWidth(Orientation::GENOMIC));
+    EXPECT_EQ(s5.PulseWidth(Orientation::NATIVE), s5.PulseWidth(Orientation::GENOMIC));
+    EXPECT_EQ(s6.PulseWidth(Orientation::NATIVE), s6.PulseWidth(Orientation::GENOMIC));
+
+    //  - unaligned, unclipped genomic output == genomic input
+    EXPECT_EQ(s1_frames, s1.IPD(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s2_frames, s2.IPD(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s3_frames, s3.IPD(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s4_frames, s4.IPD(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s5_frames, s5.IPD(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s6_frames, s6.IPD(Orientation::GENOMIC).Data());
+
+    EXPECT_EQ(s1_frames, s1.PulseWidth(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s2_frames, s2.PulseWidth(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s3_frames, s3.PulseWidth(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s4_frames, s4.PulseWidth(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s5_frames, s5.PulseWidth(Orientation::GENOMIC).Data());
+    EXPECT_EQ(s6_frames, s6.PulseWidth(Orientation::GENOMIC).Data());
+
+    //  - aligned, unclipped genomic output == aligned, unclipped genomic input
+    EXPECT_EQ(s1_frames_aligned, s1.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s2_frames_aligned, s2.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s3_frames_aligned, s3.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s4_frames_aligned, s4.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s5_frames_aligned, s5.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s6_frames_aligned, s6.IPD(Orientation::GENOMIC, true, false).Data());
+
+    EXPECT_EQ(s1_frames_aligned, s1.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s2_frames_aligned, s2.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s3_frames_aligned, s3.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s4_frames_aligned, s4.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s5_frames_aligned, s5.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s6_frames_aligned, s6.PulseWidth(Orientation::GENOMIC, true, false).Data());
+
+    //  - aligned, clipped genomic output == aligned, clipped genomic output
+    EXPECT_EQ(s1_frames_aligned_clipped, s1.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s2_frames_aligned_clipped, s2.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s3_frames_aligned_clipped, s3.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s4_frames_aligned_clipped, s4.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s5_frames_aligned_clipped, s5.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s6_frames_aligned_clipped, s6.IPD(Orientation::GENOMIC, true, true).Data());
+
+    EXPECT_EQ(s1_frames_aligned_clipped, s1.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s2_frames_aligned_clipped, s2.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s3_frames_aligned_clipped, s3.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s4_frames_aligned_clipped, s4.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s5_frames_aligned_clipped, s5.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s6_frames_aligned_clipped, s6.PulseWidth(Orientation::GENOMIC, true, true).Data());
+
+    // ----------------
+    // reverse strand
+    // ----------------
+
+    //  - "native" != "genomic"
+    EXPECT_NE(s1_reverse.IPD(Orientation::NATIVE), s1_reverse.IPD(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.IPD(Orientation::NATIVE), s2_reverse.IPD(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.IPD(Orientation::NATIVE), s3_reverse.IPD(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.IPD(Orientation::NATIVE), s4_reverse.IPD(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.IPD(Orientation::NATIVE), s5_reverse.IPD(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.IPD(Orientation::NATIVE), s6_reverse.IPD(Orientation::GENOMIC));
+
+    EXPECT_NE(s1_reverse.PulseWidth(Orientation::NATIVE), s1_reverse.PulseWidth(Orientation::GENOMIC));
+    EXPECT_NE(s2_reverse.PulseWidth(Orientation::NATIVE), s2_reverse.PulseWidth(Orientation::GENOMIC));
+    EXPECT_NE(s3_reverse.PulseWidth(Orientation::NATIVE), s3_reverse.PulseWidth(Orientation::GENOMIC));
+    EXPECT_NE(s4_reverse.PulseWidth(Orientation::NATIVE), s4_reverse.PulseWidth(Orientation::GENOMIC));
+    EXPECT_NE(s5_reverse.PulseWidth(Orientation::NATIVE), s5_reverse.PulseWidth(Orientation::GENOMIC));
+    EXPECT_NE(s6_reverse.PulseWidth(Orientation::NATIVE), s6_reverse.PulseWidth(Orientation::GENOMIC));
+
+    //  - unaligned, unclipped genomic output (rev-comp of native input)
+    EXPECT_EQ(s1_revframes, s1_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s2_revframes, s2_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s3_revframes, s3_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s4_revframes, s4_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s5_revframes, s5_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s6_revframes, s6_reverse.IPD(Orientation::GENOMIC, false, false).Data());
+
+    EXPECT_EQ(s1_revframes, s1_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s2_revframes, s2_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s3_revframes, s3_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s4_revframes, s4_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s5_revframes, s5_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+    EXPECT_EQ(s6_revframes, s6_reverse.PulseWidth(Orientation::GENOMIC, false, false).Data());
+
+    //  - unaligned, unclipped native output (native input)
+    EXPECT_EQ(s1_frames, s1_reverse.IPD(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s2_frames, s2_reverse.IPD(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s3_frames, s3_reverse.IPD(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s4_frames, s4_reverse.IPD(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s5_frames, s5_reverse.IPD(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s6_frames, s6_reverse.IPD(Orientation::NATIVE, false, false).Data());
+
+    EXPECT_EQ(s1_frames, s1_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s2_frames, s2_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s3_frames, s3_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s4_frames, s4_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s5_frames, s5_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+    EXPECT_EQ(s6_frames, s6_reverse.PulseWidth(Orientation::NATIVE, false, false).Data());
+
+    //  - aligned, unclipped genomic output (rev-comp of native input)
+    EXPECT_EQ(s1_revframes_aligned, s1_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s2_revframes_aligned, s2_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s3_revframes_aligned, s3_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s4_revframes_aligned, s4_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s5_revframes_aligned, s5_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s6_revframes_aligned, s6_reverse.IPD(Orientation::GENOMIC, true, false).Data());
+
+    EXPECT_EQ(s1_revframes_aligned, s1_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s2_revframes_aligned, s2_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s3_revframes_aligned, s3_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s4_revframes_aligned, s4_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s5_revframes_aligned, s5_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+    EXPECT_EQ(s6_revframes_aligned, s6_reverse.PulseWidth(Orientation::GENOMIC, true, false).Data());
+
+    //  - aligned, unclipped native output (native input)
+    EXPECT_EQ(s1_frames_aligned, s1_reverse.IPD(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s2_frames_aligned, s2_reverse.IPD(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s3_frames_aligned, s3_reverse.IPD(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s4_frames_aligned, s4_reverse.IPD(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s5_frames_aligned, s5_reverse.IPD(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s6_frames_aligned, s6_reverse.IPD(Orientation::NATIVE, true, false).Data());
+
+    EXPECT_EQ(s1_frames_aligned, s1_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s2_frames_aligned, s2_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s3_frames_aligned, s3_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s4_frames_aligned, s4_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s5_frames_aligned, s5_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+    EXPECT_EQ(s6_frames_aligned, s6_reverse.PulseWidth(Orientation::NATIVE, true, false).Data());
+
+    //  - aligned, clipped genomic output (rev-comp of native input)
+    EXPECT_EQ(s1_revframes_aligned_clipped, s1_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s2_revframes_aligned_clipped, s2_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s3_revframes_aligned_clipped, s3_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s4_revframes_aligned_clipped, s4_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s5_revframes_aligned_clipped, s5_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s6_revframes_aligned_clipped, s6_reverse.IPD(Orientation::GENOMIC, true, true).Data());
+
+    EXPECT_EQ(s1_revframes_aligned_clipped, s1_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s2_revframes_aligned_clipped, s2_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s3_revframes_aligned_clipped, s3_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s4_revframes_aligned_clipped, s4_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s5_revframes_aligned_clipped, s5_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+    EXPECT_EQ(s6_revframes_aligned_clipped, s6_reverse.PulseWidth(Orientation::GENOMIC, true, true).Data());
+
+    //  - aligned, clipped native output (native input)
+    EXPECT_EQ(s1_frames_aligned_clipped, s1_reverse.IPD(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s2_frames_aligned_clipped, s2_reverse.IPD(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s3_frames_aligned_clipped, s3_reverse.IPD(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s4_frames_aligned_clipped, s4_reverse.IPD(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s5_frames_aligned_clipped, s5_reverse.IPD(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s6_frames_aligned_clipped, s6_reverse.IPD(Orientation::NATIVE, true, true).Data());
+
+    EXPECT_EQ(s1_frames_aligned_clipped, s1_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s2_frames_aligned_clipped, s2_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s3_frames_aligned_clipped, s3_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s4_frames_aligned_clipped, s4_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s5_frames_aligned_clipped, s5_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+    EXPECT_EQ(s6_frames_aligned_clipped, s6_reverse.PulseWidth(Orientation::NATIVE, true, true).Data());
+}
diff --git a/tests/src/test_BamRecordBuilder.cpp b/tests/src/test_BamRecordBuilder.cpp
new file mode 100644
index 0000000..d1287d5
--- /dev/null
+++ b/tests/src/test_BamRecordBuilder.cpp
@@ -0,0 +1,274 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecordBuilder.h>
+#include <pbbam/BamTagCodec.h>
+#include <chrono>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+namespace tests {
+
+static
+void CheckRawData(const BamRecordImpl& bam)
+{
+    // ensure raw data (lengths at least) matches API-facing data
+
+    const uint32_t expectedNameLength  = bam.Name().size() + 1;
+    const uint32_t expectedNumCigarOps = bam.CigarData().size();
+    const int32_t  expectedSeqLength   = bam.Sequence().length();
+    const size_t   expectedTagsLength  = BamTagCodec::Encode(bam.Tags()).size();
+
+    //  Name        CIGAR         Sequence       Quals      Tags
+    // l_qname + (n_cigar * 4) + (l_qseq+1)/2 + l_qseq + << TAGS >>
+
+    const int expectedTotalDataLength = expectedNameLength +
+                                        (expectedNumCigarOps * 4) +
+                                        (expectedSeqLength+1)/2 +
+                                         expectedSeqLength +
+                                         expectedTagsLength;
+
+    EXPECT_TRUE((bool)bam.d_);
+    EXPECT_EQ(expectedNameLength,      bam.d_->core.l_qname);
+    EXPECT_EQ(expectedNumCigarOps,     bam.d_->core.n_cigar);
+    EXPECT_EQ(expectedSeqLength,       bam.d_->core.l_qseq);
+    EXPECT_EQ(expectedTotalDataLength, bam.d_->l_data);
+}
+
+static
+void CheckRawData(const BamRecord& bam)
+{ CheckRawData(bam.impl_); }
+
+} // namespace tests
+
+TEST(BamRecordBuilderTest, DefaultValues)
+{
+    BamRecordBuilder builder;
+    BamRecord bam = builder.Build();
+
+    const PBBAM_SHARED_PTR<bam1_t> rawData = bam.impl_.d_;
+    ASSERT_TRUE((bool)rawData);
+
+    // fixed-length (core) data
+    EXPECT_EQ(0, rawData->core.tid);
+    EXPECT_EQ(0, rawData->core.pos);
+    EXPECT_EQ(0, rawData->core.bin);
+    EXPECT_EQ(0, rawData->core.qual);
+    EXPECT_EQ(1, rawData->core.l_qname);    // initialized w/ NULL-term
+    EXPECT_EQ(0, rawData->core.flag);
+    EXPECT_EQ(0, rawData->core.n_cigar);
+    EXPECT_EQ(0, rawData->core.l_qseq);
+    EXPECT_EQ(0, rawData->core.mtid);
+    EXPECT_EQ(0, rawData->core.mpos);
+    EXPECT_EQ(0, rawData->core.isize);
+
+    // variable length data
+    EXPECT_TRUE(rawData->data != nullptr);
+    EXPECT_EQ(1, rawData->l_data);
+    EXPECT_EQ((int)0x800, rawData->m_data);  // check this if we change or tune later
+
+    // -------------------------------
+    // check data via API calls
+    // -------------------------------
+
+    EXPECT_EQ(0, bam.impl_.Bin());
+    EXPECT_EQ(0, bam.impl_.Flag());
+    EXPECT_EQ(0, bam.impl_.InsertSize());
+    EXPECT_EQ(0, bam.impl_.MapQuality());
+    EXPECT_EQ(0, bam.impl_.MateReferenceId());
+    EXPECT_EQ(0, bam.impl_.MatePosition());
+    EXPECT_EQ(0, bam.impl_.Position());
+    EXPECT_EQ(0, bam.impl_.ReferenceId());
+    EXPECT_EQ(0, bam.impl_.Tags().size());
+
+    EXPECT_FALSE(bam.impl_.IsDuplicate());
+    EXPECT_FALSE(bam.impl_.IsFailedQC());
+    EXPECT_FALSE(bam.impl_.IsFirstMate());
+    EXPECT_TRUE(bam.impl_.IsMapped());
+    EXPECT_TRUE(bam.impl_.IsMateMapped());
+    EXPECT_FALSE(bam.impl_.IsMateReverseStrand());
+    EXPECT_FALSE(bam.impl_.IsPaired());
+    EXPECT_TRUE(bam.impl_.IsPrimaryAlignment());
+    EXPECT_FALSE(bam.impl_.IsProperPair());
+    EXPECT_FALSE(bam.impl_.IsReverseStrand());
+    EXPECT_FALSE(bam.impl_.IsSecondMate());
+    EXPECT_FALSE(bam.impl_.IsSupplementaryAlignment());
+
+    const std::string emptyString = "";
+    EXPECT_EQ(emptyString, bam.impl_.Name());
+    EXPECT_EQ(emptyString, bam.impl_.CigarData().ToStdString());
+    EXPECT_EQ(emptyString, bam.impl_.Sequence());
+    EXPECT_EQ(emptyString, bam.impl_.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordBuilderTest, CheckSetters)
+{
+    // should be 28 bytes, encoded
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = static_cast<int32_t>(-42);
+
+    BamRecordBuilder builder;
+    builder.Bin(42)
+           .Flag(42)
+           .InsertSize(42)
+           .MapQuality(42)
+           .MatePosition(42)
+           .MateReferenceId(42)
+           .Position(42)
+           .ReferenceId(42)
+           .Tags(tags);
+
+    BamRecord bam = builder.Build();
+
+    // -------------------------------
+    // check raw data
+    // -------------------------------
+
+    const PBBAM_SHARED_PTR<bam1_t> rawData = bam.impl_.d_;
+    ASSERT_TRUE((bool)rawData);
+
+    // fixed-length (core) data
+    EXPECT_EQ(42, rawData->core.tid);
+    EXPECT_EQ(42, rawData->core.pos);
+    EXPECT_EQ(42, rawData->core.bin);
+    EXPECT_EQ(42, rawData->core.qual);
+    EXPECT_EQ(1,  rawData->core.l_qname);    // initialized w/ NULL-term
+    EXPECT_EQ(42, rawData->core.flag);
+    EXPECT_EQ(0,  rawData->core.n_cigar);
+    EXPECT_EQ(0,  rawData->core.l_qseq);
+    EXPECT_EQ(42, rawData->core.mtid);
+    EXPECT_EQ(42, rawData->core.mpos);
+    EXPECT_EQ(42, rawData->core.isize);
+
+    // variable length data
+    EXPECT_TRUE(rawData->data != nullptr);
+    EXPECT_EQ(29, rawData->l_data);         // NULL-term qname + tags
+    EXPECT_EQ((int)0x800, rawData->m_data); // check this if we change or tune later
+
+    // -------------------------------
+    // check data via API calls
+    // -------------------------------
+
+    EXPECT_EQ(42, bam.impl_.Bin());
+    EXPECT_EQ(42, bam.impl_.Flag());
+    EXPECT_EQ(42, bam.impl_.InsertSize());
+    EXPECT_EQ(42, bam.impl_.MapQuality());
+    EXPECT_EQ(42, bam.impl_.MateReferenceId());
+    EXPECT_EQ(42, bam.impl_.MatePosition());
+    EXPECT_EQ(42, bam.impl_.Position());
+    EXPECT_EQ(42, bam.impl_.ReferenceId());
+
+    const TagCollection& fetchedTags = bam.impl_.Tags();
+
+    EXPECT_TRUE(fetchedTags.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(std::string("1abc75"), fetchedTags.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags.at("XY").ToInt32());
+    EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags.at("CA").ToUInt8Array());
+}
+
+//#define SEQ_LENGTH  7000
+//#define NUM_RECORDS 1000
+
+//const std::string& TEST_SEQUENCE  = std::string(SEQ_LENGTH, 'G');
+//const std::string& TEST_QUALITIES = std::string(SEQ_LENGTH, '=');
+//const std::string& TEST_NAME      = std::string(SEQ_LENGTH, '/');
+//const std::string& TEST_TAGDATA   = std::string(SEQ_LENGTH, '2');
+
+//TEST(BamRecordBuilderTest, JustDoingSomeTimings_BamRecordBuilder)
+//{
+
+//    BamRecordBuilder builder;
+
+//    TagCollection tags;
+//    tags["aa"] = TEST_TAGDATA;
+//    tags["bb"] = TEST_TAGDATA;
+//    tags["cc"] = TEST_TAGDATA;
+//    tags["dd"] = TEST_TAGDATA;
+//    tags["ee"] = TEST_TAGDATA;
+//    tags["ff"] = TEST_TAGDATA;
+
+//    auto start = std::chrono::steady_clock::now();
+
+//    BamRecord record;
+//    for (size_t i = 0; i < NUM_RECORDS; ++i) {
+//        builder.Sequence(TEST_SEQUENCE)
+//               .Qualities(TEST_QUALITIES)
+//               .Name(TEST_NAME)
+//               .Tags(tags)
+//               .BuildInPlace(record);
+//    }
+//    auto end = std::chrono::steady_clock::now();
+//    (void)record;
+//    auto diff = end - start;
+//    std::cout << std::chrono::duration <double, std::milli>(diff).count() << " ms" << std::endl;
+//}
+
+
+//TEST(BamRecordBuilderTest, JustDoingSomeTimings_BamRecordOnly)
+//{
+//    TagCollection tags;
+//    tags["aa"] = TEST_TAGDATA;
+//    tags["bb"] = TEST_TAGDATA;
+//    tags["cc"] = TEST_TAGDATA;
+//    tags["dd"] = TEST_TAGDATA;
+//    tags["ee"] = TEST_TAGDATA;
+//    tags["ff"] = TEST_TAGDATA;
+
+//    auto start = std::chrono::steady_clock::now();
+
+//    BamRecord record;
+//    for (size_t i = 0; i < NUM_RECORDS; ++i) {
+//        record.SetSequenceAndQualities(TEST_SEQUENCE, TEST_QUALITIES);
+//        record.Name(TEST_NAME);
+//        record.Tags(tags);
+//    }
+//    auto end = std::chrono::steady_clock::now();
+//    (void)record;
+//    auto diff = end - start;
+//    std::cout << std::chrono::duration <double, std::milli>(diff).count() << " ms" << std::endl;
+//}
+
diff --git a/tests/src/test_BamRecordClipping.cpp b/tests/src/test_BamRecordClipping.cpp
new file mode 100644
index 0000000..425b1e5
--- /dev/null
+++ b/tests/src/test_BamRecordClipping.cpp
@@ -0,0 +1,1187 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecord.h>
+#include <pbbam/BamTagCodec.h>
+#include <chrono>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+typedef vector<uint16_t> f_data;
+
+namespace tests {
+
+static
+BamRecord MakeRecord(const Position qStart,
+                     const Position qEnd,
+                     const string& seq,
+                     const string& quals,
+                     const string& tagBases,
+                     const string& tagQuals,
+                     const f_data& frames,
+                     const string& pulseCall = "")
+{
+    BamRecordImpl impl;
+    impl.SetSequenceAndQualities(seq, quals);
+
+    TagCollection tags;
+    tags["qs"] = qStart;
+    tags["qe"] = qEnd;
+    tags["pa"] = frames;
+    tags["pm"] = frames;
+    tags["ip"] = frames;
+    tags["pw"] = frames;
+    tags["dt"] = tagBases;
+    tags["st"] = tagBases;
+    tags["pt"] = tagBases;
+    tags["dq"] = tagQuals;
+    tags["iq"] = tagQuals;
+    tags["mq"] = tagQuals;
+    tags["sq"] = tagQuals;
+    tags["pq"] = tagQuals;
+    tags["pv"] = tagQuals;
+    tags["pg"] = tagQuals;
+    tags["pc"] = pulseCall;
+    impl.Tags(tags);
+
+    return BamRecord(std::move(impl));
+}
+
+} // namespace tests
+
+TEST(BamRecordClippingTest, ClipToQuery_Basic)
+{
+    const Position qStart  = 500;
+    const Position qEnd    = 510;
+    const string seq       = "AACCGTTAGC";
+    const string pulseCall = "ttAaAtaCCGggatTTAcatGCt";
+    const string quals     = "?]?]?]?]?*";
+    const string tagBases  = "AACCGTTAGC";
+    const string tagQuals  = "?]?]?]?]?*";
+    const f_data frames    = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+
+    const int32_t  tId     = 0;
+    const Position tPos    = 100;
+    const uint8_t  mapQual = 80;
+
+    const Position clipStart = 502;
+    const Position clipEnd   = 509;
+
+    const string seq_clipped      = "CCGTTAG";
+    const string quals_clipped    = "?]?]?]?";
+    const string tagBases_clipped = "CCGTTAG";
+    const string tagQuals_clipped = "?]?]?]?";
+    const f_data frames_clipped   = { 20, 20, 30, 40, 40, 10, 30 };
+
+    const string seq_rev       = "GCTAACGGTT";
+    const string pulseCall_rev = "aGCatgTAAatccCGGtaTtTaa";
+    const string quals_rev     = "*?]?]?]?]?";
+    const string tagQuals_rev  = quals_rev;
+    const f_data frames_rev    = { 20, 30, 10, 40, 40, 30, 20, 20, 10, 10 };
+
+    const string seq_rev_clipped   = "TAACGGT";
+    const string quals_rev_clipped = "]?]?]?]";
+    const string tagBases_rev_clipped = seq_rev_clipped;
+    const string tagQuals_rev_clipped = quals_rev_clipped;
+    const f_data frames_rev_clipped = { 10, 40, 40, 30, 20, 20, 10 };
+
+    const string s1_cigar = "10=";
+    const string s2_cigar = "5=3D5=";
+    const string s3_cigar = "4=1D2I2D4=";
+
+    const string s1_cigar_clipped = "7=";
+    const string s2_cigar_clipped = "3=3D4=";
+    const string s3_cigar_clipped = "2=1D2I2D3=";
+
+    const BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames, pulseCall);
+    BamRecord s0 = prototype; // unmapped record
+    BamRecord s1 = prototype.Mapped(tId, tPos, Strand::FORWARD, s1_cigar, mapQual);
+    BamRecord s2 = prototype.Mapped(tId, tPos, Strand::FORWARD, s2_cigar, mapQual);
+    BamRecord s3 = prototype.Mapped(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+    BamRecord s1_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s1_cigar, mapQual);
+    BamRecord s2_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s2_cigar, mapQual);
+    BamRecord s3_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s3_cigar, mapQual);
+
+    s0.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s1.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s2.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s3.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s1_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s2_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s3_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+
+    // s0
+    EXPECT_FALSE(s0.IsMapped());
+    EXPECT_EQ(clipStart, s0.QueryStart());
+    EXPECT_EQ(clipEnd,   s0.QueryEnd());
+    EXPECT_EQ(PacBio::BAM::UnmappedPosition, s0.AlignedStart());
+    EXPECT_EQ(PacBio::BAM::UnmappedPosition, s0.AlignedEnd());
+    EXPECT_EQ(PacBio::BAM::UnmappedPosition, s0.ReferenceStart());
+    EXPECT_EQ(PacBio::BAM::UnmappedPosition, s0.ReferenceEnd());
+    EXPECT_EQ(seq_clipped,      s0.Sequence());
+    EXPECT_EQ(quals_clipped,    s0.Qualities().Fastq());
+    EXPECT_EQ(tagBases_clipped, s0.DeletionTag());
+    EXPECT_EQ(tagQuals_clipped, s0.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, s0.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, s0.AltLabelQV().Fastq());
+    EXPECT_EQ(frames_clipped,   s0.IPD().Data());
+    EXPECT_EQ(pulseCall,        s0.PulseCall());
+
+    // s1 - FORWARD
+    EXPECT_TRUE(s1.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+    EXPECT_EQ(clipStart, s1.QueryStart());
+    EXPECT_EQ(clipEnd,   s1.QueryEnd());
+    EXPECT_EQ(clipStart, s1.AlignedStart());   // queryStart (no soft clips)
+    EXPECT_EQ(clipEnd,   s1.AlignedEnd());     // alignStart + seqLength
+    EXPECT_EQ(102, s1.ReferenceStart());       // 100 + startOffset
+    EXPECT_EQ(109, s1.ReferenceEnd());         // RefStart + 7=
+
+    EXPECT_EQ(s1_cigar_clipped, s1.CigarData().ToStdString());
+
+    EXPECT_EQ(seq_clipped,      s1.Sequence());
+    EXPECT_EQ(quals_clipped,    s1.Qualities().Fastq());
+    EXPECT_EQ(tagBases_clipped, s1.DeletionTag());
+    EXPECT_EQ(tagQuals_clipped, s1.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, s1.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, s1.AltLabelQV().Fastq());
+    EXPECT_EQ(frames_clipped,   s1.IPD().Data());
+    EXPECT_EQ(pulseCall,        s1.PulseCall());
+
+    // s1 - REVERSE
+    EXPECT_TRUE(s1_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+    EXPECT_EQ(clipStart, s1_rev.QueryStart());
+    EXPECT_EQ(clipEnd,   s1_rev.QueryEnd());
+    EXPECT_EQ(clipStart, s1_rev.AlignedStart());    // queryStart (no soft clips)
+    EXPECT_EQ(clipEnd,   s1_rev.AlignedEnd());      // alignStart + seqLength
+    EXPECT_EQ(102, s1_rev.ReferenceStart());        // 100 + startOffset
+    EXPECT_EQ(109, s1_rev.ReferenceEnd());          // RefStart + 7=
+
+    EXPECT_EQ(s1_cigar_clipped, s1_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(seq_rev_clipped,      s1_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_rev_clipped,    s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_rev_clipped, s1_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_rev_clipped, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_rev_clipped,   s1_rev.IPD(Orientation::GENOMIC).Data());
+    EXPECT_EQ(pulseCall_rev,        s1_rev.PulseCall(Orientation::GENOMIC));
+
+    // s2 - FORWARD
+    EXPECT_TRUE(s2.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+    EXPECT_EQ(clipStart, s2.QueryStart());
+    EXPECT_EQ(clipEnd,   s2.QueryEnd());
+    EXPECT_EQ(clipStart, s2.AlignedStart());   // queryStart (no soft clips)
+    EXPECT_EQ(clipEnd,   s2.AlignedEnd());     // alignStart + seqLength
+    EXPECT_EQ(102, s2.ReferenceStart());       // 100 + startOffset
+    EXPECT_EQ(112, s2.ReferenceEnd());         // RefStart + 7= + 3D
+
+    EXPECT_EQ(s2_cigar_clipped, s2.CigarData().ToStdString());
+
+    EXPECT_EQ(seq_clipped,      s2.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_clipped,    s2.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_clipped, s2.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_clipped, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals, s2.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals, s2.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_clipped,   s2.IPD(Orientation::GENOMIC).Data());
+
+    // s2 - REVERSE
+    EXPECT_TRUE(s2_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+    EXPECT_EQ(clipStart, s2_rev.QueryStart());
+    EXPECT_EQ(clipEnd,   s2_rev.QueryEnd());
+    EXPECT_EQ(clipStart, s2_rev.AlignedStart());    // queryStart (no soft clips)
+    EXPECT_EQ(clipEnd,   s2_rev.AlignedEnd());      // alignStart + seqLength
+    EXPECT_EQ(102, s2_rev.ReferenceStart());        // 100 + startOffset
+    EXPECT_EQ(112, s2_rev.ReferenceEnd());          // RefStart + 7= + 3D
+
+    EXPECT_EQ(s2_cigar_clipped, s2_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(seq_rev_clipped,      s2_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_rev_clipped,    s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_rev_clipped, s2_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_rev_clipped, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_rev_clipped,   s2_rev.IPD(Orientation::GENOMIC).Data());
+    EXPECT_EQ(pulseCall_rev,        s2_rev.PulseCall(Orientation::GENOMIC));
+
+    // s3 - FORWARD
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(clipStart, s3.QueryStart());
+    EXPECT_EQ(clipEnd,   s3.QueryEnd());
+    EXPECT_EQ(clipStart, s3.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(clipEnd,   s3.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(102, s3.ReferenceStart());         // 100 + startOffset
+    EXPECT_EQ(110, s3.ReferenceEnd());           // RefStart + 5= + 3D
+
+    EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+    EXPECT_EQ(seq_clipped,      s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_clipped,    s3.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals, s3.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_clipped,   s3.IPD(Orientation::GENOMIC).Data());
+
+    // s3 - REVERSE
+    EXPECT_TRUE(s3_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+    EXPECT_EQ(clipStart, s3_rev.QueryStart());
+    EXPECT_EQ(clipEnd,   s3_rev.QueryEnd());
+    EXPECT_EQ(clipStart, s3_rev.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(clipEnd,   s3_rev.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(102, s3_rev.ReferenceStart());         // 100 + startOffset
+    EXPECT_EQ(110, s3_rev.ReferenceEnd());           // RefStart + 5= + 3D
+
+    EXPECT_EQ(s3_cigar_clipped, s3_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(seq_rev_clipped,      s3_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_rev_clipped,    s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_rev_clipped, s3_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_rev_clipped, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_rev_clipped,   s3_rev.IPD(Orientation::GENOMIC).Data());
+    EXPECT_EQ(pulseCall_rev,        s3_rev.PulseCall(Orientation::GENOMIC));
+}
+
+TEST(BamRecordClippingTest, ClipToQuery_WithSoftClips)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 515;
+    const string seq      = "TTAACCGTTAGCAAA";
+    const string quals    = "--?]?]?]?]?*+++";
+    const string tagBases = "TTAACCGTTAGCAAA";
+    const string tagQuals = "--?]?]?]?]?*+++";
+    const string tagQuals_rev = "+++*?]?]?]?]?--";
+    const f_data frames   = { 40, 40, 10, 10, 20, 20, 30, 40, 40, 10, 30, 20, 10, 10, 10 };
+
+    const int32_t  tId     = 0;
+    const Position tPos    = 100;
+    const uint8_t  mapQual = 80;
+
+    const Position clipStart = 502;
+    const Position clipEnd   = 509;
+
+    const string s1_cigar = "2S10=3S";
+    const string s1_cigar_clipped = "7=";
+    const string s1_seq_clipped      = "AACCGTT";
+    const string s1_quals_clipped    = "?]?]?]?";
+    const string s1_tagBases_clipped = s1_seq_clipped;
+    const string s1_tagQuals_clipped = s1_quals_clipped;
+    const f_data s1_frames_clipped   = { 10, 10, 20, 20, 30, 40, 40 };
+    const string s1_seq_rev_clipped   = "TGCTAAC";
+    const string s1_quals_rev_clipped = "+*?]?]?";
+    const string s1_tagBases_rev_clipped = s1_seq_rev_clipped;
+    const string s1_tagQuals_rev_clipped = s1_quals_rev_clipped;
+    const f_data s1_frames_rev_clipped = { 10, 20, 30, 10, 40, 40, 30 };
+
+    const string s2_cigar = "2S5=3D5=3S";
+    const string s2_cigar_clipped = "5=3D2=";
+    const string s2_seq_clipped      = "AACCGTT";
+    const string s2_quals_clipped    = "?]?]?]?";
+    const string s2_tagBases_clipped = s2_seq_clipped;
+    const string s2_tagQuals_clipped = s2_quals_clipped;
+    const f_data s2_frames_clipped   = { 10, 10, 20, 20, 30, 40, 40 };
+    const string s2_seq_rev_clipped   = "TGCTAAC";
+    const string s2_quals_rev_clipped = "+*?]?]?";
+    const string s2_tagBases_rev_clipped = s2_seq_rev_clipped;
+    const string s2_tagQuals_rev_clipped = s2_quals_rev_clipped;
+    const f_data s2_frames_rev_clipped = { 10, 20, 30, 10, 40, 40, 30 };
+
+    const string s3_cigar = "2S4=1D2I2D4=3S";
+    const string s3_cigar_clipped = "4=1D2I2D1=";
+    const string s3_seq_clipped      = "AACCGTT";
+    const string s3_quals_clipped    = "?]?]?]?";
+    const string s3_tagBases_clipped = s3_seq_clipped;
+    const string s3_tagQuals_clipped = s3_quals_clipped;
+    const f_data s3_frames_clipped   = { 10, 10, 20, 20, 30, 40, 40 };
+    const string s3_seq_rev_clipped   = "TGCTAAC";
+    const string s3_quals_rev_clipped = "+*?]?]?";
+    const string s3_tagBases_rev_clipped = s3_seq_rev_clipped;
+    const string s3_tagQuals_rev_clipped = s3_quals_rev_clipped;
+    const f_data s3_frames_rev_clipped = { 10, 20, 30, 10, 40, 40, 30 };
+
+    const BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s1 = prototype.Mapped(tId, tPos, Strand::FORWARD, s1_cigar, mapQual);
+    BamRecord s2 = prototype.Mapped(tId, tPos, Strand::FORWARD, s2_cigar, mapQual);
+    BamRecord s3 = prototype.Mapped(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+    BamRecord s1_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s1_cigar, mapQual);
+    BamRecord s2_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s2_cigar, mapQual);
+    BamRecord s3_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s3_cigar, mapQual);
+
+    // sanity checks before clipping
+    EXPECT_TRUE(s1.IsMapped());
+    EXPECT_EQ(tPos, s1.ReferenceStart());
+    EXPECT_EQ(tPos + 10, s1.ReferenceEnd()); // 10=
+
+    EXPECT_TRUE(s1_rev.IsMapped());
+    EXPECT_EQ(tPos, s1_rev.ReferenceStart());
+    EXPECT_EQ(tPos + 10, s1_rev.ReferenceEnd()); // 10=
+
+    EXPECT_TRUE(s2.IsMapped());
+    EXPECT_EQ(tPos, s2.ReferenceStart());
+    EXPECT_EQ(tPos + 13, s2.ReferenceEnd());   // 5= + 3D + 5=
+
+    EXPECT_TRUE(s2_rev.IsMapped());
+    EXPECT_EQ(tPos, s2_rev.ReferenceStart());
+    EXPECT_EQ(tPos + 13, s2_rev.ReferenceEnd());   // 5= + 3D + 5=
+
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(tPos, s3.ReferenceStart());
+    EXPECT_EQ(tPos + 11, s3.ReferenceEnd());   // 4= + 1D + 2D + 4=
+
+    EXPECT_TRUE(s3_rev.IsMapped());
+    EXPECT_EQ(tPos, s3_rev.ReferenceStart());
+    EXPECT_EQ(tPos + 11, s3_rev.ReferenceEnd());   // 4= + 1D + 2D + 4=
+
+    s1.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s2.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s3.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s1_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s2_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+    s3_rev.Clip(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+
+    // s1 - FORWARD
+    EXPECT_TRUE(s1.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+    EXPECT_EQ(clipStart, s1.QueryStart());
+    EXPECT_EQ(clipEnd,   s1.QueryEnd());
+    EXPECT_EQ(clipStart, s1.AlignedStart());    // queryStart (no soft clips left)
+    EXPECT_EQ(clipEnd,   s1.AlignedEnd());      // alignStart + seqLength
+    EXPECT_EQ(tPos,      s1.ReferenceStart());  // tPos
+    EXPECT_EQ(tPos + 7,  s1.ReferenceEnd());    // RefStart + 7=
+
+    EXPECT_EQ(s1_cigar_clipped, s1.CigarData().ToStdString());
+
+    EXPECT_EQ(s1_seq_clipped,      s1.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s1_quals_clipped,    s1.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s1_tagBases_clipped, s1.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s1_tagQuals_clipped, s1.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s1_tagQuals_clipped, s1.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s1_tagQuals_clipped, s1.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s1_frames_clipped,   s1.IPD(Orientation::GENOMIC).Data());
+
+    // s1 - REVERSE
+    EXPECT_TRUE(s1_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+    EXPECT_EQ(clipStart, s1_rev.QueryStart());
+    EXPECT_EQ(clipEnd,   s1_rev.QueryEnd());
+    EXPECT_EQ(clipStart, s1_rev.AlignedStart());    // queryStart (no soft clips)
+    EXPECT_EQ(clipEnd,   s1_rev.AlignedEnd());      // alignStart + seqLength
+    EXPECT_EQ(tPos,      s1_rev.ReferenceStart());  // 100 + startOffset
+    EXPECT_EQ(tPos + 7,  s1_rev.ReferenceEnd());    // RefStart + 7=
+
+    EXPECT_EQ(s1_cigar_clipped, s1_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(s1_seq_rev_clipped,      s1_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s1_quals_rev_clipped,    s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s1_tagBases_rev_clipped, s1_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s1_frames_rev_clipped,   s1_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s2 - FORWARD
+    EXPECT_TRUE(s2.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+    EXPECT_EQ(clipStart, s2.QueryStart());
+    EXPECT_EQ(clipEnd,   s2.QueryEnd());
+    EXPECT_EQ(clipStart, s2.AlignedStart());    // queryStart (no soft clips left)
+    EXPECT_EQ(clipEnd,   s2.AlignedEnd());      // alignStart + seqLength
+    EXPECT_EQ(tPos,      s2.ReferenceStart());  // 100 + startOffset
+    EXPECT_EQ(tPos + 10, s2.ReferenceEnd());    // RefStart + 5=3D2=
+
+    EXPECT_EQ(s2_cigar_clipped, s2.CigarData().ToStdString());
+
+    EXPECT_EQ(s2_seq_clipped,      s2.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2_quals_clipped,    s2.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_tagBases_clipped, s2.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2_tagQuals_clipped, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_clipped, s2.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_clipped, s2.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_frames_clipped,   s2.IPD(Orientation::GENOMIC).Data());
+
+    // s2 - REVERSE
+    EXPECT_TRUE(s2_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+    EXPECT_EQ(clipStart, s2_rev.QueryStart());
+    EXPECT_EQ(clipEnd,   s2_rev.QueryEnd());
+    EXPECT_EQ(clipStart, s2_rev.AlignedStart());    // queryStart (no soft clips left)
+    EXPECT_EQ(clipEnd,   s2_rev.AlignedEnd());      // alignStart + seqLength
+    EXPECT_EQ(tPos,      s2_rev.ReferenceStart());  // 100 + startOffset
+    EXPECT_EQ(tPos + 10, s2_rev.ReferenceEnd());    // RefStart + 5=3D2=
+
+    EXPECT_EQ(s2_cigar_clipped, s2_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(s2_seq_rev_clipped,      s2_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2_quals_rev_clipped,    s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_tagBases_rev_clipped, s2_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_frames_rev_clipped,   s2_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s3 - FORWARD
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(clipStart, s3.QueryStart());
+    EXPECT_EQ(clipEnd,   s3.QueryEnd());
+    EXPECT_EQ(clipStart, s3.AlignedStart());    // queryStart (no soft clips left)
+    EXPECT_EQ(clipEnd,   s3.AlignedEnd());      // alignStart + seqLength
+    EXPECT_EQ(tPos,      s3.ReferenceStart());  // 100 + startOffset
+    EXPECT_EQ(tPos + 8,  s3.ReferenceEnd());    // RefStart + 4=1D2D1=
+
+    EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+    EXPECT_EQ(s3_seq_clipped,      s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_quals_clipped,    s3.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_frames_clipped,   s3.IPD(Orientation::GENOMIC).Data());
+
+    // s3 - REVERSE
+    EXPECT_TRUE(s3_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+    EXPECT_EQ(clipStart, s3_rev.QueryStart());
+    EXPECT_EQ(clipEnd,   s3_rev.QueryEnd());
+    EXPECT_EQ(clipStart, s3_rev.AlignedStart());    // queryStart (no soft clips left)
+    EXPECT_EQ(clipEnd,   s3_rev.AlignedEnd());      // alignStart + seqLength
+    EXPECT_EQ(tPos,      s3_rev.ReferenceStart());  // 100 + startOffset
+    EXPECT_EQ(tPos + 8,  s3_rev.ReferenceEnd());    // RefStart + 4=1D2D1=
+
+    EXPECT_EQ(s3_cigar_clipped, s3_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(s3_seq_rev_clipped,      s3_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_quals_rev_clipped,    s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_tagBases_rev_clipped, s3_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_frames_rev_clipped,   s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, ClipToReference_Basic)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 510;
+    const string seq      = "AACCGTTAGC";
+    const string quals    = "?]?]?]?]?*";
+    const string tagBases = "AACCGTTAGC";
+    const string tagQuals = "?]?]?]?]?*";
+    const string tagQuals_rev = "*?]?]?]?]?";
+    const f_data frames   = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+
+    const int32_t  tId     = 0;
+    const Position tPos    = 100;
+    const uint8_t  mapQual = 80;
+
+    const Position clipStart = 102;
+    const Position clipEnd   = 107;
+
+    const string s1_cigar = "10=";
+    const string s1_cigar_clipped = "5=";
+    const string s1_seq_clipped      = "CCGTT";
+    const string s1_quals_clipped    = "?]?]?";
+    const string s1_tagBases_clipped = s1_seq_clipped;
+    const string s1_tagQuals_clipped = s1_quals_clipped;
+    const f_data s1_frames_clipped   = { 20, 20, 30, 40, 40 };
+    const string s1_seq_rev_clipped   = "TAACG";
+    const string s1_quals_rev_clipped = "]?]?]";
+    const string s1_tagBases_rev_clipped = s1_seq_rev_clipped;
+    const string s1_tagQuals_rev_clipped = s1_quals_rev_clipped;
+    const f_data s1_frames_rev_clipped = { 10, 40, 40, 30, 20 };
+
+    const string s2_cigar = "5=3D5=";
+    const string s2_cigar_clipped = "3=2D";
+    const string s2_seq_clipped      = "CCG";
+    const string s2_quals_clipped    = "?]?";
+    const string s2_tagBases_clipped = s2_seq_clipped;
+    const string s2_tagQuals_clipped = s2_quals_clipped;
+    const f_data s2_frames_clipped   = { 20, 20, 30 };
+    const string s2_seq_rev_clipped   = "TAA";
+    const string s2_quals_rev_clipped = "]?]";
+    const string s2_tagBases_rev_clipped = s2_seq_rev_clipped;
+    const string s2_tagQuals_rev_clipped = s2_quals_rev_clipped;
+    const f_data s2_frames_rev_clipped = { 10, 40, 40 };
+
+    const string s3_cigar = "4=1D2I2D4=";
+    const string s3_cigar_clipped = "2=1D2I2D";
+    const string s3_seq_clipped      = "CCGT";
+    const string s3_quals_clipped    = "?]?]";
+    const string s3_tagBases_clipped = s3_seq_clipped;
+    const string s3_tagQuals_clipped = s3_quals_clipped;
+    const f_data s3_frames_clipped   = { 20, 20, 30, 40 };
+    const string s3_seq_rev_clipped   = "TAAC";
+    const string s3_quals_rev_clipped = "]?]?";
+    const string s3_tagBases_rev_clipped = s3_seq_rev_clipped;
+    const string s3_tagQuals_rev_clipped = s3_quals_rev_clipped;
+    const f_data s3_frames_rev_clipped = { 10, 40, 40, 30};
+
+    const BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s0 = prototype;
+    BamRecord s1 = prototype.Mapped(tId, tPos, Strand::FORWARD, s1_cigar, mapQual);
+    BamRecord s2 = prototype.Mapped(tId, tPos, Strand::FORWARD, s2_cigar, mapQual);
+    BamRecord s3 = prototype.Mapped(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+    BamRecord s1_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s1_cigar, mapQual);
+    BamRecord s2_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s2_cigar, mapQual);
+    BamRecord s3_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s3_cigar, mapQual);
+
+    s0.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s1.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s2.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s3.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s1_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s2_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s3_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+
+    // s0 - no clipping should have been done to unmapped record
+    EXPECT_FALSE(s0.IsMapped());
+    EXPECT_EQ(prototype.QueryStart(),     s0.QueryStart());
+    EXPECT_EQ(prototype.QueryEnd(),       s0.QueryEnd());
+    EXPECT_EQ(prototype.AlignedStart(),   s0.AlignedStart());
+    EXPECT_EQ(prototype.AlignedEnd(),     s0.AlignedEnd());
+    EXPECT_EQ(prototype.ReferenceStart(), s0.ReferenceStart());
+    EXPECT_EQ(prototype.ReferenceEnd(),   s0.ReferenceEnd());
+    EXPECT_EQ(prototype.Sequence(),       s0.Sequence());
+    EXPECT_EQ(prototype.Qualities(),      s0.Qualities());
+    EXPECT_EQ(prototype.DeletionTag(),    s0.DeletionTag());
+    EXPECT_EQ(prototype.DeletionQV(),     s0.DeletionQV());
+//    EXPECT_EQ(prototype.LabelQV(),        s0.LabelQV());
+//    EXPECT_EQ(prototype.AltLabelQV(),     s0.AltLabelQV());
+    EXPECT_EQ(prototype.IPD(),            s0.IPD());
+
+    // s1 - FORWARD
+    EXPECT_TRUE(s1.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+    EXPECT_EQ(502,   s1.QueryStart());
+    EXPECT_EQ(507,   s1.QueryEnd());
+    EXPECT_EQ(502,   s1.AlignedStart());       // queryStart (no soft clips)
+    EXPECT_EQ(507,   s1.AlignedEnd());         // alignStart + seqLength
+    EXPECT_EQ(clipStart, s1.ReferenceStart()); // clipStart
+    EXPECT_EQ(clipEnd,   s1.ReferenceEnd());   // clipEnd
+
+    EXPECT_EQ(s1_cigar_clipped, s1.CigarData().ToStdString());
+
+    EXPECT_EQ(s1_seq_clipped,      s1.Sequence());
+    EXPECT_EQ(s1_quals_clipped,    s1.Qualities().Fastq());
+    EXPECT_EQ(s1_tagBases_clipped, s1.DeletionTag());
+    EXPECT_EQ(s1_tagQuals_clipped, s1.DeletionQV().Fastq());
+//    EXPECT_EQ(s1_tagQuals_clipped, s1.LabelQV().Fastq());
+//    EXPECT_EQ(s1_tagQuals_clipped, s1.AltLabelQV().Fastq());
+    EXPECT_EQ(s1_frames_clipped,   s1.IPD().Data());
+
+    // s1 - REVERSE
+    EXPECT_TRUE(s1_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+    EXPECT_EQ(503, s1_rev.QueryStart());
+    EXPECT_EQ(508, s1_rev.QueryEnd());
+    EXPECT_EQ(503, s1_rev.AlignedStart());          // queryStart (no soft clips)
+    EXPECT_EQ(508, s1_rev.AlignedEnd());            // alignStart + seqLength
+    EXPECT_EQ(clipStart, s1_rev.ReferenceStart());  // clipStart
+    EXPECT_EQ(clipEnd,   s1_rev.ReferenceEnd());    // clipEnd
+
+    EXPECT_EQ(s1_cigar_clipped, s1_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(s1_seq_rev_clipped,      s1_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s1_quals_rev_clipped,    s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s1_tagBases_rev_clipped, s1_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s1_frames_rev_clipped,   s1_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s2 - FORWARD
+    EXPECT_TRUE(s2.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+    EXPECT_EQ(502, s2.QueryStart());
+    EXPECT_EQ(505, s2.QueryEnd());
+    EXPECT_EQ(502, s2.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(505, s2.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(clipStart, s2.ReferenceStart());   // clipStart
+    EXPECT_EQ(clipEnd,   s2.ReferenceEnd());     // clipEnd
+
+    EXPECT_EQ(s2_cigar_clipped, s2.CigarData().ToStdString());
+
+    EXPECT_EQ(s2_seq_clipped,      s2.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2_quals_clipped,    s2.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_tagBases_clipped, s2.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2_tagQuals_clipped, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_clipped, s2.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_clipped, s2.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_frames_clipped,   s2.IPD(Orientation::GENOMIC).Data());
+
+    // s2 - REVERSE
+    EXPECT_TRUE(s2_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+    EXPECT_EQ(505, s2_rev.QueryStart());
+    EXPECT_EQ(508, s2_rev.QueryEnd());
+    EXPECT_EQ(505, s2_rev.AlignedStart());    // queryStart (no soft clips)
+    EXPECT_EQ(508, s2_rev.AlignedEnd());      // alignStart + seqLength
+    EXPECT_EQ(clipStart, s2_rev.ReferenceStart());  // clipStart
+    EXPECT_EQ(clipEnd,   s2_rev.ReferenceEnd());    // clipEnd
+
+    EXPECT_EQ(s2_cigar_clipped, s2_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(s2_seq_rev_clipped,      s2_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2_quals_rev_clipped,    s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_tagBases_rev_clipped, s2_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_frames_rev_clipped,   s2_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s3 - FORWARD
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(502, s3.QueryStart());
+    EXPECT_EQ(506, s3.QueryEnd());
+    EXPECT_EQ(502, s3.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(506, s3.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(clipStart, s3.ReferenceStart());   // clipStart
+    EXPECT_EQ(clipEnd,   s3.ReferenceEnd());     // clipEnd
+
+    EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+    EXPECT_EQ(s3_seq_clipped,      s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_quals_clipped,    s3.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_frames_clipped,   s3.IPD(Orientation::GENOMIC).Data());
+
+    // s3 - REVERSE
+    EXPECT_TRUE(s3_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+    EXPECT_EQ(504, s3_rev.QueryStart());
+    EXPECT_EQ(508, s3_rev.QueryEnd());
+    EXPECT_EQ(504, s3_rev.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(508, s3_rev.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(clipStart, s3_rev.ReferenceStart());  // clipStart
+    EXPECT_EQ(clipEnd,   s3_rev.ReferenceEnd());    // clipEnd
+
+    EXPECT_EQ(s3_cigar_clipped, s3_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(s3_seq_rev_clipped,      s3_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_quals_rev_clipped,    s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_tagBases_rev_clipped, s3_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_frames_rev_clipped,   s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, ClipToReference_WithSoftClips)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 515;
+    const string seq      = "TTAACCGTTAGCAAA";
+    const string quals    = "--?]?]?]?]?*+++";
+    const string tagBases = "TTAACCGTTAGCAAA";
+    const string tagQuals = "--?]?]?]?]?*+++";
+    const string tagQuals_rev = "+++*?]?]?]?]?--";
+    const f_data frames   = { 40, 40, 10, 10, 20, 20, 30, 40, 40, 10, 30, 20, 10, 10, 10 };
+
+    const int32_t  tId     = 0;
+    const Position tPos    = 100;
+    const uint8_t  mapQual = 80;
+
+    const Position clipStart = 102;
+    const Position clipEnd   = 107;
+
+    const string seq_rev      = "TTTGCTAACGGTTAA";
+    const string quals_rev    = "+++*?]?]?]?]?--";
+    const f_data frames_rev   = { 10, 10, 10, 20, 30, 10, 40, 40, 30, 20, 20, 10, 10, 40, 40 };
+
+    const string s1_cigar = "2S10=3S";
+    const string s1_cigar_clipped = "5=";
+    const string s1_seq_clipped      = "CCGTT";
+    const string s1_quals_clipped    = "?]?]?";
+    const string s1_tagBases_clipped = s1_seq_clipped;
+    const string s1_tagQuals_clipped = s1_quals_clipped;
+    const f_data s1_frames_clipped   = { 20, 20, 30, 40, 40 };
+    const string s1_seq_rev_clipped   = "CTAAC";
+    const string s1_quals_rev_clipped = "?]?]?";
+    const string s1_tagBases_rev_clipped = s1_seq_rev_clipped;
+    const string s1_tagQuals_rev_clipped = s1_quals_rev_clipped;
+    const f_data s1_frames_rev_clipped = { 30, 10, 40, 40, 30 };
+
+    const string s2_cigar = "2S5=3D5=3S";
+    const string s2_cigar_clipped = "3=2D";
+    const string s2_seq_clipped      = "CCG";
+    const string s2_quals_clipped    = "?]?";
+    const string s2_tagBases_clipped = s2_seq_clipped;
+    const string s2_tagQuals_clipped = s2_quals_clipped;
+    const f_data s2_frames_clipped   = { 20, 20, 30 };
+    const string s2_seq_rev_clipped   = "CTA";
+    const string s2_quals_rev_clipped = "?]?";
+    const string s2_tagBases_rev_clipped = s2_seq_rev_clipped;
+    const string s2_tagQuals_rev_clipped = s2_quals_rev_clipped;
+    const f_data s2_frames_rev_clipped = { 30, 10, 40 };
+
+    const string s3_cigar = "2S4=1D2I2D4=3S";
+    const string s3_cigar_clipped = "2=1D2I2D";
+    const string s3_seq_clipped      = "CCGT";
+    const string s3_quals_clipped    = "?]?]";
+    const string s3_tagBases_clipped = s3_seq_clipped;
+    const string s3_tagQuals_clipped = s3_quals_clipped;
+    const f_data s3_frames_clipped   = { 20, 20, 30, 40 };
+    const string s3_seq_rev_clipped   = "CTAA";
+    const string s3_quals_rev_clipped = "?]?]";
+    const string s3_tagBases_rev_clipped = s3_seq_rev_clipped;
+    const string s3_tagQuals_rev_clipped = s3_quals_rev_clipped;
+    const f_data s3_frames_rev_clipped = { 30, 10, 40, 40 };
+
+    const BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s0 = prototype;
+    BamRecord s1 = prototype.Mapped(tId, tPos, Strand::FORWARD, s1_cigar, mapQual);
+    BamRecord s2 = prototype.Mapped(tId, tPos, Strand::FORWARD, s2_cigar, mapQual);
+    BamRecord s3 = prototype.Mapped(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+    BamRecord s1_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s1_cigar, mapQual);
+    BamRecord s2_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s2_cigar, mapQual);
+    BamRecord s3_rev = prototype.Mapped(tId, tPos, Strand::REVERSE, s3_cigar, mapQual);
+
+    // sanity checks before clipping
+    EXPECT_FALSE(s0.IsMapped());
+
+    EXPECT_TRUE(s1.IsMapped());
+    EXPECT_EQ(500,       s1.QueryStart());      // queryStart
+    EXPECT_EQ(515,       s1.QueryEnd());        // queryStart + seqLength
+    EXPECT_EQ(502,       s1.AlignedStart());    // queryStart + 2S
+    EXPECT_EQ(512,       s1.AlignedEnd());      // alignedStart + 10=
+    EXPECT_EQ(tPos,      s1.ReferenceStart());  // tPos
+    EXPECT_EQ(tPos + 10, s1.ReferenceEnd());    // tPos + 10=
+
+    EXPECT_TRUE(s1_rev.IsMapped());
+    EXPECT_EQ(500,       s1_rev.QueryStart());      // queryStart
+    EXPECT_EQ(515,       s1_rev.QueryEnd());        // queryStart + seqLength
+    EXPECT_EQ(503,       s1_rev.AlignedStart());    // queryStart + 3S
+    EXPECT_EQ(513,       s1_rev.AlignedEnd());      // alignedStart + 10=
+    EXPECT_EQ(tPos,      s1_rev.ReferenceStart());  // tPos
+    EXPECT_EQ(tPos + 10, s1_rev.ReferenceEnd());    // tPos + 10=
+
+    EXPECT_TRUE(s2.IsMapped());
+    EXPECT_EQ(500,       s2.QueryStart());      // queryStart
+    EXPECT_EQ(515,       s2.QueryEnd());        // queryStart + seqLength
+    EXPECT_EQ(502,       s2.AlignedStart());    // queryStart + 2S
+    EXPECT_EQ(512,       s2.AlignedEnd());      // alignedStart + 5=5=
+    EXPECT_EQ(tPos,      s2.ReferenceStart());  // tPos
+    EXPECT_EQ(tPos + 13, s2.ReferenceEnd());    // tPos + 5=3D5=
+
+    EXPECT_TRUE(s2_rev.IsMapped());
+    EXPECT_EQ(500,       s2_rev.QueryStart());      // queryStart
+    EXPECT_EQ(515,       s2_rev.QueryEnd());        // queryStart + seqLength
+    EXPECT_EQ(503,       s2_rev.AlignedStart());    // queryStart + S
+    EXPECT_EQ(513,       s2_rev.AlignedEnd());      // alignedStart + 5=5=
+    EXPECT_EQ(tPos,      s2_rev.ReferenceStart());  // tPos
+    EXPECT_EQ(tPos + 13, s2_rev.ReferenceEnd());    // tPos + 5=3D5=
+
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(500,       s3.QueryStart());      // queryStart
+    EXPECT_EQ(515,       s3.QueryEnd());        // queryStart + seqLength
+    EXPECT_EQ(502,       s3.AlignedStart());    // queryStart + 2S
+    EXPECT_EQ(512,       s3.AlignedEnd());      // alignedStart + 4=2I4=
+    EXPECT_EQ(tPos,      s3.ReferenceStart());  // tPos
+    EXPECT_EQ(tPos + 11, s3.ReferenceEnd());    // tPos + 4=1D2D4=
+
+    EXPECT_TRUE(s3_rev.IsMapped());
+    EXPECT_EQ(500,       s3_rev.QueryStart());      // queryStart
+    EXPECT_EQ(515,       s3_rev.QueryEnd());        // queryStart + seqLength
+    EXPECT_EQ(503,       s3_rev.AlignedStart());    // queryStart + 2S
+    EXPECT_EQ(513,       s3_rev.AlignedEnd());      // alignedStart + 4=2I4=
+    EXPECT_EQ(tPos,      s3_rev.ReferenceStart());  // tPos
+    EXPECT_EQ(tPos + 11, s3_rev.ReferenceEnd());    // tPos + 4=1D2D4=
+
+    s0.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s1.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s2.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s3.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s1_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s2_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+    s3_rev.Clip(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+
+    // s0 - no clipping should have been done to unmapped record
+    EXPECT_FALSE(s0.IsMapped());
+    EXPECT_EQ(prototype.QueryStart(),     s0.QueryStart());
+    EXPECT_EQ(prototype.QueryEnd(),       s0.QueryEnd());
+    EXPECT_EQ(prototype.AlignedStart(),   s0.AlignedStart());
+    EXPECT_EQ(prototype.AlignedEnd(),     s0.AlignedEnd());
+    EXPECT_EQ(prototype.ReferenceStart(), s0.ReferenceStart());
+    EXPECT_EQ(prototype.ReferenceEnd(),   s0.ReferenceEnd());
+    EXPECT_EQ(prototype.Sequence(),       s0.Sequence());
+    EXPECT_EQ(prototype.Qualities(),      s0.Qualities());
+    EXPECT_EQ(prototype.DeletionTag(),    s0.DeletionTag());
+    EXPECT_EQ(prototype.DeletionQV(),     s0.DeletionQV());
+//    EXPECT_EQ(prototype.LabelQV(),        s0.LabelQV());
+//    EXPECT_EQ(prototype.AltLabelQV(),     s0.AltLabelQV());
+    EXPECT_EQ(prototype.IPD(),            s0.IPD());
+
+    // s1 - FORWARD
+    EXPECT_TRUE(s1.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+    EXPECT_EQ(504,   s1.QueryStart());         // new queryStart
+    EXPECT_EQ(509,   s1.QueryEnd());           // queryStart + new seqLength
+    EXPECT_EQ(504,   s1.AlignedStart());       // queryStart (no soft clips remaining)
+    EXPECT_EQ(509,   s1.AlignedEnd());         // alignStart + new seqLength
+    EXPECT_EQ(clipStart, s1.ReferenceStart()); // clipStart
+    EXPECT_EQ(clipEnd,   s1.ReferenceEnd());   // clipEnd
+
+    EXPECT_EQ(s1_cigar_clipped, s1.CigarData().ToStdString());
+
+    EXPECT_EQ(s1_seq_clipped,      s1.Sequence());
+    EXPECT_EQ(s1_quals_clipped,    s1.Qualities().Fastq());
+    EXPECT_EQ(s1_tagBases_clipped, s1.DeletionTag());
+    EXPECT_EQ(s1_tagQuals_clipped, s1.DeletionQV().Fastq());
+//    EXPECT_EQ(s1_tagQuals_clipped, s1.LabelQV().Fastq());
+//    EXPECT_EQ(s1_tagQuals_clipped, s1.AltLabelQV().Fastq());
+    EXPECT_EQ(s1_frames_clipped,   s1.IPD().Data());
+
+    // s1 - REVERSE
+    EXPECT_TRUE(s1_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+    EXPECT_EQ(506,   s1_rev.QueryStart());         // new queryStart
+    EXPECT_EQ(511,   s1_rev.QueryEnd());           // queryStart + new seqLength
+    EXPECT_EQ(506,   s1_rev.AlignedStart());       // queryStart (no soft clips remaining)
+    EXPECT_EQ(511,   s1_rev.AlignedEnd());         // alignStart + new seqLength
+    EXPECT_EQ(clipStart, s1_rev.ReferenceStart()); // clipStart
+    EXPECT_EQ(clipEnd,   s1_rev.ReferenceEnd());   // clipEnd
+
+    EXPECT_EQ(s1_cigar_clipped, s1_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(s1_seq_rev_clipped,      s1_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s1_quals_rev_clipped,    s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s1_tagBases_rev_clipped, s1_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s1_tagQuals_rev_clipped, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s1_frames_rev_clipped,   s1_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s2 - FORWARD
+    EXPECT_TRUE(s2.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+    EXPECT_EQ(504, s2.QueryStart());
+    EXPECT_EQ(507, s2.QueryEnd());
+    EXPECT_EQ(504, s2.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(507, s2.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(clipStart, s2.ReferenceStart());   // clipStart
+    EXPECT_EQ(clipEnd,   s2.ReferenceEnd());     // clipEnd
+
+    EXPECT_EQ(s2_cigar_clipped, s2.CigarData().ToStdString());
+
+    EXPECT_EQ(s2_seq_clipped,      s2.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2_quals_clipped,    s2.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_tagBases_clipped, s2.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2_tagQuals_clipped, s2.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_clipped, s2.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_clipped, s2.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_frames_clipped,   s2.IPD(Orientation::GENOMIC).Data());
+
+    // s2 - REVERSE
+    EXPECT_TRUE(s2_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+    EXPECT_EQ(508,   s2_rev.QueryStart());         // new queryStart
+    EXPECT_EQ(511,   s2_rev.QueryEnd());           // queryStart + new seqLength
+    EXPECT_EQ(508,   s2_rev.AlignedStart());       // queryStart (no soft clips remaining)
+    EXPECT_EQ(511,   s2_rev.AlignedEnd());         // alignStart + new seqLength
+    EXPECT_EQ(clipStart, s2_rev.ReferenceStart()); // clipStart
+    EXPECT_EQ(clipEnd,   s2_rev.ReferenceEnd());   // clipEnd
+
+    EXPECT_EQ(s2_cigar_clipped, s2_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(s2_seq_rev_clipped,      s2_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s2_quals_rev_clipped,    s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_tagBases_rev_clipped, s2_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s2_tagQuals_rev_clipped, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s2_frames_rev_clipped,   s2_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s3 - FORWARD
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(504, s3.QueryStart());
+    EXPECT_EQ(508, s3.QueryEnd());
+    EXPECT_EQ(504, s3.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(508, s3.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(clipStart, s3.ReferenceStart());   // clipStart
+    EXPECT_EQ(clipEnd,   s3.ReferenceEnd());     // clipEnd
+
+    EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+    EXPECT_EQ(s3_seq_clipped,      s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_quals_clipped,    s3.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_frames_clipped,   s3.IPD(Orientation::GENOMIC).Data());
+
+    // s3 - REVERSE
+    EXPECT_TRUE(s3_rev.IsMapped());
+    EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+    EXPECT_EQ(507,   s3_rev.QueryStart());         // new queryStart
+    EXPECT_EQ(511,   s3_rev.QueryEnd());           // queryStart + new seqLength
+    EXPECT_EQ(507,   s3_rev.AlignedStart());       // queryStart (no soft clips remaining)
+    EXPECT_EQ(511,   s3_rev.AlignedEnd());         // alignStart + new seqLength
+    EXPECT_EQ(clipStart, s3_rev.ReferenceStart()); // clipStart
+    EXPECT_EQ(clipEnd,   s3_rev.ReferenceEnd());   // clipEnd
+
+    EXPECT_EQ(s3_cigar_clipped, s3_rev.CigarData().ToStdString());
+
+    EXPECT_EQ(s3_seq_rev_clipped,      s3_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_quals_rev_clipped,    s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_tagBases_rev_clipped, s3_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_rev_clipped, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_frames_rev_clipped,   s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, ClippedToQueryCopy)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 510;
+    const int32_t  tId     = 0;
+    const Position tPos    = 100;
+    const uint8_t  mapQual = 80;
+    const Position clipStart = 502;
+    const Position clipEnd   = 509;
+
+    const string seq      = "AACCGTTAGC";
+    const string quals    = "?]?]?]?]?*";
+    const string tagBases = "AACCGTTAGC";
+    const string tagQuals = "?]?]?]?]?*";
+    const f_data frames   = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+
+    const string seq_clipped      = "CCGTTAG";
+    const string quals_clipped    = "?]?]?]?";
+    const string tagBases_clipped = "CCGTTAG";
+    const string tagQuals_clipped = "?]?]?]?";
+    const f_data frames_clipped   = { 20, 20, 30, 40, 40, 10, 30 };
+
+    const string s3_cigar = "4=1D2I2D4=";
+    const string s3_cigar_clipped = "2=1D2I2D3=";
+
+    BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    prototype.Map(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+
+    BamRecord s3 = prototype.Clipped(ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(clipStart, s3.QueryStart());
+    EXPECT_EQ(clipEnd,   s3.QueryEnd());
+    EXPECT_EQ(clipStart, s3.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(clipEnd,   s3.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(102, s3.ReferenceStart());         // 100 + startOffset
+    EXPECT_EQ(110, s3.ReferenceEnd());           // RefStart + 5= + 3D
+
+    EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+    EXPECT_EQ(seq_clipped,      s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_clipped,    s3.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_clipped,   s3.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, ClippedToReferenceCopy)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 510;
+    const string seq      = "AACCGTTAGC";
+    const string quals    = "?]?]?]?]?*";
+    const string tagBases = "AACCGTTAGC";
+    const string tagQuals = "?]?]?]?]?*";
+    const f_data frames   = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+    const int32_t  tId     = 0;
+    const Position tPos    = 100;
+    const uint8_t  mapQual = 80;
+    const Position clipStart = 102;
+    const Position clipEnd   = 107;
+
+    const string s3_cigar = "4=1D2I2D4=";
+    const string s3_cigar_clipped = "2=1D2I2D";
+    const string s3_seq_clipped      = "CCGT";
+    const string s3_quals_clipped    = "?]?]";
+    const string s3_tagBases_clipped = s3_seq_clipped;
+    const string s3_tagQuals_clipped = s3_quals_clipped;
+    const f_data s3_frames_clipped   = { 20, 20, 30, 40 };
+
+    BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    prototype.Map(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+
+    const BamRecord s3 = prototype.Clipped(ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+
+    // s3 - FORWARD
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(502, s3.QueryStart());
+    EXPECT_EQ(506, s3.QueryEnd());
+    EXPECT_EQ(502, s3.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(506, s3.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(clipStart, s3.ReferenceStart());   // clipStart
+    EXPECT_EQ(clipEnd,   s3.ReferenceEnd());     // clipEnd
+
+    EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+    EXPECT_EQ(s3_seq_clipped,      s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_quals_clipped,    s3.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_frames_clipped,   s3.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, StaticClippedToQuery)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 510;
+    const int32_t  tId     = 0;
+    const Position tPos    = 100;
+    const uint8_t  mapQual = 80;
+    const Position clipStart = 502;
+    const Position clipEnd   = 509;
+
+    const string seq      = "AACCGTTAGC";
+    const string quals    = "?]?]?]?]?*";
+    const string tagBases = "AACCGTTAGC";
+    const string tagQuals = "?]?]?]?]?*";
+    const f_data frames   = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+
+    const string seq_clipped      = "CCGTTAG";
+    const string quals_clipped    = "?]?]?]?";
+    const string tagBases_clipped = "CCGTTAG";
+    const string tagQuals_clipped = "?]?]?]?";
+    const f_data frames_clipped   = { 20, 20, 30, 40, 40, 10, 30 };
+
+    const string s3_cigar = "4=1D2I2D4=";
+    const string s3_cigar_clipped = "2=1D2I2D3=";
+
+    BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    prototype.Map(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+
+    const BamRecord s3 = BamRecord::Clipped(prototype, ClipType::CLIP_TO_QUERY, clipStart, clipEnd);
+
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(clipStart, s3.QueryStart());
+    EXPECT_EQ(clipEnd,   s3.QueryEnd());
+    EXPECT_EQ(clipStart, s3.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(clipEnd,   s3.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(102, s3.ReferenceStart());         // 100 + startOffset
+    EXPECT_EQ(110, s3.ReferenceEnd());           // RefStart + 5= + 3D
+
+    EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+    EXPECT_EQ(seq_clipped,      s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_clipped,    s3.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_clipped,   s3.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordClippingTest, StaticClippedToReference)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 510;
+    const string seq      = "AACCGTTAGC";
+    const string quals    = "?]?]?]?]?*";
+    const string tagBases = "AACCGTTAGC";
+    const string tagQuals = "?]?]?]?]?*";
+    const f_data frames   = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+    const int32_t  tId     = 0;
+    const Position tPos    = 100;
+    const uint8_t  mapQual = 80;
+    const Position clipStart = 102;
+    const Position clipEnd   = 107;
+
+    const string s3_cigar = "4=1D2I2D4=";
+    const string s3_cigar_clipped = "2=1D2I2D";
+    const string s3_seq_clipped      = "CCGT";
+    const string s3_quals_clipped    = "?]?]";
+    const string s3_tagBases_clipped = s3_seq_clipped;
+    const string s3_tagQuals_clipped = s3_quals_clipped;
+    const f_data s3_frames_clipped   = { 20, 20, 30, 40 };
+
+    BamRecord prototype = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    prototype.Map(tId, tPos, Strand::FORWARD, s3_cigar, mapQual);
+
+    const BamRecord s3 = BamRecord::Clipped(prototype, ClipType::CLIP_TO_REFERENCE, clipStart, clipEnd);
+
+    // s3 - FORWARD
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(502, s3.QueryStart());
+    EXPECT_EQ(506, s3.QueryEnd());
+    EXPECT_EQ(502, s3.AlignedStart());     // queryStart (no soft clips)
+    EXPECT_EQ(506, s3.AlignedEnd());       // alignStart + seqLength
+    EXPECT_EQ(clipStart, s3.ReferenceStart());   // clipStart
+    EXPECT_EQ(clipEnd,   s3.ReferenceEnd());     // clipEnd
+
+    EXPECT_EQ(s3_cigar_clipped, s3.CigarData().ToStdString());
+
+    EXPECT_EQ(s3_seq_clipped,      s3.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(s3_quals_clipped,    s3.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_tagBases_clipped, s3.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(s3_tagQuals_clipped, s3.DeletionQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.LabelQV(Orientation::GENOMIC).Fastq());
+//    EXPECT_EQ(s3_tagQuals_clipped, s3.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(s3_frames_clipped,   s3.IPD(Orientation::GENOMIC).Data());
+}
diff --git a/tests/src/test_BamRecordImplCore.cpp b/tests/src/test_BamRecordImplCore.cpp
new file mode 100644
index 0000000..6fad659
--- /dev/null
+++ b/tests/src/test_BamRecordImplCore.cpp
@@ -0,0 +1,613 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecordImpl.h>
+#include <pbbam/BamTagCodec.h>
+#include <pbbam/Tag.h>
+#include <pbbam/TagCollection.h>
+#include <algorithm>
+#include <iostream>
+#include <iterator>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+namespace tests {
+
+struct Bam1Deleter
+{
+    void operator()(bam1_t* b) {
+        if (b)
+            bam_destroy1(b);
+        b = nullptr;
+    }
+};
+
+static
+BamRecordImpl CreateBamImpl(void)
+{
+    BamRecordImpl bam;
+    bam.Bin(42);
+    bam.Flag(42);
+    bam.InsertSize(42);
+    bam.MapQuality(42);
+    bam.MatePosition(42);
+    bam.MateReferenceId(42);
+    bam.Position(42);
+    bam.ReferenceId(42);
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = static_cast<int32_t>(-42);
+    bam.Tags(tags);
+
+    return bam;
+}
+
+static
+void CheckRawData(const BamRecordImpl& bam)
+{
+    // ensure raw data (lengths at least) matches API-facing data
+
+    const uint32_t expectedNameLength  = bam.Name().size() + 1;
+    const uint32_t expectedNumCigarOps = bam.CigarData().size();
+    const int32_t  expectedSeqLength   = bam.Sequence().length();
+    const size_t   expectedTagsLength  = BamTagCodec::Encode(bam.Tags()).size();
+
+    //  Name        CIGAR         Sequence       Quals      Tags
+    // l_qname + (n_cigar * 4) + (l_qseq+1)/2 + l_qseq + << TAGS >>
+
+    const int expectedTotalDataLength = expectedNameLength +
+                                        (expectedNumCigarOps * 4) +
+                                        (expectedSeqLength+1)/2 +
+                                         expectedSeqLength +
+                                         expectedTagsLength;
+
+    EXPECT_TRUE((bool)bam.d_);
+    EXPECT_EQ(expectedNameLength,      bam.d_->core.l_qname);
+    EXPECT_EQ(expectedNumCigarOps,     bam.d_->core.n_cigar);
+    EXPECT_EQ(expectedSeqLength,       bam.d_->core.l_qseq);
+    EXPECT_EQ(expectedTotalDataLength, bam.d_->l_data);
+}
+
+} // namespace tests
+
+TEST(BamRecordImplCoreTest, RawDataDefaultValues)
+{
+    PBBAM_SHARED_PTR<bam1_t> rawData(bam_init1(), tests::Bam1Deleter());
+    ASSERT_TRUE((bool)rawData);
+
+    // fixed-length (core) data
+    EXPECT_EQ(0, rawData->core.tid);
+    EXPECT_EQ(0, rawData->core.pos);
+    EXPECT_EQ(0, rawData->core.bin);
+    EXPECT_EQ(0, rawData->core.qual);
+    EXPECT_EQ(0, rawData->core.l_qname);
+    EXPECT_EQ(0, rawData->core.flag);
+    EXPECT_EQ(0, rawData->core.n_cigar);
+    EXPECT_EQ(0, rawData->core.l_qseq);
+    EXPECT_EQ(0, rawData->core.mtid);
+    EXPECT_EQ(0, rawData->core.mpos);
+    EXPECT_EQ(0, rawData->core.isize);
+
+    // variable length data
+    EXPECT_EQ(0, rawData->data);
+    EXPECT_EQ(0, rawData->l_data);
+    EXPECT_EQ(0, rawData->m_data);
+}
+
+TEST(BamRecordImplCoreTest, DefaultValues)
+{
+    BamRecordImpl bam;
+
+    // -------------------------------
+    // check raw data
+    // -------------------------------
+
+    const PBBAM_SHARED_PTR<bam1_t> rawData = bam.d_;
+    ASSERT_TRUE((bool)rawData);
+
+    // fixed-length (core) data
+    // (forced init unmapped, with NULL-term as QNAME)
+    EXPECT_EQ(-1, rawData->core.tid);
+    EXPECT_EQ(-1, rawData->core.pos);
+    EXPECT_EQ(0, rawData->core.bin);
+    EXPECT_EQ(255, rawData->core.qual);
+    EXPECT_EQ(1, rawData->core.l_qname);
+    EXPECT_EQ(BamRecordImpl::UNMAPPED, rawData->core.flag);
+    EXPECT_EQ(0, rawData->core.n_cigar);
+    EXPECT_EQ(0, rawData->core.l_qseq);
+    EXPECT_EQ(-1, rawData->core.mtid);
+    EXPECT_EQ(-1, rawData->core.mpos);
+    EXPECT_EQ(0, rawData->core.isize);
+
+    // variable length data
+    EXPECT_TRUE(rawData->data != nullptr);
+    EXPECT_EQ(1, rawData->l_data);
+    EXPECT_EQ((int)0x800, rawData->m_data);  // check this if we change or tune later
+
+    // -------------------------------
+    // check data via API calls
+    // -------------------------------
+
+    EXPECT_EQ(0, bam.Bin());
+    EXPECT_EQ(BamRecordImpl::UNMAPPED, bam.Flag());
+    EXPECT_EQ(0, bam.InsertSize());
+    EXPECT_EQ(255, bam.MapQuality());
+    EXPECT_EQ(-1, bam.MateReferenceId());
+    EXPECT_EQ(-1, bam.MatePosition());
+    EXPECT_EQ(-1, bam.Position());
+    EXPECT_EQ(-1, bam.ReferenceId());
+    EXPECT_EQ(0, bam.Tags().size());
+
+    EXPECT_FALSE(bam.IsDuplicate());
+    EXPECT_FALSE(bam.IsFailedQC());
+    EXPECT_FALSE(bam.IsFirstMate());
+    EXPECT_FALSE(bam.IsMapped());
+    EXPECT_TRUE(bam.IsMateMapped());
+    EXPECT_FALSE(bam.IsMateReverseStrand());
+    EXPECT_FALSE(bam.IsPaired());
+    EXPECT_TRUE(bam.IsPrimaryAlignment());
+    EXPECT_FALSE(bam.IsProperPair());
+    EXPECT_FALSE(bam.IsReverseStrand());
+    EXPECT_FALSE(bam.IsSecondMate());
+    EXPECT_FALSE(bam.IsSupplementaryAlignment());
+
+    const std::string emptyString = "";
+    EXPECT_EQ(emptyString, bam.Name());
+    EXPECT_EQ(emptyString, bam.CigarData().ToStdString());
+    EXPECT_EQ(emptyString, bam.Sequence());
+    EXPECT_EQ(emptyString, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplCoreTest, CoreSetters)
+{
+    BamRecordImpl bam;
+    bam.Bin(42);
+    bam.Flag(42);
+    bam.InsertSize(42);
+    bam.MapQuality(42);
+    bam.MatePosition(42);
+    bam.MateReferenceId(42);
+    bam.Position(42);
+    bam.ReferenceId(42);
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = static_cast<int32_t>(-42);
+    bam.Tags(tags); // (28 bytes encoded)
+
+    // -------------------------------
+    // check raw data
+    // -------------------------------
+
+    const PBBAM_SHARED_PTR<bam1_t> rawData = bam.d_;
+    ASSERT_TRUE((bool)rawData);
+
+    // fixed-length (core) data
+    EXPECT_EQ(42, rawData->core.tid);
+    EXPECT_EQ(42, rawData->core.pos);
+    EXPECT_EQ(42, rawData->core.bin);
+    EXPECT_EQ(42, rawData->core.qual);
+    EXPECT_EQ(1,  rawData->core.l_qname);    // initialized w/ NULL-term
+    EXPECT_EQ(42, rawData->core.flag);
+    EXPECT_EQ(0,  rawData->core.n_cigar);
+    EXPECT_EQ(0,  rawData->core.l_qseq);
+    EXPECT_EQ(42, rawData->core.mtid);
+    EXPECT_EQ(42, rawData->core.mpos);
+    EXPECT_EQ(42, rawData->core.isize);
+
+    // variable length data
+    EXPECT_TRUE(rawData->data != nullptr);
+    EXPECT_EQ(29, rawData->l_data);         // NULL-term qname + tags
+    EXPECT_EQ((int)0x800, rawData->m_data); // check this if we change or tune later
+
+    // -------------------------------
+    // check data via API calls
+    // -------------------------------
+
+    EXPECT_EQ(42, bam.Bin());
+    EXPECT_EQ(42, bam.Flag());
+    EXPECT_EQ(42, bam.InsertSize());
+    EXPECT_EQ(42, bam.MapQuality());
+    EXPECT_EQ(42, bam.MateReferenceId());
+    EXPECT_EQ(42, bam.MatePosition());
+    EXPECT_EQ(42, bam.Position());
+    EXPECT_EQ(42, bam.ReferenceId());
+
+    const TagCollection& fetchedTags = bam.Tags();
+
+    EXPECT_TRUE(fetchedTags.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(std::string("1abc75"), fetchedTags.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags.at("XY").ToInt32());
+    EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags.at("CA").ToUInt8Array());
+}
+
+TEST(BamRecordImplCoreTest, DeepCopyFromRawData)
+{
+    // init raw data
+    PBBAM_SHARED_PTR<bam1_t> rawData(bam_init1(), tests::Bam1Deleter());
+    ASSERT_TRUE((bool)rawData);
+
+    rawData->core.tid = 42;
+    rawData->core.pos = 42;
+    rawData->core.bin = 42;
+    rawData->core.qual = 42;
+    rawData->core.flag = 42;
+    rawData->core.mtid = 42;
+    rawData->core.mpos = 42;
+    rawData->core.isize = 42;
+
+    const int32_t x = 42;
+    char valueBytes[sizeof x];
+    std::copy(static_cast<const char*>(static_cast<const void*>(&x)),
+              static_cast<const char*>(static_cast<const void*>(&x)) + sizeof x,
+              valueBytes);
+    bam_aux_append(rawData.get(), "XY", 'i', sizeof(x), (uint8_t*)&valueBytes[0]);
+
+    EXPECT_EQ(42, rawData->core.tid);
+    EXPECT_EQ(42, rawData->core.pos);
+    EXPECT_EQ(42, rawData->core.bin);
+    EXPECT_EQ(42, rawData->core.qual);
+    EXPECT_EQ(0,  rawData->core.l_qname);
+    EXPECT_EQ(42, rawData->core.flag);
+    EXPECT_EQ(0,  rawData->core.n_cigar);
+    EXPECT_EQ(0,  rawData->core.l_qseq);
+    EXPECT_EQ(42, rawData->core.mtid);
+    EXPECT_EQ(42, rawData->core.mpos);
+    EXPECT_EQ(42, rawData->core.isize);
+    const int32_t fetchedX = bam_aux2i( bam_aux_get(rawData.get(), "XY") );
+    EXPECT_EQ(42, fetchedX);
+
+    // static "ctor"
+    BamRecordImpl bam = BamRecordImpl::FromRawData(rawData);
+
+    // make sure raw data is still valid
+    EXPECT_EQ(42, rawData->core.tid);
+    EXPECT_EQ(42, rawData->core.pos);
+    EXPECT_EQ(42, rawData->core.bin);
+    EXPECT_EQ(42, rawData->core.qual);
+    EXPECT_EQ(0,  rawData->core.l_qname);
+    EXPECT_EQ(42, rawData->core.flag);
+    EXPECT_EQ(0,  rawData->core.n_cigar);
+    EXPECT_EQ(0,  rawData->core.l_qseq);
+    EXPECT_EQ(42, rawData->core.mtid);
+    EXPECT_EQ(42, rawData->core.mpos);
+    EXPECT_EQ(42, rawData->core.isize);
+    EXPECT_TRUE(rawData->data != nullptr);
+    EXPECT_TRUE(0 != rawData->l_data);
+    EXPECT_TRUE(0 != rawData->m_data);
+
+    // check new record
+    EXPECT_EQ(42, bam.Bin());
+    EXPECT_EQ(42, bam.Flag());
+    EXPECT_EQ(42, bam.InsertSize());
+    EXPECT_EQ(42, bam.MapQuality());
+    EXPECT_EQ(42, bam.MateReferenceId());
+    EXPECT_EQ(42, bam.MatePosition());
+    EXPECT_EQ(42, bam.Position());
+    EXPECT_EQ(42, bam.ReferenceId());
+    EXPECT_EQ(x,  bam.Tags()["XY"].ToInt32());
+
+    EXPECT_TRUE(bam.d_->data != nullptr);
+    EXPECT_TRUE(bam.d_->m_data >= (int)0x800); // check this if we change or tune later
+
+    // tweak raw data, make sure we've done a deep copy (so BamRecordImpl isn't changed)
+    rawData->core.pos = 37;
+    EXPECT_EQ(37, rawData->core.pos);
+    EXPECT_EQ(42, bam.Position());
+    EXPECT_EQ(42, bam.d_->core.pos);
+}
+
+TEST(BamRecordImplCoreTest, CopyAssignment)
+{
+    BamRecordImpl bam1;
+    bam1.Bin(42);
+    bam1.Flag(42);
+    bam1.InsertSize(42);
+    bam1.MapQuality(42);
+    bam1.MatePosition(42);
+    bam1.MateReferenceId(42);
+    bam1.Position(42);
+    bam1.ReferenceId(42);
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = static_cast<int32_t>(-42);
+    bam1.Tags(tags);
+
+    BamRecordImpl bam2;
+    bam2 = bam1;
+
+    EXPECT_EQ(42, bam1.Bin());
+    EXPECT_EQ(42, bam1.Flag());
+    EXPECT_EQ(42, bam1.InsertSize());
+    EXPECT_EQ(42, bam1.MapQuality());
+    EXPECT_EQ(42, bam1.MateReferenceId());
+    EXPECT_EQ(42, bam1.MatePosition());
+    EXPECT_EQ(42, bam1.Position());
+    EXPECT_EQ(42, bam1.ReferenceId());
+
+    const TagCollection& fetchedTags1 = bam1.Tags();
+    EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+    EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+    EXPECT_EQ(42, bam2.Bin());
+    EXPECT_EQ(42, bam2.Flag());
+    EXPECT_EQ(42, bam2.InsertSize());
+    EXPECT_EQ(42, bam2.MapQuality());
+    EXPECT_EQ(42, bam2.MateReferenceId());
+    EXPECT_EQ(42, bam2.MatePosition());
+    EXPECT_EQ(42, bam2.Position());
+    EXPECT_EQ(42, bam2.ReferenceId());
+
+    const TagCollection& fetchedTags2 = bam2.Tags();
+    EXPECT_TRUE(fetchedTags2.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(std::string("1abc75"), fetchedTags2.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags2.at("XY").ToInt32());
+    EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags2.at("CA").ToUInt8Array());
+
+    tests::CheckRawData(bam1);
+    tests::CheckRawData(bam2);
+}
+
+TEST(BamRecordImplCoreTest, SelfAssignmentTolerated)
+{
+    BamRecordImpl bam1;
+    bam1.Bin(42);
+    bam1.Flag(42);
+    bam1.InsertSize(42);
+    bam1.MapQuality(42);
+    bam1.MatePosition(42);
+    bam1.MateReferenceId(42);
+    bam1.Position(42);
+    bam1.ReferenceId(42);
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = static_cast<int32_t>(-42);
+    bam1.Tags(tags);
+
+    bam1 = bam1;
+
+    EXPECT_EQ(42, bam1.Bin());
+    EXPECT_EQ(42, bam1.Flag());
+    EXPECT_EQ(42, bam1.InsertSize());
+    EXPECT_EQ(42, bam1.MapQuality());
+    EXPECT_EQ(42, bam1.MateReferenceId());
+    EXPECT_EQ(42, bam1.MatePosition());
+    EXPECT_EQ(42, bam1.Position());
+    EXPECT_EQ(42, bam1.ReferenceId());
+
+    const TagCollection& fetchedTags1 = bam1.Tags();
+    EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+    EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+    tests::CheckRawData(bam1);
+}
+
+TEST(BamRecordImplCoreTest, CopyConstructor)
+{
+    BamRecordImpl bam1;
+    bam1.Bin(42);
+    bam1.Flag(42);
+    bam1.InsertSize(42);
+    bam1.MapQuality(42);
+    bam1.MatePosition(42);
+    bam1.MateReferenceId(42);
+    bam1.Position(42);
+    bam1.ReferenceId(42);
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = static_cast<int32_t>(-42);
+    bam1.Tags(tags);
+
+    BamRecordImpl bam2(bam1);
+
+    EXPECT_EQ(42, bam1.Bin());
+    EXPECT_EQ(42, bam1.Flag());
+    EXPECT_EQ(42, bam1.InsertSize());
+    EXPECT_EQ(42, bam1.MapQuality());
+    EXPECT_EQ(42, bam1.MateReferenceId());
+    EXPECT_EQ(42, bam1.MatePosition());
+    EXPECT_EQ(42, bam1.Position());
+    EXPECT_EQ(42, bam1.ReferenceId());
+
+    const TagCollection& fetchedTags1 = bam1.Tags();
+    EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+    EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+    EXPECT_EQ(42, bam2.Bin());
+    EXPECT_EQ(42, bam2.Flag());
+    EXPECT_EQ(42, bam2.InsertSize());
+    EXPECT_EQ(42, bam2.MapQuality());
+    EXPECT_EQ(42, bam2.MateReferenceId());
+    EXPECT_EQ(42, bam2.MatePosition());
+    EXPECT_EQ(42, bam2.Position());
+    EXPECT_EQ(42, bam2.ReferenceId());
+
+    const TagCollection& fetchedTags2 = bam2.Tags();
+    EXPECT_TRUE(fetchedTags2.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(std::string("1abc75"), fetchedTags2.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags2.at("XY").ToInt32());
+    EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags2.at("CA").ToUInt8Array());
+
+    tests::CheckRawData(bam1);
+    tests::CheckRawData(bam2);
+}
+
+TEST(BamRecordImplCoreTest, CreateRecord_InternalTest)
+{
+    BamRecordImpl bam = tests::CreateBamImpl();
+
+    EXPECT_EQ(42, bam.Bin());
+    EXPECT_EQ(42, bam.Flag());
+    EXPECT_EQ(42, bam.InsertSize());
+    EXPECT_EQ(42, bam.MapQuality());
+    EXPECT_EQ(42, bam.MateReferenceId());
+    EXPECT_EQ(42, bam.MatePosition());
+    EXPECT_EQ(42, bam.Position());
+    EXPECT_EQ(42, bam.ReferenceId());
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = static_cast<int32_t>(-42);
+    bam.Tags(tags);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplCoreTest, MoveAssignment)
+{
+    BamRecordImpl bam;
+    bam = std::move(tests::CreateBamImpl());
+
+    EXPECT_EQ(42, bam.Bin());
+    EXPECT_EQ(42, bam.Flag());
+    EXPECT_EQ(42, bam.InsertSize());
+    EXPECT_EQ(42, bam.MapQuality());
+    EXPECT_EQ(42, bam.MateReferenceId());
+    EXPECT_EQ(42, bam.MatePosition());
+    EXPECT_EQ(42, bam.Position());
+    EXPECT_EQ(42, bam.ReferenceId());
+
+    const TagCollection& fetchedTags1 = bam.Tags();
+    EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+    EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplCoreTest, MoveConstructor)
+{
+    BamRecordImpl bam(std::move(tests::CreateBamImpl()));
+
+    EXPECT_EQ(42, bam.Bin());
+    EXPECT_EQ(42, bam.Flag());
+    EXPECT_EQ(42, bam.InsertSize());
+    EXPECT_EQ(42, bam.MapQuality());
+    EXPECT_EQ(42, bam.MateReferenceId());
+    EXPECT_EQ(42, bam.MatePosition());
+    EXPECT_EQ(42, bam.Position());
+    EXPECT_EQ(42, bam.ReferenceId());
+
+    const TagCollection& fetchedTags1 = bam.Tags();
+    EXPECT_TRUE(fetchedTags1.at("HX").HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(std::string("1abc75"), fetchedTags1.at("HX").ToString());
+    EXPECT_EQ(static_cast<int32_t>(-42), fetchedTags1.at("XY").ToInt32());
+    EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), fetchedTags1.at("CA").ToUInt8Array());
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplCoreTest, AlignmentFlags)
+{
+    // same set of flags, different ways of getting there
+
+    // raw number
+    BamRecordImpl bam1;
+    bam1.Flag(1107);
+
+    // enum values
+    BamRecordImpl bam2;
+    bam2.Flag(BamRecordImpl::DUPLICATE |
+              BamRecordImpl::MATE_1 |
+              BamRecordImpl::REVERSE_STRAND |
+              BamRecordImpl::PROPER_PAIR |
+              BamRecordImpl::PAIRED
+             );
+
+    // convenience calls
+    BamRecordImpl bam3;
+    bam3.SetDuplicate(true);
+    bam3.SetFirstMate(true);
+    bam3.SetReverseStrand(true);
+    bam3.SetMapped(true);
+    bam3.SetMateMapped(true);
+    bam3.SetPaired(true);
+    bam3.SetProperPair(true);
+    bam3.SetPrimaryAlignment(true);
+
+    // make sure all are same
+    EXPECT_EQ(1107, bam1.Flag());
+    EXPECT_EQ(1107, bam2.Flag());
+    EXPECT_EQ(1107, bam3.Flag());
+
+    // check API calls
+    EXPECT_TRUE(bam1.IsPaired());
+    EXPECT_TRUE(bam1.IsProperPair());
+    EXPECT_TRUE(bam1.IsMapped());
+    EXPECT_TRUE(bam1.IsMateMapped());
+    EXPECT_TRUE(bam1.IsReverseStrand());
+    EXPECT_FALSE(bam1.IsMateReverseStrand());
+    EXPECT_TRUE(bam1.IsFirstMate());
+    EXPECT_FALSE(bam1.IsSecondMate());
+    EXPECT_TRUE(bam1.IsPrimaryAlignment());
+    EXPECT_FALSE(bam1.IsFailedQC());
+    EXPECT_TRUE(bam1.IsDuplicate());
+    EXPECT_FALSE(bam1.IsSupplementaryAlignment());
+}
diff --git a/tests/src/test_BamRecordImplTags.cpp b/tests/src/test_BamRecordImplTags.cpp
new file mode 100644
index 0000000..197e11e
--- /dev/null
+++ b/tests/src/test_BamRecordImplTags.cpp
@@ -0,0 +1,214 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecordImpl.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+// NOTE: these tests check "high-level" tag query/manipulation via BamRecordImpl.
+//       For raw Tag/TagCollection tests, see test_Tags.cpp
+//       For encoding tests, see test_BamRecordImplVariableData.cpp
+
+TEST(BamRecordImplTagsTest, HasTagTest)
+{
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Tags(tags);
+
+    EXPECT_TRUE(bam.HasTag("HX"));
+    EXPECT_TRUE(bam.HasTag("CA"));
+    EXPECT_TRUE(bam.HasTag("XY"));
+
+    EXPECT_FALSE(bam.HasTag("zz"));
+    EXPECT_FALSE(bam.HasTag(""));
+    EXPECT_FALSE(bam.HasTag("some_too_long_name"));
+
+    const TagCollection& fetchedTags = bam.Tags();
+    EXPECT_TRUE(fetchedTags.Contains("HX"));
+    EXPECT_TRUE(fetchedTags.Contains("CA"));
+    EXPECT_TRUE(fetchedTags.Contains("XY"));
+    EXPECT_FALSE(fetchedTags.Contains("zz"));
+    EXPECT_FALSE(fetchedTags.Contains(""));
+    EXPECT_FALSE(fetchedTags.Contains("some_too_long_name"));
+}
+
+TEST(BamRecordImplTagsTest, SimpleAddTag)
+{
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.Tags(tags);
+
+    EXPECT_TRUE(bam.HasTag("HX"));
+    EXPECT_TRUE(bam.HasTag("CA"));
+    EXPECT_FALSE(bam.HasTag("XY"));
+
+    bam.AddTag("XY", (int32_t)-42);
+
+    EXPECT_TRUE(bam.HasTag("HX"));
+    EXPECT_TRUE(bam.HasTag("CA"));
+    EXPECT_TRUE(bam.HasTag("XY"));
+
+    const TagCollection& fetchedTags = bam.Tags();
+    EXPECT_TRUE(fetchedTags.Contains("HX"));
+    EXPECT_TRUE(fetchedTags.Contains("CA"));
+    EXPECT_TRUE(fetchedTags.Contains("XY"));
+    EXPECT_FALSE(fetchedTags.Contains("zz"));
+    EXPECT_FALSE(fetchedTags.Contains(""));
+    EXPECT_FALSE(fetchedTags.Contains("some_too_long_name"));
+
+    EXPECT_EQ(-42, fetchedTags.at("XY").ToInt32());
+
+    // fail on invalid adds
+    EXPECT_FALSE(bam.AddTag("", (int32_t)-42));
+    EXPECT_FALSE(bam.AddTag("some_too_long_name", (int32_t)-42));
+    EXPECT_FALSE(bam.AddTag("XY", (int32_t)-42));                   // reject duplicate
+}
+
+TEST(BamRecordImplTagsTest, SimpleRemoveTag)
+{
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Tags(tags);
+
+    EXPECT_TRUE(bam.HasTag("HX"));
+    EXPECT_TRUE(bam.HasTag("CA"));
+    EXPECT_TRUE(bam.HasTag("XY"));
+
+    const bool removedOk = bam.RemoveTag("XY");
+    EXPECT_TRUE(removedOk);
+
+    EXPECT_TRUE(bam.HasTag("HX"));
+    EXPECT_TRUE(bam.HasTag("CA"));
+    EXPECT_FALSE(bam.HasTag("XY"));
+
+    const TagCollection& fetchedTags = bam.Tags();
+    EXPECT_TRUE(fetchedTags.Contains("HX"));
+    EXPECT_TRUE(fetchedTags.Contains("CA"));
+    EXPECT_FALSE(fetchedTags.Contains("XY"));
+    EXPECT_FALSE(fetchedTags.Contains("zz"));
+    EXPECT_FALSE(fetchedTags.Contains(""));
+    EXPECT_FALSE(fetchedTags.Contains("some_too_long_name"));
+
+    // fail on invalid removes
+    EXPECT_FALSE(bam.RemoveTag(""));
+    EXPECT_FALSE(bam.RemoveTag("some_too_long_name"));
+    EXPECT_FALSE(bam.RemoveTag("zz"));                 // reject remove unknown
+}
+
+TEST(BamRecordImplTagsTest, SimpleEditTag)
+{
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Tags(tags);
+
+    EXPECT_TRUE(bam.HasTag("XY"));
+
+    const TagCollection& fetchedTags = bam.Tags();
+    EXPECT_TRUE(fetchedTags.Contains("HX"));
+    EXPECT_TRUE(fetchedTags.Contains("CA"));
+    EXPECT_TRUE(fetchedTags.Contains("XY"));
+    EXPECT_EQ(-42, fetchedTags.at("XY").ToInt32());
+
+    const bool editedOk = bam.EditTag("XY", (int32_t)500);
+    EXPECT_TRUE(editedOk);
+    EXPECT_TRUE(bam.HasTag("XY"));
+
+    const TagCollection& fetchedTags2 = bam.Tags();
+    EXPECT_TRUE(fetchedTags2.Contains("HX"));
+    EXPECT_TRUE(fetchedTags2.Contains("CA"));
+    EXPECT_TRUE(fetchedTags2.Contains("XY"));
+    EXPECT_EQ(500, fetchedTags2.at("XY").ToInt32());
+
+    // fail on invalid edits
+    EXPECT_FALSE(bam.EditTag("", 500));
+    EXPECT_FALSE(bam.EditTag("some_too_long_name", 500));
+    EXPECT_FALSE(bam.EditTag("zz", 500));                 // reject edit unknown
+}
+
+TEST(BamRecordImplTagsTest, SimpleQueryTag)
+{
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Tags(tags);
+
+    EXPECT_TRUE(bam.HasTag("XY"));
+    EXPECT_TRUE(bam.HasTag("CA"));
+    EXPECT_TRUE(bam.HasTag("XY"));
+
+    EXPECT_EQ(string("1abc75"),              bam.TagValue("HX").ToString());
+    EXPECT_EQ(vector<uint8_t>({34, 5, 125}), bam.TagValue("CA").ToUInt8Array());
+    EXPECT_EQ((int32_t)-42,                  bam.TagValue("XY").ToInt32());
+
+    EXPECT_FALSE(bam.HasTag("zz"));
+    EXPECT_FALSE(bam.HasTag(""));
+    EXPECT_FALSE(bam.HasTag("some_too_long_name"));
+
+    EXPECT_EQ(Tag(), bam.TagValue("zz"));
+    EXPECT_EQ(Tag(), bam.TagValue(""));
+    EXPECT_EQ(Tag(), bam.TagValue("some_too_long_name"));
+}
+
diff --git a/tests/src/test_BamRecordImplVariableData.cpp b/tests/src/test_BamRecordImplVariableData.cpp
new file mode 100644
index 0000000..7a63700
--- /dev/null
+++ b/tests/src/test_BamRecordImplVariableData.cpp
@@ -0,0 +1,4542 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecordImpl.h>
+#include <pbbam/BamTagCodec.h>
+#include <pbbam/SamTagCodec.h>
+#include <pbbam/Tag.h>
+#include <pbbam/TagCollection.h>
+#include <algorithm>
+#include <iostream>
+#include <iterator>
+#include <string>
+#include <utility>
+#include <vector>
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+// NOTE: this file has a *TON* of tests. Probably overkill, but I wanted to check
+//       every possible combination of variable data, and then manipulate each
+//       element within each combo to shrink & expand.
+
+namespace tests {
+
+static
+void CheckRawData(const BamRecordImpl& bam)
+{
+    // ensure raw data (lengths at least) matches API-facing data
+
+    const uint32_t expectedNameLength  = bam.Name().size() + 1;
+    const uint32_t expectedNumCigarOps = bam.CigarData().size();
+    const int32_t  expectedSeqLength   = bam.Sequence().length();
+    const size_t   expectedTagsLength  = BamTagCodec::Encode(bam.Tags()).size();
+
+    //  Name        CIGAR         Sequence       Quals      Tags
+    // l_qname + (n_cigar * 4) + (l_qseq+1)/2 + l_qseq + <encoded length>
+
+    const int expectedTotalDataLength = expectedNameLength +
+                                        (expectedNumCigarOps * 4) +
+                                        (expectedSeqLength+1)/2 +
+                                         expectedSeqLength +
+                                         expectedTagsLength;
+
+    EXPECT_EQ(expectedNameLength,      bam.d_->core.l_qname);
+    EXPECT_EQ(expectedNumCigarOps,     bam.d_->core.n_cigar);
+    EXPECT_EQ(expectedSeqLength,       bam.d_->core.l_qseq);
+    EXPECT_EQ(expectedTotalDataLength, bam.d_->l_data);
+}
+
+} // namespace tests
+
+TEST(BamRecordImplVariableDataTest, InitEmpty)
+{
+    BamRecordImpl bam;
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_InitEmpty)
+{
+    BamRecordImpl bam;
+    bam.Tags(TagCollection());
+    EXPECT_EQ(0, bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_InitNormal)
+{
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Tags(tags);
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_ThenOverwriteWithLongerTags)
+{
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Tags(tags);
+    bam.Tags(longerTags);
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_ThenOverwriteWithShorterTags)
+{
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Tags(longerTags);
+    bam.Tags(tags);
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+}
+
+TEST(BamRecordImplVariableDataTest, TagOnly_ThenOverwriteWithEmptyTags)
+{
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Tags(tags);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(0, bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_InitEmpty)
+{
+    BamRecordImpl bam;
+    bam.CigarData(std::string());
+    EXPECT_EQ(0, bam.CigarData().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_InitNormal_CigarObject)
+{
+    Cigar cigar;
+    cigar.push_back(CigarOperation('=', 100));
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(cigar, bam.CigarData());
+    EXPECT_TRUE("100=" == bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_InitNormal_StdString)
+{
+    const std::string cigar = "100=";
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_ThenOverwriteWithLongerCigar)
+{
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.CigarData(longerCigar);
+
+    EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_ThenOverwriteWithShorterCigar)
+{
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    BamRecordImpl bam;
+    bam.CigarData(longerCigar);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarOnly_ThenOverwriteWithEmptyCigar)
+{
+    const std::string cigar = "100=";
+    const std::string empty = "";
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.CigarData(empty);
+
+    EXPECT_EQ(empty, bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_Init_Normal)
+{
+    const std::string cigar = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_Init_EmptyCigar)
+{
+    const std::string cigar = "100=";
+    const std::string empty = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.CigarData(empty);
+
+    EXPECT_EQ(empty, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_Init_EmptyTag)
+{
+    const std::string cigar = "100=";
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+    EXPECT_EQ(0,     bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithLongerCigar)
+{
+    const std::string cigar = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.CigarData(longerCigar);
+
+    EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithShorterCigar)
+{
+    const std::string cigar = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.CigarData(longerCigar);
+    bam.Tags(tags);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithEmptyCigar)
+{
+    const std::string cigar = "100=";
+    const std::string empty = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.CigarData(empty);
+
+    EXPECT_EQ(empty, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithLongerTags)
+{
+    const std::string cigar = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Tags(longerTags);
+
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithShorterTags)
+{
+    const std::string cigar = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.Tags(longerTags);
+    bam.Tags(tags);
+
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, CigarTag_ThenOverwriteWithEmptyTags)
+{
+    const std::string cigar = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+    EXPECT_EQ(0,     bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_Empty)
+{
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(std::string(), std::string());
+    EXPECT_EQ(0, bam.Sequence().size());
+    EXPECT_EQ(0, bam.Qualities().Fastq().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_NormalQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_Preencoded) {
+
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    const size_t encodedLength = static_cast<size_t>((sequence.size()+1)/2);
+    char* encoded = (char*)::calloc(encodedLength, sizeof(char));
+    char* e = encoded;
+
+    uint8_t nucleotideCode;
+    bool useHighWord = true;
+    for (size_t i = 0; i < sequence.size(); ++i) {
+        switch (sequence.at(i)) {
+            case 'A' : nucleotideCode = 1;  break;
+            case 'C' : nucleotideCode = 2;  break;
+            case 'G' : nucleotideCode = 4;  break;
+            case 'T' : nucleotideCode = 8;  break;
+            default:
+                EXPECT_FALSE(true);
+                break;
+        }
+
+        // pack the nucleotide code
+        if (useHighWord) {
+            *e = nucleotideCode << 4;
+            useHighWord = false;
+        } else {
+            *e |= nucleotideCode;
+            ++e;
+            useHighWord = true;
+        }
+    }
+
+    BamRecordImpl bam;
+    bam.SetPreencodedSequenceAndQualities(encoded, sequence.size(), qualities.c_str());
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+
+    if (encoded)
+        free(encoded);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_Init_Preencoded_EmptyQual) {
+
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+
+    const size_t encodedLength = static_cast<size_t>((sequence.size()+1)/2);
+    char* encoded = (char*)::calloc(encodedLength, sizeof(char));
+    char* e = encoded;
+
+    uint8_t nucleotideCode;
+    bool useHighWord = true;
+    for (size_t i = 0; i < sequence.size(); ++i) {
+        switch (sequence.at(i)) {
+            case 'A' : nucleotideCode = 1;  break;
+            case 'C' : nucleotideCode = 2;  break;
+            case 'G' : nucleotideCode = 4;  break;
+            case 'T' : nucleotideCode = 8;  break;
+            default:
+                EXPECT_FALSE(true);
+                break;
+        }
+
+        // pack the nucleotide code
+        if (useHighWord) {
+            *e = nucleotideCode << 4;
+            useHighWord = false;
+        } else {
+            *e |= nucleotideCode;
+            ++e;
+            useHighWord = true;
+        }
+    }
+
+    BamRecordImpl bam;
+    bam.SetPreencodedSequenceAndQualities(encoded, sequence.size(), qualities.c_str());
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+
+    if (encoded)
+        free(encoded);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithLongerSeq_NormalQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithShorterSeq_NormalQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualOnly_ThenOverwriteWithEmptySeq)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string empty     = "";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.SetSequenceAndQualities(empty, empty);
+
+    EXPECT_EQ(empty, bam.Sequence());
+    EXPECT_EQ(empty, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_Init_Normal)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_Init_EmptySeqQual)
+{
+    const std::string sequence  = "";
+    const std::string qualities = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_Init_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_Init_EmptyTag)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(0,         bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithLongerSeq_NormalQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithShorterSeq_NormalQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithEmptySeq)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string empty     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(empty, empty);
+
+    EXPECT_EQ(empty, bam.Sequence());
+    EXPECT_EQ(empty, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithLongerTags)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.Tags(longerTags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithShorterTags)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(longerTags);
+    bam.Tags(tags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualTag_ThenOverwriteWithEmptyTags)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(0,         bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_Init_Normal)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_Init_EmptySeqQual)
+{
+    const std::string sequence  = "";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_Init_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_Init_EmptyCigar)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithLongerSeq_NormalQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithShorterSeq_NormalQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithEmptySeq)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string empty     = "";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(empty, empty);
+
+    EXPECT_EQ(empty, bam.Sequence());
+    EXPECT_EQ(empty, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithLongerCigar)
+{
+    const std::string sequence    = "ACGTACGTACGT";
+    const std::string qualities   = "?]?]?]?]?]?]";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.CigarData(longerCigar);
+
+    EXPECT_EQ(sequence,    bam.Sequence());
+    EXPECT_EQ(qualities,   bam.Qualities().Fastq());
+    EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithShorterCigar)
+{
+    const std::string sequence    = "ACGTACGTACGT";
+    const std::string qualities   = "?]?]?]?]?]?]";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(longerCigar);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigar_ThenOverwriteWithEmptyCigar)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string empty     = "";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.CigarData(empty);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(empty,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_Normal)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_EmptySeqQual)
+{
+    const std::string sequence  = "";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_EmptyCigar)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_Init_EmptyTag)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    EXPECT_EQ(0,         bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithLongerSeq_NormalQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithShorterSeq_NormalQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithEmptySeq)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string empty     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(empty, empty);
+
+    EXPECT_EQ(empty, bam.Sequence());
+    EXPECT_EQ(empty, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithLongerCigar)
+{
+    const std::string sequence    = "ACGTACGTACGT";
+    const std::string qualities   = "?]?]?]?]?]?]";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.CigarData(longerCigar);
+
+    EXPECT_EQ(sequence,    bam.Sequence());
+    EXPECT_EQ(qualities,   bam.Qualities().Fastq());
+    EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithShorterCigar)
+{
+    const std::string sequence    = "ACGTACGTACGT";
+    const std::string qualities   = "?]?]?]?]?]?]";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(longerCigar);
+    bam.Tags(tags);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithEmptyCigar)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string empty     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.CigarData(empty);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(empty,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithLongerTags)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Tags(longerTags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithShorterTags)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(longerTags);
+    bam.Tags(tags);
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, SeqQualCigarTag_ThenOverwriteWithEmptyTags)
+{
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    EXPECT_EQ(0,         bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_InitEmpty)
+{
+    BamRecordImpl bam;
+    bam.Name(std::string());
+    EXPECT_EQ(0, bam.Name().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_InitNormal)
+{
+    const std::string readName = "foo";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+
+    EXPECT_EQ(readName, bam.Name());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_ThenOverwriteWithLongerName)
+{
+    const std::string readName   = "foo";
+    const std::string longerName = "this is a long read name";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Name(longerName);
+
+    EXPECT_EQ(longerName, bam.Name());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_ThenOverwriteWithShorterName)
+{
+    const std::string readName   = "foo";
+    const std::string longerName = "this is a long read name";
+
+    BamRecordImpl bam;
+    bam.Name(longerName);
+    bam.Name(readName);
+
+    EXPECT_EQ(readName, bam.Name());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameOnly_ThenOverwriteWithEmptyName)
+{
+    const std::string readName  = "foo";
+    const std::string emptyName = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Name(emptyName);
+
+    EXPECT_EQ(emptyName, bam.Name());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_Init_Normal)
+{
+    const std::string readName = "foo";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName, bam.Name());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_Init_EmptyName)
+{
+    const std::string readName = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName, bam.Name());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_Init_EmptyTag)
+{
+    const std::string readName = "foo";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(0,        bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithLongerName)
+{
+    const std::string readName   = "foo";
+    const std::string longerName = "this is a long read name";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Tags(tags);
+    bam.Name(longerName);
+
+    EXPECT_EQ(longerName, bam.Name());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithShorterName)
+{
+    const std::string readName   = "foo";
+    const std::string longerName = "this is a long read name";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(longerName);
+    bam.Tags(tags);
+    bam.Name(readName);
+
+    EXPECT_EQ(readName, bam.Name());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithEmptyName)
+{
+    const std::string readName = "foo";
+    const std::string empty    = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Tags(tags);
+    bam.Name(empty);
+
+    EXPECT_EQ(empty, bam.Name());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithLongerTags)
+{
+    const std::string readName = "foo";
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Tags(tags);
+    bam.Tags(longerTags);
+
+    EXPECT_EQ(readName, bam.Name());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithShorterTags)
+{
+    const std::string readName = "foo";
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Tags(longerTags);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName, bam.Name());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameTag_ThenOverwriteWithEmptyTags)
+{
+    const std::string readName = "foo";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.Tags(tags);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(0,        bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_Init_Normal)
+{
+    const std::string readName = "foo";
+    const std::string cigar   = "100=";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_Init_EmptyName)
+{
+    const std::string readName = "";
+    const std::string cigar    = "100=";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_Init_EmptyCigar)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithLongerName)
+{
+    const std::string readName   = "foo";
+    const std::string cigar      = "100=";
+    const std::string longerName = "this is a long read name";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Name(longerName);
+
+    EXPECT_EQ(longerName, bam.Name());
+    EXPECT_EQ(cigar,      bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithShorterName)
+{
+    const std::string readName   = "foo";
+    const std::string cigar      = "100=";
+    const std::string longerName = "this is a long read name";
+
+    BamRecordImpl bam;
+    bam.Name(longerName);
+    bam.CigarData(cigar);
+    bam.Name(readName);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithEmptyName)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "100=";
+    const std::string empty    = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Name(empty);
+
+    EXPECT_EQ(empty, bam.Name());
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithLongerCigar)
+{
+    const std::string readName    = "foo";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.CigarData(longerCigar);
+
+    EXPECT_EQ(readName,    bam.Name());
+    EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithShorterCigar)
+{
+    const std::string readName    = "foo";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(longerCigar);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigar_ThenOverwriteWithEmptyCigar)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "100=";
+    const std::string empty    = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.CigarData(empty);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(empty,    bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_Init_Normal)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_Init_EmptyName)
+{
+    const std::string readName = "";
+    const std::string cigar    = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_Init_EmptyCigar)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_Init_EmptyTag)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "100=";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+    EXPECT_EQ(0,        bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithLongerName)
+{
+    const std::string readName   = "foo";
+    const std::string cigar      = "100=";
+    const std::string longerName = "this is a long read name";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Name(longerName);
+
+    EXPECT_EQ(longerName, bam.Name());
+    EXPECT_EQ(cigar,      bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithShorterName)
+{
+    const std::string readName   = "foo";
+    const std::string cigar      = "100=";
+    const std::string longerName = "this is a long read name";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(longerName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Name(readName);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithEmptyName)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "100=";
+    const std::string empty    = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Name(empty);
+
+    EXPECT_EQ(empty, bam.Name());
+    EXPECT_EQ(cigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithLongerCigar)
+{
+    const std::string readName    = "foo";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.CigarData(longerCigar);
+
+    EXPECT_EQ(readName,    bam.Name());
+    EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithShorterCigar)
+{
+    const std::string readName    = "foo";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(longerCigar);
+    bam.Tags(tags);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithEmptyCigar)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "100=";
+    const std::string empty    = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.CigarData(empty);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(empty,    bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithLongerTags)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "100=";
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Tags(longerTags);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithShorterTags)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "100=";
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(longerTags);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameCigarTag_ThenOverwriteWithEmptyTags)
+{
+    const std::string readName = "foo";
+    const std::string cigar    = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+    EXPECT_EQ(0,        bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_Init_Normal)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_Init_EmptySeqQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "";
+    const std::string qualities = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_Init_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithLongerName)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string longerName = "this is a long read name";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Name(longerName);
+
+    EXPECT_EQ(longerName, bam.Name());
+    EXPECT_EQ(sequence,   bam.Sequence());
+    EXPECT_EQ(qualities,  bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithShorterName)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string longerName = "this is a long read name";
+
+    BamRecordImpl bam;
+    bam.Name(longerName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Name(readName);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithEmptyName)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string empty     = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Name(empty);
+
+    EXPECT_EQ(empty,     bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithLongerSeq_NormalQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithShorterSeq_NormalQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQual_ThenOverwriteWithEmptySeq)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string empty     = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.SetSequenceAndQualities(empty, empty);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(empty,    bam.Sequence());
+    EXPECT_EQ(empty,    bam.Qualities().Fastq());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_Normal)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_EmptyName)
+{
+    const std::string readName  = "";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_EmptySeqQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "";
+    const std::string qualities = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_Init_EmptyTag)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(0,         bam.Tags().size());
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithLongerName)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string longerName = "this is a long read name";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.Name(longerName);
+
+    EXPECT_EQ(longerName, bam.Name());
+    EXPECT_EQ(sequence,   bam.Sequence());
+    EXPECT_EQ(qualities,  bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithShorterName)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string longerName = "this is a long read name";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(longerName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.Name(readName);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithEmptyName)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string empty     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.Name(empty);
+
+    EXPECT_EQ(empty,     bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithLongerSeq_NormalQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithShorterSeq_NormalQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithEmptySeq)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string empty     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(empty, empty);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(empty,    bam.Sequence());
+    EXPECT_EQ(empty,    bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithLongerTags)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.Tags(longerTags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithShorterTags)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(longerTags);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualTag_ThenOverwriteWithEmptyTags)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.Tags(tags);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(0,         bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_Normal)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_EmptyName)
+{
+    const std::string readName  = "";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_EmptySeqQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_Init_EmptyCigar)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithLongerName)
+{
+    const std::string readName   = "foo";
+    const std::string sequence   = "ACGTACGTACGT";
+    const std::string qualities  = "?]?]?]?]?]?]";
+    const std::string cigar      = "100=";
+    const std::string longerName = "this is a long read name";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Name(longerName);
+
+    EXPECT_EQ(longerName,  bam.Name());
+    EXPECT_EQ(sequence,    bam.Sequence());
+    EXPECT_EQ(qualities,   bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,       bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithShorterName)
+{
+    const std::string readName   = "foo";
+    const std::string sequence   = "ACGTACGTACGT";
+    const std::string qualities  = "?]?]?]?]?]?]";
+    const std::string cigar      = "100=";
+    const std::string longerName = "this is a long read name";
+
+    BamRecordImpl bam;
+    bam.Name(longerName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Name(readName);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,    bam.Sequence());
+    EXPECT_EQ(qualities,   bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,       bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithEmptyName)
+{
+    const std::string readName   = "foo";
+    const std::string sequence   = "ACGTACGTACGT";
+    const std::string qualities  = "?]?]?]?]?]?]";
+    const std::string cigar      = "100=";
+    const std::string empty      = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Name(empty);
+
+    EXPECT_EQ(empty,       bam.Name());
+    EXPECT_EQ(sequence,    bam.Sequence());
+    EXPECT_EQ(qualities,   bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,       bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithLongerSeq_NormalQual)
+{
+    const std::string readName   = "foo";
+    const std::string sequence   = "ACGTACGTACGT";
+    const std::string qualities  = "?]?]?]?]?]?]";
+    const std::string cigar      = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+    const std::string readName   = "foo";
+    const std::string sequence   = "ACGTACGTACGT";
+    const std::string qualities  = "";
+    const std::string cigar      = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithShorterSeq_NormalQual)
+{
+    const std::string readName   = "foo";
+    const std::string sequence   = "ACGTACGTACGT";
+    const std::string qualities  = "?]?]?]?]?]?]";
+    const std::string cigar      = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+    const std::string readName   = "foo";
+    const std::string sequence   = "ACGTACGTACGT";
+    const std::string qualities  = "?]?]?]?]?]?]";
+    const std::string cigar      = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithEmptySeq)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string empty     = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.SetSequenceAndQualities(empty, empty);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(empty,    bam.Sequence());
+    EXPECT_EQ(empty,    bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithLongerCigar)
+{
+    const std::string readName    = "foo";
+    const std::string sequence    = "ACGTACGTACGT";
+    const std::string qualities   = "?]?]?]?]?]?]";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.CigarData(longerCigar);
+
+    EXPECT_EQ(readName,    bam.Name());
+    EXPECT_EQ(sequence,    bam.Sequence());
+    EXPECT_EQ(qualities,   bam.Qualities().Fastq());
+    EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithShorterCigar)
+{
+    const std::string readName    = "foo";
+    const std::string sequence    = "ACGTACGTACGT";
+    const std::string qualities   = "?]?]?]?]?]?]";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(longerCigar);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigar_ThenOverwriteWithEmptyCigar)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string empty     = "";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.CigarData(empty);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(empty,     bam.CigarData().ToStdString());
+    tests::CheckRawData(bam);
+}
+
+// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_Normal)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptyName)
+{
+    const std::string readName  = "";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptySeqQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptyCigar)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_Init_EmptyTag)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    EXPECT_EQ(0,         bam.Tags().size());
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerName)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string longerName = "this is a long read name";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Name(longerName);
+
+    EXPECT_EQ(longerName, bam.Name());
+    EXPECT_EQ(sequence,   bam.Sequence());
+    EXPECT_EQ(qualities,  bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,      bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterName)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string longerName = "this is a long read name";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(longerName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Name(readName);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithEmptyName)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string empty     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Name(empty);
+
+    EXPECT_EQ(empty,     bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerSeq_NormalQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerSeq_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(sequence, qualities);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterSeq_NormalQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "?]?]";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterSeq_EmptyQual)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string shortSeq  = "ACGT";
+    const std::string shortQual = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(shortSeq, shortQual);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(shortSeq,  bam.Sequence());
+    EXPECT_EQ(shortQual, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithEmptySeq)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string empty     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.SetSequenceAndQualities(empty, empty);
+
+    EXPECT_EQ(readName, bam.Name());
+    EXPECT_EQ(empty,    bam.Sequence());
+    EXPECT_EQ(empty,    bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,    bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerCigar)
+{
+    const std::string readName    = "foo";
+    const std::string sequence    = "ACGTACGTACGT";
+    const std::string qualities   = "?]?]?]?]?]?]";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.CigarData(longerCigar);
+
+    EXPECT_EQ(readName,    bam.Name());
+    EXPECT_EQ(sequence,    bam.Sequence());
+    EXPECT_EQ(qualities,   bam.Qualities().Fastq());
+    EXPECT_EQ(longerCigar, bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterCigar)
+{
+    const std::string readName    = "foo";
+    const std::string sequence    = "ACGTACGTACGT";
+    const std::string qualities   = "?]?]?]?]?]?]";
+    const std::string cigar       = "100=";
+    const std::string longerCigar = "100=10D100=10I100X";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(longerCigar);
+    bam.Tags(tags);
+    bam.CigarData(cigar);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithEmptyCigar)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+    const std::string empty     = "";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.CigarData(empty);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(empty,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithLongerTags)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Tags(longerTags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithShorterTags)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    TagCollection longerTags;
+    longerTags["HX"] = std::string("1abc75");
+    longerTags["HX"].Modifier(TagModifier::HEX_STRING);
+    longerTags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    longerTags["XY"] = (int32_t)-42;
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(longerTags);
+    bam.Tags(tags);
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+
+    std::string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+
+    const std::string sam = SamTagCodec::Encode(bam.Tags());
+    EXPECT_EQ(expected, sam);
+
+    tests::CheckRawData(bam);
+}
+
+TEST(BamRecordImplVariableDataTest, NameSeqQualCigarTag_ThenOverwriteWithEmptyTags)
+{
+    const std::string readName  = "foo";
+    const std::string sequence  = "ACGTACGTACGT";
+    const std::string qualities = "?]?]?]?]?]?]";
+    const std::string cigar     = "100=";
+
+    TagCollection tags;
+    tags["HX"] = std::string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = std::vector<uint8_t>({34, 5, 125});
+    tags["XY"] = (int32_t)-42;
+
+    BamRecordImpl bam;
+    bam.Name(readName);
+    bam.SetSequenceAndQualities(sequence, qualities);
+    bam.CigarData(cigar);
+    bam.Tags(tags);
+    bam.Tags(TagCollection());
+
+    EXPECT_EQ(readName,  bam.Name());
+    EXPECT_EQ(sequence,  bam.Sequence());
+    EXPECT_EQ(qualities, bam.Qualities().Fastq());
+    EXPECT_EQ(cigar,     bam.CigarData().ToStdString());
+    EXPECT_EQ(0,         bam.Tags().size());
+    tests::CheckRawData(bam);
+}
diff --git a/tests/src/test_BamRecordMapping.cpp b/tests/src/test_BamRecordMapping.cpp
new file mode 100644
index 0000000..fd79367
--- /dev/null
+++ b/tests/src/test_BamRecordMapping.cpp
@@ -0,0 +1,541 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/BamRecord.h>
+#include <pbbam/BamTagCodec.h>
+#include <chrono>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+typedef vector<uint16_t> f_data;
+
+namespace tests {
+
+static
+BamRecord MakeRecord(const Position qStart,
+                     const Position qEnd,
+                     const string& seq,
+                     const string& quals,
+                     const string& tagBases,
+                     const string& tagQuals,
+                     const f_data& frames)
+{
+    BamRecordImpl impl;
+    impl.SetSequenceAndQualities(seq, quals);
+
+    TagCollection tags;
+    tags["qs"] = qStart;
+    tags["qe"] = qEnd;
+    tags["ip"] = frames;
+    tags["pw"] = frames;
+    tags["dt"] = tagBases;
+    tags["st"] = tagBases;
+    tags["dq"] = tagQuals;
+    tags["iq"] = tagQuals;
+    tags["mq"] = tagQuals;
+    tags["sq"] = tagQuals;
+    tags["pq"] = tagQuals;
+    tags["pv"] = tagQuals;
+    impl.Tags(tags);
+
+    return BamRecord(std::move(impl));
+}
+
+} // namespace tests
+
+TEST(BamRecordMappingTest, BasicMap)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 510;
+    const string seq      = "AACCGTTAGC";
+    const string quals    = "?]?]?]?]?*";
+    const string tagBases = "AACCGTTAGC";
+    const string tagQuals = "?]?]?]?]?*";
+    const f_data frames   = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+    const uint8_t mapQual = 80;
+
+    const string seq_rev   = "GCTAACGGTT";
+    const string quals_rev = "*?]?]?]?]?";
+    const string tagBases_rev = seq_rev;
+    const string tagQuals_rev = quals_rev;
+    const f_data frames_rev = { 20, 30, 10, 40, 40, 30, 20, 20, 10, 10 };
+
+    const string s1_cigar = "10=";
+    const string s2_cigar = "5=3D5=";
+    const string s3_cigar = "4=1D2I2D4=";
+
+    BamRecord s1 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s2 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s3 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s1_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s2_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s3_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+
+    s1.Map(0, 100, Strand::FORWARD, s1_cigar, mapQual);
+    s2.Map(0, 100, Strand::FORWARD, s2_cigar, mapQual);
+    s3.Map(0, 100, Strand::FORWARD, s3_cigar, mapQual);
+    s1_rev.Map(0, 100, Strand::REVERSE, s1_cigar, mapQual);
+    s2_rev.Map(0, 100, Strand::REVERSE, s2_cigar, mapQual);
+    s3_rev.Map(0, 100, Strand::REVERSE, s3_cigar, mapQual);
+
+    // s1 - FORWARD
+    EXPECT_TRUE(s1.IsMapped());
+    EXPECT_EQ(0, s1.ReferenceId());
+    EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+    EXPECT_EQ(mapQual, s1.MapQuality());
+
+    EXPECT_EQ(qStart, s1.QueryStart());
+    EXPECT_EQ(qEnd,   s1.QueryEnd());
+    EXPECT_EQ(500, s1.AlignedStart());
+    EXPECT_EQ(510, s1.AlignedEnd());         // 500 + 10=
+    EXPECT_EQ(100, s1.ReferenceStart());
+    EXPECT_EQ(110, s1.ReferenceEnd());       // 100 + 10=
+
+    EXPECT_EQ(seq,      s1.Sequence());
+    EXPECT_EQ(quals,    s1.Qualities().Fastq());
+    EXPECT_EQ(tagBases, s1.DeletionTag());
+    EXPECT_EQ(tagQuals, s1.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, s1.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, s1.AltLabelQV().Fastq());
+    EXPECT_EQ(frames,   s1.IPD().Data());
+
+    // s1 - REVERSE
+    EXPECT_TRUE(s1_rev.IsMapped());
+    EXPECT_EQ(0, s1_rev.ReferenceId());
+    EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+    EXPECT_EQ(mapQual, s1_rev.MapQuality());
+
+    EXPECT_EQ(qStart, s1_rev.QueryStart());
+    EXPECT_EQ(qEnd,   s1_rev.QueryEnd());
+    EXPECT_EQ(500, s1_rev.AlignedStart());
+    EXPECT_EQ(510, s1_rev.AlignedEnd());         // 500 + 10=
+    EXPECT_EQ(100, s1_rev.ReferenceStart());
+    EXPECT_EQ(110, s1_rev.ReferenceEnd());       // 100 + 10=
+
+    // - native
+    EXPECT_EQ(seq,      s1_rev.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(quals,    s1_rev.Qualities(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagBases, s1_rev.DeletionTag(Orientation::NATIVE));
+    EXPECT_EQ(tagQuals, s1_rev.DeletionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s1_rev.LabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s1_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(frames,   s1_rev.IPD(Orientation::NATIVE).Data());
+
+    // - genomic
+    EXPECT_EQ(seq_rev,      s1_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_rev,    s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_rev, s1_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_rev, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_rev,   s1_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s2 - FORWARD
+    EXPECT_TRUE(s2.IsMapped());
+    EXPECT_EQ(0, s2.ReferenceId());
+    EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+    EXPECT_EQ(mapQual, s2.MapQuality());
+
+    EXPECT_EQ(qStart, s2.QueryStart());
+    EXPECT_EQ(qEnd,   s2.QueryEnd());
+    EXPECT_EQ(500, s2.AlignedStart());
+    EXPECT_EQ(510, s2.AlignedEnd());         // 500 + 10=
+    EXPECT_EQ(100, s2.ReferenceStart());
+    EXPECT_EQ(113, s2.ReferenceEnd());      // 100 + 10= + 3D
+
+    EXPECT_EQ(seq,      s2.Sequence());
+    EXPECT_EQ(quals,    s2.Qualities().Fastq());
+    EXPECT_EQ(tagBases, s2.DeletionTag());
+    EXPECT_EQ(tagQuals, s2.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, s2.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, s2.AltLabelQV().Fastq());
+    EXPECT_EQ(frames,   s2.IPD().Data());
+
+    // s2 - REVERSE
+    EXPECT_TRUE(s2_rev.IsMapped());
+    EXPECT_EQ(0, s2_rev.ReferenceId());
+    EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+    EXPECT_EQ(mapQual, s2_rev.MapQuality());
+
+    EXPECT_EQ(qStart, s2_rev.QueryStart());
+    EXPECT_EQ(qEnd,   s2_rev.QueryEnd());
+    EXPECT_EQ(500, s2_rev.AlignedStart());
+    EXPECT_EQ(510, s2_rev.AlignedEnd());         // 500 + 10=
+    EXPECT_EQ(100, s2_rev.ReferenceStart());
+    EXPECT_EQ(113, s2_rev.ReferenceEnd());      // 100 + 10= + 3D
+
+    // - native
+    EXPECT_EQ(seq,      s2_rev.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(quals,    s2_rev.Qualities(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagBases, s2_rev.DeletionTag(Orientation::NATIVE));
+    EXPECT_EQ(tagQuals, s2_rev.DeletionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s2_rev.LabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s2_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(frames,   s2_rev.IPD(Orientation::NATIVE).Data());
+
+    // - genomic
+    EXPECT_EQ(seq_rev,      s2_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_rev,    s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_rev, s2_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_rev, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_rev,   s2_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s3 - FORWARD
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(0, s3.ReferenceId());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(mapQual, s3.MapQuality());
+
+    EXPECT_EQ(qStart, s3.QueryStart());
+    EXPECT_EQ(qEnd,   s3.QueryEnd());
+    EXPECT_EQ(500, s3.AlignedStart());
+    EXPECT_EQ(510, s3.AlignedEnd());         // 500 + 8= + 2I
+    EXPECT_EQ(100, s3.ReferenceStart());
+    EXPECT_EQ(111, s3.ReferenceEnd());      // 100 + 8= + 3D
+
+    EXPECT_EQ(seq,      s3.Sequence());
+    EXPECT_EQ(quals,    s3.Qualities().Fastq());
+    EXPECT_EQ(tagBases, s3.DeletionTag());
+    EXPECT_EQ(tagQuals, s3.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, s3.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, s3.AltLabelQV().Fastq());
+    EXPECT_EQ(frames,   s3.IPD().Data());
+
+    // s3 - REVERSE
+    EXPECT_TRUE(s3_rev.IsMapped());
+    EXPECT_EQ(0, s3_rev.ReferenceId());
+    EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+    EXPECT_EQ(mapQual, s3_rev.MapQuality());
+
+    EXPECT_EQ(qStart, s3_rev.QueryStart());
+    EXPECT_EQ(qEnd,   s3_rev.QueryEnd());
+    EXPECT_EQ(500, s3_rev.AlignedStart());
+    EXPECT_EQ(510, s3_rev.AlignedEnd());         // 500 + 8= + 2I
+    EXPECT_EQ(100, s3_rev.ReferenceStart());
+    EXPECT_EQ(111, s3_rev.ReferenceEnd());      // 100 + 8= + 3D
+
+    // - native
+    EXPECT_EQ(seq,      s3_rev.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(quals,    s3_rev.Qualities(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagBases, s3_rev.DeletionTag(Orientation::NATIVE));
+    EXPECT_EQ(tagQuals, s3_rev.DeletionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s3_rev.LabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s3_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(frames,   s3_rev.IPD(Orientation::NATIVE).Data());
+
+    // - genomic
+    EXPECT_EQ(seq_rev,      s3_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_rev,    s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_rev, s3_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_rev, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_rev,   s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordMappingTest, SoftClipMapping)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 515;
+    const string seq      = "TTAACCGTTAGCAAA";
+    const string quals    = "--?]?]?]?]?*+++";
+    const string tagBases = "TTAACCGTTAGCAAA";
+    const string tagQuals = "--?]?]?]?]?*+++";
+    const f_data frames   = { 40, 40, 10, 10, 20, 20, 30, 40, 40, 10, 30, 20, 10, 10, 10 };
+    const uint8_t mapQual = 80;
+
+    const string seq_rev   = "TTTGCTAACGGTTAA";
+    const string quals_rev = "+++*?]?]?]?]?--";
+    const string tagBases_rev = seq_rev;
+    const string tagQuals_rev = quals_rev;
+    const f_data frames_rev = { 10, 10, 10, 20, 30, 10, 40, 40, 30, 20, 20, 10, 10, 40, 40 };
+
+    const string s1_cigar = "2S10=3S";
+    const string s2_cigar = "2S5=3D5=3S";
+    const string s3_cigar = "2S4=1D2I2D4=3S";
+
+    BamRecord s1 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s2 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s3 = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s1_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s2_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    BamRecord s3_rev = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+
+    s1.Map(0, 100, Strand::FORWARD, s1_cigar, mapQual);
+    s2.Map(0, 100, Strand::FORWARD, s2_cigar, mapQual);
+    s3.Map(0, 100, Strand::FORWARD, s3_cigar, mapQual);
+    s1_rev.Map(0, 100, Strand::REVERSE, s1_cigar, mapQual);
+    s2_rev.Map(0, 100, Strand::REVERSE, s2_cigar, mapQual);
+    s3_rev.Map(0, 100, Strand::REVERSE, s3_cigar, mapQual);
+
+    // s1 - FORWARD
+    EXPECT_TRUE(s1.IsMapped());
+    EXPECT_EQ(0, s1.ReferenceId());
+    EXPECT_EQ(Strand::FORWARD, s1.AlignedStrand());
+    EXPECT_EQ(mapQual, s1.MapQuality());
+
+    EXPECT_EQ(qStart, s1.QueryStart());      // 500
+    EXPECT_EQ(qEnd,   s1.QueryEnd());        // QStart + seqLength
+    EXPECT_EQ(502, s1.AlignedStart());       // QStart + 2S
+    EXPECT_EQ(512, s1.AlignedEnd());         // AStart + 10=
+    EXPECT_EQ(100, s1.ReferenceStart());     // 100
+    EXPECT_EQ(110, s1.ReferenceEnd());       // RefStart + 10=
+
+    EXPECT_EQ(seq,      s1.Sequence());
+    EXPECT_EQ(quals,    s1.Qualities().Fastq());
+    EXPECT_EQ(tagBases, s1.DeletionTag());
+    EXPECT_EQ(tagQuals, s1.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, s1.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, s1.AltLabelQV().Fastq());
+    EXPECT_EQ(frames,   s1.IPD().Data());
+
+    // s1 - REVERSE
+    EXPECT_TRUE(s1_rev.IsMapped());
+    EXPECT_EQ(0, s1_rev.ReferenceId());
+    EXPECT_EQ(Strand::REVERSE, s1_rev.AlignedStrand());
+    EXPECT_EQ(mapQual, s1_rev.MapQuality());
+
+    EXPECT_EQ(qStart, s1_rev.QueryStart());      // 500
+    EXPECT_EQ(qEnd,   s1_rev.QueryEnd());        // QStart + seqLength
+    EXPECT_EQ(503, s1_rev.AlignedStart());       // QStart + 3S
+    EXPECT_EQ(513, s1_rev.AlignedEnd());         // AStart + 10=
+    EXPECT_EQ(100, s1_rev.ReferenceStart());     // 100
+    EXPECT_EQ(110, s1_rev.ReferenceEnd());       // RefStart + 10=
+
+    // - native
+    EXPECT_EQ(seq,      s1_rev.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(quals,    s1_rev.Qualities(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagBases, s1_rev.DeletionTag(Orientation::NATIVE));
+    EXPECT_EQ(tagQuals, s1_rev.DeletionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s1_rev.LabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s1_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(frames,   s1_rev.IPD(Orientation::NATIVE).Data());
+
+    // - genomic
+    EXPECT_EQ(seq_rev,      s1_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_rev,    s1_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_rev, s1_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_rev, s1_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s1_rev.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s1_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_rev,   s1_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s2 - FORWARD
+    EXPECT_TRUE(s2.IsMapped());
+    EXPECT_EQ(0, s2.ReferenceId());
+    EXPECT_EQ(Strand::FORWARD, s2.AlignedStrand());
+    EXPECT_EQ(mapQual, s2.MapQuality());
+
+    EXPECT_EQ(qStart, s2.QueryStart());      // 500
+    EXPECT_EQ(qEnd,   s2.QueryEnd());        // QStart + seqLength
+    EXPECT_EQ(502, s2.AlignedStart());       // QStart + 2S
+    EXPECT_EQ(512, s2.AlignedEnd());         // AStart + 10=
+    EXPECT_EQ(100, s2.ReferenceStart());     // 100
+    EXPECT_EQ(113, s2.ReferenceEnd());       // RefStart + 10= + 3D
+
+    EXPECT_EQ(seq,      s2.Sequence());
+    EXPECT_EQ(quals,    s2.Qualities().Fastq());
+    EXPECT_EQ(tagBases, s2.DeletionTag());
+    EXPECT_EQ(tagQuals, s2.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, s2.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, s2.AltLabelQV().Fastq());
+    EXPECT_EQ(frames,   s2.IPD().Data());
+
+    // s2 - REVERSE
+    EXPECT_TRUE(s2_rev.IsMapped());
+    EXPECT_EQ(0, s2_rev.ReferenceId());
+    EXPECT_EQ(Strand::REVERSE, s2_rev.AlignedStrand());
+    EXPECT_EQ(mapQual, s2_rev.MapQuality());
+
+    EXPECT_EQ(qStart, s2_rev.QueryStart());      // 500
+    EXPECT_EQ(qEnd,   s2_rev.QueryEnd());        // QStart + seqLength
+    EXPECT_EQ(503, s2_rev.AlignedStart());       // QStart + 3S
+    EXPECT_EQ(513, s2_rev.AlignedEnd());         // AStart + 10=
+    EXPECT_EQ(100, s2_rev.ReferenceStart());     // 100
+    EXPECT_EQ(113, s2_rev.ReferenceEnd());       // RefStart + 10= + 3D
+
+    // - native
+    EXPECT_EQ(seq,      s2_rev.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(quals,    s2_rev.Qualities(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagBases, s2_rev.DeletionTag(Orientation::NATIVE));
+    EXPECT_EQ(tagQuals, s2_rev.DeletionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s2_rev.LabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s2_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(frames,   s2_rev.IPD(Orientation::NATIVE).Data());
+
+    // - genomic
+    EXPECT_EQ(seq_rev,      s2_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_rev,    s2_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_rev, s2_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_rev, s2_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s2_rev.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s2_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_rev,   s2_rev.IPD(Orientation::GENOMIC).Data());
+
+    // s3 - FORWARD
+    EXPECT_TRUE(s3.IsMapped());
+    EXPECT_EQ(0, s3.ReferenceId());
+    EXPECT_EQ(Strand::FORWARD, s3.AlignedStrand());
+    EXPECT_EQ(mapQual, s3.MapQuality());
+
+    EXPECT_EQ(qStart, s3.QueryStart());      // 500
+    EXPECT_EQ(qEnd,   s3.QueryEnd());        // QStart + seqLength
+    EXPECT_EQ(502, s3.AlignedStart());       // QStart + 2S
+    EXPECT_EQ(512, s3.AlignedEnd());         // AStart + 8= + 2I
+    EXPECT_EQ(100, s3.ReferenceStart());     // 100
+    EXPECT_EQ(111, s3.ReferenceEnd());       // RefStart + 8= + 3D
+
+    EXPECT_EQ(seq,      s3.Sequence());
+    EXPECT_EQ(quals,    s3.Qualities().Fastq());
+    EXPECT_EQ(tagBases, s3.DeletionTag());
+    EXPECT_EQ(tagQuals, s3.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, s3.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, s3.AltLabelQV().Fastq());
+    EXPECT_EQ(frames,   s3.IPD().Data());
+
+    // s3 - REVERSE
+    EXPECT_TRUE(s3_rev.IsMapped());
+    EXPECT_EQ(0, s3_rev.ReferenceId());
+    EXPECT_EQ(Strand::REVERSE, s3_rev.AlignedStrand());
+    EXPECT_EQ(mapQual, s3_rev.MapQuality());
+
+    EXPECT_EQ(qStart, s3_rev.QueryStart());      // 500
+    EXPECT_EQ(qEnd,   s3_rev.QueryEnd());        // QStart + seqLength
+    EXPECT_EQ(503, s3_rev.AlignedStart());       // QStart + 3S
+    EXPECT_EQ(513, s3_rev.AlignedEnd());         // AStart + 8= + 2I
+    EXPECT_EQ(100, s3_rev.ReferenceStart());     // 100
+    EXPECT_EQ(111, s3_rev.ReferenceEnd());       // RefStart + 8= + 3D
+
+    // - native
+    EXPECT_EQ(seq,      s3_rev.Sequence(Orientation::NATIVE));
+    EXPECT_EQ(quals,    s3_rev.Qualities(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagBases, s3_rev.DeletionTag(Orientation::NATIVE));
+    EXPECT_EQ(tagQuals, s3_rev.DeletionQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s3_rev.LabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(tagQuals, s3_rev.AltLabelQV(Orientation::NATIVE).Fastq());
+    EXPECT_EQ(frames,   s3_rev.IPD(Orientation::NATIVE).Data());
+
+    // - genomic
+    EXPECT_EQ(seq_rev,      s3_rev.Sequence(Orientation::GENOMIC));
+    EXPECT_EQ(quals_rev,    s3_rev.Qualities(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagBases_rev, s3_rev.DeletionTag(Orientation::GENOMIC));
+    EXPECT_EQ(tagQuals_rev, s3_rev.DeletionQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s3_rev.LabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(tagQuals_rev, s3_rev.AltLabelQV(Orientation::GENOMIC).Fastq());
+    EXPECT_EQ(frames_rev,   s3_rev.IPD(Orientation::GENOMIC).Data());
+}
+
+TEST(BamRecordMappingTest, MappedCopy)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 510;
+    const string seq      = "AACCGTTAGC";
+    const string quals    = "?]?]?]?]?*";
+    const string tagBases = "AACCGTTAGC";
+    const string tagQuals = "?]?]?]?]?*";
+    const f_data frames   = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+    const uint8_t mapQual = 80;
+    const string cigar    = "4=1D2I2D4=";
+
+    const BamRecord orig = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    const BamRecord mapped = orig.Mapped(0, 100, Strand::FORWARD, cigar, mapQual);
+
+    EXPECT_TRUE(mapped.IsMapped());
+    EXPECT_EQ(0, mapped.ReferenceId());
+    EXPECT_EQ(Strand::FORWARD, mapped.AlignedStrand());
+    EXPECT_EQ(mapQual, mapped.MapQuality());
+
+    EXPECT_EQ(500, mapped.QueryStart());      // 500
+    EXPECT_EQ(510, mapped.QueryEnd());        // QStart + seqLength
+    EXPECT_EQ(500, mapped.AlignedStart());    // QStart
+    EXPECT_EQ(510, mapped.AlignedEnd());      // QStart + 8= + 2I
+    EXPECT_EQ(100, mapped.ReferenceStart());  // 100
+    EXPECT_EQ(111, mapped.ReferenceEnd());    // RefStart + 8= + 3D
+
+    EXPECT_EQ(seq,      mapped.Sequence());
+    EXPECT_EQ(quals,    mapped.Qualities().Fastq());
+    EXPECT_EQ(tagBases, mapped.DeletionTag());
+    EXPECT_EQ(tagQuals, mapped.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, mapped.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, mapped.AltLabelQV().Fastq());
+    EXPECT_EQ(frames,   mapped.IPD().Data());
+}
+
+TEST(BamRecordMappingTest, StaticMapped)
+{
+    const Position qStart = 500;
+    const Position qEnd   = 510;
+    const string seq      = "AACCGTTAGC";
+    const string quals    = "?]?]?]?]?*";
+    const string tagBases = "AACCGTTAGC";
+    const string tagQuals = "?]?]?]?]?*";
+    const f_data frames   = { 10, 10, 20, 20, 30, 40, 40, 10, 30, 20 };
+    const uint8_t mapQual = 80;
+    const string cigar    = "4=1D2I2D4=";
+
+    const BamRecord orig = tests::MakeRecord(qStart, qEnd, seq, quals, tagBases, tagQuals, frames);
+    const BamRecord mapped = BamRecord::Mapped(orig, 0, 100, Strand::FORWARD, cigar, mapQual);
+
+    EXPECT_TRUE(mapped.IsMapped());
+    EXPECT_EQ(0, mapped.ReferenceId());
+    EXPECT_EQ(Strand::FORWARD, mapped.AlignedStrand());
+    EXPECT_EQ(mapQual, mapped.MapQuality());
+
+    EXPECT_EQ(500, mapped.QueryStart());      // 500
+    EXPECT_EQ(510, mapped.QueryEnd());        // QStart + seqLength
+    EXPECT_EQ(500, mapped.AlignedStart());    // QStart
+    EXPECT_EQ(510, mapped.AlignedEnd());      // QStart + 8= + 2I
+    EXPECT_EQ(100, mapped.ReferenceStart());  // 100
+    EXPECT_EQ(111, mapped.ReferenceEnd());    // RefStart + 8= + 3D
+
+    EXPECT_EQ(seq,      mapped.Sequence());
+    EXPECT_EQ(quals,    mapped.Qualities().Fastq());
+    EXPECT_EQ(tagBases, mapped.DeletionTag());
+    EXPECT_EQ(tagQuals, mapped.DeletionQV().Fastq());
+    EXPECT_EQ(tagQuals, mapped.LabelQV().Fastq());
+    EXPECT_EQ(tagQuals, mapped.AltLabelQV().Fastq());
+    EXPECT_EQ(frames,   mapped.IPD().Data());
+}
diff --git a/tests/src/test_BamWriter.cpp b/tests/src/test_BamWriter.cpp
new file mode 100644
index 0000000..320c698
--- /dev/null
+++ b/tests/src/test_BamWriter.cpp
@@ -0,0 +1,198 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <htslib/sam.h>
+#include <pbbam/BamHeader.h>
+#include <pbbam/BamRecord.h>
+#include <pbbam/BamWriter.h>
+#include <pbbam/EntireFileQuery.h>
+#include <chrono>
+#include <iostream>
+#include <string>
+#include <cstdio>
+#include <cstdlib>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+// put any BamWriter-only API tests here (error handling, etc.)
+//
+// plain ol' read & dump is in test_EndToEnd.cpp
+
+const string generatedBamFn = tests::Data_Dir + "/generated.bam";
+
+struct ResultPacket
+{
+    std::string name;
+    char*       bases;
+    char*       overallQv;
+    size_t      length;
+    int         zmwNum;
+    int         startPos;
+    BamRecord   bamRecord;
+
+    ResultPacket() = default;
+
+    ResultPacket(ResultPacket&& src)
+    {
+        name            = std::move(src.name);
+
+        bases           = src.bases;
+        overallQv       = src.overallQv;
+        length          = src.length;
+
+        zmwNum          = src.zmwNum;
+        startPos        = src.startPos;
+
+        src.bases     = 0;
+        src.overallQv = 0;
+
+        bamRecord = std::move(src.bamRecord);
+    }
+    // Copy constructor
+    ResultPacket(const ResultPacket&) = delete;
+    // Move assignment constructor
+    ResultPacket& operator=(ResultPacket&&) = delete;
+    // Copy assignment constructor
+    ResultPacket& operator=(const ResultPacket&) = delete;
+    // Destructor
+    ~ResultPacket()
+    {
+        // delete [] basesBam;
+        if (bases != 0) delete [] bases;
+        if (overallQv != 0) delete [] overallQv;
+    }
+};
+
+TEST(BamWriterTest, SingleWrite_UserRecord)
+{
+    //Writing a ResultPacket in Workflow.h:
+    ResultPacket result;
+    result.zmwNum = 42;
+    result.name = "ZMW\\"+std::to_string(42);
+    auto length = 5;
+
+    result.bases     = (char*) calloc(length,1);
+    result.overallQv = (char*) calloc(length,1);
+    // FILL WITH CONTENT
+    result.bases[0] = 'A';
+    result.bases[1] = 'C';
+    result.bases[2] = 'G';
+    result.bases[3] = 'T';
+    result.bases[4] = 'C';
+    result.overallQv[0] = ']';
+    result.overallQv[1] = '6';
+    result.overallQv[2] = '4';
+    result.overallQv[3] = '@';
+    result.overallQv[4] = '<';
+
+    // Encode data to BamAlignment
+    result.bamRecord.impl_.Name(result.name);
+    result.bamRecord.impl_.SetSequenceAndQualities(result.bases, length);
+    result.bamRecord.impl_.CigarData("");
+    result.bamRecord.impl_.Bin(0);
+    result.bamRecord.impl_.Flag(0);
+    result.bamRecord.impl_.InsertSize(0);
+    result.bamRecord.impl_.MapQuality(0);
+    result.bamRecord.impl_.MatePosition(-1);
+    result.bamRecord.impl_.MateReferenceId(-1);
+    result.bamRecord.impl_.Position(-1);
+    result.bamRecord.impl_.ReferenceId(-1);
+
+    std::vector<uint8_t> subQv = std::vector<uint8_t>({34, 5, 125});
+
+    TagCollection tags;
+    tags["SQ"] = subQv;
+
+    Tag asciiTag('J');
+    asciiTag.Modifier(TagModifier::ASCII_CHAR);
+
+    // add ASCII tag via TagCollection
+    tags["a1"] = asciiTag;
+    result.bamRecord.impl_.Tags(tags);
+
+    // add ASCII tag via BamRecordImpl
+    Tag asciiTag2('K');
+    asciiTag2.Modifier(TagModifier::ASCII_CHAR);
+    result.bamRecord.impl_.AddTag("a2", asciiTag2);
+
+    BamHeader headerSubreads;
+    headerSubreads.Version("1.1")
+                  .SortOrder("coordinate");
+
+    EXPECT_NO_THROW ({
+        BamWriter writer(generatedBamFn, headerSubreads);
+        writer.Write(result.bamRecord);
+    });
+
+    EXPECT_NO_THROW ({
+        BamFile file(generatedBamFn);
+        EXPECT_EQ(std::string("1.1"),        file.Header().Version());
+        EXPECT_EQ(std::string("coordinate"), file.Header().SortOrder());
+
+        EntireFileQuery entireFile(file);
+        for (const BamRecord& record : entireFile) {
+            const BamRecordImpl& impl = record.Impl();
+
+            EXPECT_EQ(std::string("ACGTC"),   impl.Sequence());
+            EXPECT_EQ(std::string("ZMW\\42"), impl.Name());
+
+            const TagCollection& implTags = impl.Tags();
+            EXPECT_TRUE(implTags.Contains("SQ"));
+            EXPECT_TRUE(implTags.Contains("a1"));
+            EXPECT_TRUE(implTags.Contains("a2"));
+
+            const Tag sqTag = impl.TagValue("SQ");
+            const Tag a1Tag = impl.TagValue("a1");
+            const Tag a2Tag = impl.TagValue("a2");
+            EXPECT_EQ(std::vector<uint8_t>({34, 5, 125}), sqTag.ToUInt8Array());
+            EXPECT_EQ('J', a1Tag.ToAscii());
+            EXPECT_EQ('K', a2Tag.ToAscii());
+
+            // just check first record
+            break;
+        }
+    });
+
+    remove(generatedBamFn.c_str());
+}
diff --git a/tests/src/test_Cigar.cpp b/tests/src/test_Cigar.cpp
new file mode 100644
index 0000000..796720a
--- /dev/null
+++ b/tests/src/test_Cigar.cpp
@@ -0,0 +1,198 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/Cigar.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(CigarTest, TypeToCar)
+{
+    EXPECT_EQ('M', CigarOperation::TypeToChar(CigarOperationType::ALIGNMENT_MATCH) );
+    EXPECT_EQ('I', CigarOperation::TypeToChar(CigarOperationType::INSERTION) );
+    EXPECT_EQ('D', CigarOperation::TypeToChar(CigarOperationType::DELETION) );
+    EXPECT_EQ('N', CigarOperation::TypeToChar(CigarOperationType::REFERENCE_SKIP) );
+    EXPECT_EQ('S', CigarOperation::TypeToChar(CigarOperationType::SOFT_CLIP) );
+    EXPECT_EQ('H', CigarOperation::TypeToChar(CigarOperationType::HARD_CLIP) );
+    EXPECT_EQ('P', CigarOperation::TypeToChar(CigarOperationType::PADDING) );
+    EXPECT_EQ('=', CigarOperation::TypeToChar(CigarOperationType::SEQUENCE_MATCH) );
+    EXPECT_EQ('X', CigarOperation::TypeToChar(CigarOperationType::SEQUENCE_MISMATCH) );
+}
+
+TEST(CigarTest, CharToType)
+{
+    EXPECT_EQ(CigarOperationType::ALIGNMENT_MATCH,   CigarOperation::CharToType('M'));
+    EXPECT_EQ(CigarOperationType::INSERTION,         CigarOperation::CharToType('I'));
+    EXPECT_EQ(CigarOperationType::DELETION,          CigarOperation::CharToType('D'));
+    EXPECT_EQ(CigarOperationType::REFERENCE_SKIP,    CigarOperation::CharToType('N'));
+    EXPECT_EQ(CigarOperationType::SOFT_CLIP,         CigarOperation::CharToType('S'));
+    EXPECT_EQ(CigarOperationType::HARD_CLIP,         CigarOperation::CharToType('H'));
+    EXPECT_EQ(CigarOperationType::PADDING,           CigarOperation::CharToType('P'));
+    EXPECT_EQ(CigarOperationType::SEQUENCE_MATCH,    CigarOperation::CharToType('='));
+    EXPECT_EQ(CigarOperationType::SEQUENCE_MISMATCH, CigarOperation::CharToType('X'));
+}
+
+TEST(CigarTest, SetOperationYieldsCorrectType)
+{
+    CigarOperation c1; c1.Type(CigarOperationType::ALIGNMENT_MATCH);
+    CigarOperation c2; c2.Type(CigarOperationType::INSERTION);
+    CigarOperation c3; c3.Type(CigarOperationType::DELETION);
+    CigarOperation c4; c4.Type(CigarOperationType::REFERENCE_SKIP);
+    CigarOperation c5; c5.Type(CigarOperationType::SOFT_CLIP);
+    CigarOperation c6; c6.Type(CigarOperationType::HARD_CLIP);
+    CigarOperation c7; c7.Type(CigarOperationType::PADDING);
+    CigarOperation c8; c8.Type(CigarOperationType::SEQUENCE_MATCH);
+    CigarOperation c9; c9.Type(CigarOperationType::SEQUENCE_MISMATCH);
+
+    EXPECT_EQ('M', c1.Char());
+    EXPECT_EQ('I', c2.Char());
+    EXPECT_EQ('D', c3.Char());
+    EXPECT_EQ('N', c4.Char());
+    EXPECT_EQ('S', c5.Char());
+    EXPECT_EQ('H', c6.Char());
+    EXPECT_EQ('P', c7.Char());
+    EXPECT_EQ('=', c8.Char());
+    EXPECT_EQ('X', c9.Char());
+}
+
+TEST(CigarTest, SetTypeYieldsCorrectOperation)
+{
+    CigarOperation c1; c1.Char('M');
+    CigarOperation c2; c2.Char('I');
+    CigarOperation c3; c3.Char('D');
+    CigarOperation c4; c4.Char('N');
+    CigarOperation c5; c5.Char('S');
+    CigarOperation c6; c6.Char('H');
+    CigarOperation c7; c7.Char('P');
+    CigarOperation c8; c8.Char('=');
+    CigarOperation c9; c9.Char('X');
+
+    EXPECT_EQ(CigarOperationType::ALIGNMENT_MATCH,   c1.Type());
+    EXPECT_EQ(CigarOperationType::INSERTION,         c2.Type());
+    EXPECT_EQ(CigarOperationType::DELETION,          c3.Type());
+    EXPECT_EQ(CigarOperationType::REFERENCE_SKIP,    c4.Type());
+    EXPECT_EQ(CigarOperationType::SOFT_CLIP,         c5.Type());
+    EXPECT_EQ(CigarOperationType::HARD_CLIP,         c6.Type());
+    EXPECT_EQ(CigarOperationType::PADDING,           c7.Type());
+    EXPECT_EQ(CigarOperationType::SEQUENCE_MATCH,    c8.Type());
+    EXPECT_EQ(CigarOperationType::SEQUENCE_MISMATCH, c9.Type());
+}
+
+TEST(CigarStringTest, FromStdString_Empty)
+{
+    const string emptyCigar = "";
+    Cigar cigar = Cigar::FromStdString(emptyCigar);
+    EXPECT_TRUE(cigar.empty());
+}
+
+TEST(CigarStringTest, FromStdString_SingleOp)
+{
+    const string singleCigar = "100=";
+
+    Cigar cigar = Cigar::FromStdString(singleCigar);
+    ASSERT_TRUE(cigar.size() == 1);
+
+    const CigarOperation& op = cigar.front();
+    EXPECT_TRUE(op.Char()   == '=');
+    EXPECT_TRUE(op.Length() == 100);
+}
+
+TEST(CigarStringTest, FromStdString_MultipleOps)
+{
+    const string multiCigar = "100=2D34I6=6X6=";
+
+    Cigar cigar = Cigar::FromStdString(multiCigar);
+    ASSERT_TRUE(cigar.size() == 6);
+
+    CigarOperation op0 = cigar.at(0);
+    CigarOperation op1 = cigar.at(1);
+    CigarOperation op2 = cigar.at(2);
+    CigarOperation op3 = cigar.at(3);
+    CigarOperation op4 = cigar.at(4);
+    CigarOperation op5 = cigar.at(5);
+
+    EXPECT_TRUE(op0.Char()   == '=');
+    EXPECT_TRUE(op0.Length() == 100);
+    EXPECT_TRUE(op1.Char()   == 'D');
+    EXPECT_TRUE(op1.Length() == 2);
+    EXPECT_TRUE(op2.Char()   == 'I');
+    EXPECT_TRUE(op2.Length() == 34);
+    EXPECT_TRUE(op3.Char()   == '=');
+    EXPECT_TRUE(op3.Length() == 6);
+    EXPECT_TRUE(op4.Char()   == 'X');
+    EXPECT_TRUE(op4.Length() == 6);
+    EXPECT_TRUE(op5.Char()   == '=');
+    EXPECT_TRUE(op5.Length() == 6);
+}
+
+TEST(CigarStringTest, ToStdString_Empty)
+{
+    const string empty;
+    Cigar cigar;
+    EXPECT_EQ(empty, cigar.ToStdString());
+}
+
+TEST(CigarStringTest, ToStdString_SingleOp)
+{
+    const string singleCigar = "100=";
+
+    Cigar cigar;
+    cigar.push_back( CigarOperation(CigarOperationType::SEQUENCE_MATCH, 100) );
+
+    EXPECT_EQ(singleCigar, cigar.ToStdString());
+}
+
+TEST(CigarStringTest, ToStdString_MultipleOps)
+{
+    const string multiCigar = "100=2D34I6=6X6=";
+
+    Cigar cigar;
+    cigar.push_back(CigarOperation(CigarOperationType::SEQUENCE_MATCH,  100));
+    cigar.push_back(CigarOperation(CigarOperationType::DELETION,          2));
+    cigar.push_back(CigarOperation(CigarOperationType::INSERTION,        34));
+    cigar.push_back(CigarOperation(CigarOperationType::SEQUENCE_MATCH,    6));
+    cigar.push_back(CigarOperation(CigarOperationType::SEQUENCE_MISMATCH, 6));
+    cigar.push_back(CigarOperation(CigarOperationType::SEQUENCE_MATCH,    6));
+
+    EXPECT_EQ(multiCigar, cigar.ToStdString());
+}
diff --git a/tests/src/test_DataSetCore.cpp b/tests/src/test_DataSetCore.cpp
new file mode 100644
index 0000000..2ad0a4e
--- /dev/null
+++ b/tests/src/test_DataSetCore.cpp
@@ -0,0 +1,482 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/DataSet.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+static inline
+DataSet CreateDataSet(void)
+{
+    DataSet d;
+    d.Name("foo");
+    return d;
+}
+
+} // namespace tests
+
+TEST(DataSetCoreTest, XmlNameParts)
+{
+    internal::XmlName name("ns:node_name");
+    EXPECT_EQ(boost::string_ref("ns"),           name.Prefix());
+    EXPECT_EQ(boost::string_ref("node_name"),    name.LocalName());
+    EXPECT_EQ(boost::string_ref("ns:node_name"), name.QualifiedName());
+
+    internal::XmlName bareName("node_name");
+    EXPECT_EQ(boost::string_ref(""),          bareName.Prefix());
+    EXPECT_EQ(boost::string_ref("node_name"), bareName.LocalName());
+    EXPECT_EQ(boost::string_ref("node_name"), bareName.QualifiedName());
+
+    internal::XmlName leadingColon(":node_name");
+    EXPECT_EQ(boost::string_ref(""),           leadingColon.Prefix());
+    EXPECT_EQ(boost::string_ref(":node_name"), leadingColon.LocalName());
+    EXPECT_EQ(boost::string_ref(":node_name"), leadingColon.QualifiedName());
+}
+
+TEST(DataSetCoreTest, NamespacesOk)
+{
+
+}
+
+TEST(DataSetCoreTest, DefaultsOk)
+{
+    DataSet dataset;
+    EXPECT_EQ(DataSet::GENERIC, dataset.Type());
+    EXPECT_FALSE(dataset.CreatedAt().empty());    // default init
+    EXPECT_TRUE(dataset.Format().empty());
+    EXPECT_TRUE(dataset.MetaType().empty());
+    EXPECT_TRUE(dataset.ModifiedAt().empty());
+    EXPECT_TRUE(dataset.Name().empty());
+    EXPECT_TRUE(dataset.ResourceId().empty());
+    EXPECT_TRUE(dataset.Tags().empty());
+    EXPECT_TRUE(dataset.TimeStampedName().empty());
+    EXPECT_TRUE(dataset.UniqueId().empty());
+    EXPECT_TRUE(dataset.Version().empty());
+    EXPECT_EQ(0, dataset.ExternalResources().Size());
+    EXPECT_EQ(0, dataset.Filters().Size());
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+}
+
+TEST(DataSetCoreTest, BasicGettersSettersOk)
+{
+    DataSet dataset;
+    dataset.CreatedAt("now");
+    dataset.Format("format");
+    dataset.MetaType("meta");
+    dataset.ModifiedAt("later");
+    dataset.Name("foo");
+    dataset.ResourceId("path/to/file");
+    dataset.Tags("tag tag");
+    dataset.TimeStampedName("now:30");
+    dataset.UniqueId("uuid");
+    dataset.Version("0.0.0");
+
+    EXPECT_EQ(string("now"),          dataset.CreatedAt());
+    EXPECT_EQ(string("format"),       dataset.Format());
+    EXPECT_EQ(string("meta"),         dataset.MetaType());
+    EXPECT_EQ(string("later"),        dataset.ModifiedAt());
+    EXPECT_EQ(string("foo"),          dataset.Name());
+    EXPECT_EQ(string("path/to/file"), dataset.ResourceId());
+    EXPECT_EQ(string("tag tag"),      dataset.Tags());
+    EXPECT_EQ(string("now:30"),       dataset.TimeStampedName());
+    EXPECT_EQ(string("uuid"),         dataset.UniqueId());
+    EXPECT_EQ(string("0.0.0"),        dataset.Version());
+}
+
+TEST(DataSetCoreTest, CopyOk)
+{
+    DataSet d1;
+    d1.Name("foo");
+
+    // copy ctor
+    DataSet d2(d1);
+    EXPECT_EQ(string("foo"), d2.Name());
+
+    // copy assignment
+    DataSet d3;
+    d3 = d1;
+    EXPECT_EQ(string("foo"), d3.Name());
+}
+
+TEST(DataSetCoreTest, MoveOk)
+{
+    DataSet d1;
+    d1.Name("foo");
+
+    // move ctor
+    DataSet d2(std::move(tests::CreateDataSet()));
+    EXPECT_EQ(string("foo"), d2.Name());
+
+    // move assignment
+    DataSet d3;
+    d3 = std::move(tests::CreateDataSet());
+    EXPECT_EQ(string("foo"), d3.Name());
+}
+
+TEST(DataSetCoreTest, AddExternalResources)
+{
+    DataSet dataset;
+    EXPECT_EQ(0, dataset.ExternalResources().Size());
+
+    ExternalResource resource1;
+    resource1.Name("file1");
+
+    ExternalResource resource2;
+    resource2.Name("file2");
+    resource2.MetaType("blah");
+
+    dataset.ExternalResources().Add(resource1);
+    dataset.ExternalResources().Add(resource2);
+    EXPECT_EQ(2, dataset.ExternalResources().Size());
+
+    // direct access
+    const ExternalResources& resources = dataset.ExternalResources();
+    EXPECT_EQ(string("file1"), resources[0].Name());
+    EXPECT_EQ(string("file2"), resources[1].Name());
+
+    // iterable
+    size_t i = 0;
+    for (auto r : resources) {
+        if (i == 0)
+            EXPECT_EQ(string("file1"), r.Name());
+        else
+            EXPECT_EQ(string("file2"), r.Name());
+        ++i;
+    }
+}
+
+TEST(DataSetCoreTest, EditExternalResources)
+{
+    DataSet dataset;
+
+    ExternalResource resource;
+    resource.Name("file1");
+    dataset.ExternalResources().Add(resource);
+
+    resource.Name("file2");
+    dataset.ExternalResources().Add(resource);
+    EXPECT_EQ(2, dataset.ExternalResources().Size());
+
+    // edit
+    dataset.ExternalResources()[0].Name("some new name");
+    EXPECT_EQ(string("some new name"), dataset.ExternalResources()[0].Name());
+    EXPECT_EQ(string("file2"),         dataset.ExternalResources()[1].Name());
+}
+
+TEST(DataSetCoreTest, AddFilters)
+{
+    DataSet dataset;
+    EXPECT_EQ(0, dataset.Filters().Size());
+
+    Filter filter;
+    filter.Properties().Add(Property("rq", "0.85", ">"));
+    filter.Properties().Add(Property("RNAME", "chr1", "=="));
+    EXPECT_EQ(2, filter.Properties().Size());
+
+    Filter filter2;
+    filter2.Properties().Add(Property("rq", "0.50", ">="));
+    filter2.Properties().Add(Property("RNAME", "chr2", "!="));
+    EXPECT_EQ(2, filter2.Properties().Size());
+
+    dataset.Filters().Add(filter);
+    dataset.Filters().Add(filter2);
+
+    const Filters& filters = dataset.Filters();
+    EXPECT_EQ(2, filters.Size());
+    EXPECT_EQ(2, filters[0].Properties().Size());
+    EXPECT_EQ(2, filters[1].Properties().Size());
+
+    // direct access
+    const Property& p0 = filters[0].Properties()[0];
+    EXPECT_EQ(string("rq"),   p0.Name());
+    EXPECT_EQ(string("0.85"), p0.Value());
+    EXPECT_EQ(string(">"),    p0.Operator());
+
+    const Property& p1 = filters[0].Properties()[1];
+    EXPECT_EQ(string("RNAME"), p1.Name());
+    EXPECT_EQ(string("chr1"),  p1.Value());
+    EXPECT_EQ(string("=="),    p1.Operator());
+
+    const Property& p2 = filters[1].Properties()[0];
+    EXPECT_EQ(string("rq"),   p2.Name());
+    EXPECT_EQ(string("0.50"), p2.Value());
+    EXPECT_EQ(string(">="),   p2.Operator());
+
+    const Property& p3 = filters[1].Properties()[1];
+    EXPECT_EQ(string("RNAME"), p3.Name());
+    EXPECT_EQ(string("chr2"),  p3.Value());
+    EXPECT_EQ(string("!="),    p3.Operator());
+
+    // iteratable
+    size_t i = 0;
+    size_t j = 0;
+    for (const Filter& f : filters) {
+        if (i == 0) {
+            const Properties& properties = f.Properties();
+            for (const Property& p : properties) {
+                if (j == 0) {
+                    EXPECT_EQ(string("rq"),   p.Name());
+                    EXPECT_EQ(string("0.85"), p.Value());
+                    EXPECT_EQ(string(">"),    p.Operator());
+                } else {
+                    EXPECT_EQ(string("RNAME"), p.Name());
+                    EXPECT_EQ(string("chr1"),  p.Value());
+                    EXPECT_EQ(string("=="),    p.Operator());
+                }
+                ++j;
+            }
+        } else {
+            const Properties& properties = f.Properties();
+            for (const Property& p : properties) {
+                if (j == 0) {
+                    EXPECT_EQ(string("rq"),   p.Name());
+                    EXPECT_EQ(string("0.50"), p.Value());
+                    EXPECT_EQ(string(">="),   p.Operator());
+                } else {
+                    EXPECT_EQ(string("RNAME"), p.Name());
+                    EXPECT_EQ(string("chr2"),  p.Value());
+                    EXPECT_EQ(string("!="),    p.Operator());
+                }
+                ++j;
+            }
+        }
+        ++i;
+        j = 0;
+    }
+
+}
+
+TEST(DataSetCoreTest, EditFilters)
+{
+    DataSet dataset;
+    EXPECT_EQ(0, dataset.Filters().Size());
+
+    Filter filter;
+    filter.Properties().Add(Property("rq", "0.85", ">"));
+    filter.Properties().Add(Property("RNAME", "chr1", "=="));
+    EXPECT_EQ(2, filter.Properties().Size());
+
+    Filter filter2;
+    filter2.Properties().Add(Property("rq", "0.50", ">="));
+    filter2.Properties().Add(Property("RNAME", "chr2", "!="));
+    EXPECT_EQ(2, filter2.Properties().Size());
+
+    dataset.Filters().Add(filter);
+    dataset.Filters().Add(filter2);
+    EXPECT_EQ(2, dataset.Filters().Size());
+    EXPECT_EQ(2, dataset.Filters()[0].Properties().Size());
+    EXPECT_EQ(2, dataset.Filters()[1].Properties().Size());
+
+    // edit property in-place
+    Property& p = dataset.Filters()[0].Properties()[0];
+    p.Name("someNewName");
+    p.Value("someNewValue");
+    p.Operator("==");
+
+    const Property& p0 = dataset.Filters()[0].Properties()[0];
+    EXPECT_EQ(string("someNewName"),  p0.Name());
+    EXPECT_EQ(string("someNewValue"), p0.Value());
+    EXPECT_EQ(string("=="),           p0.Operator());
+
+    const Property& p1 = dataset.Filters()[0].Properties()[1];
+    EXPECT_EQ(string("RNAME"), p1.Name());
+    EXPECT_EQ(string("chr1"),  p1.Value());
+    EXPECT_EQ(string("=="),    p1.Operator());
+
+    const Property& p2 = dataset.Filters()[1].Properties()[0];
+    EXPECT_EQ(string("rq"),   p2.Name());
+    EXPECT_EQ(string("0.50"), p2.Value());
+    EXPECT_EQ(string(">="),   p2.Operator());
+
+    const Property& p3 = dataset.Filters()[1].Properties()[1];
+    EXPECT_EQ(string("RNAME"), p3.Name());
+    EXPECT_EQ(string("chr2"),  p3.Value());
+    EXPECT_EQ(string("!="),    p3.Operator());
+}
+
+TEST(DataSetCoreTest, AddSubDataSets)
+{
+    DataSet dataset;
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+    DataSetBase sub1;
+    sub1.Name("subset_1");
+
+    DataSetBase sub2;
+    sub2.Name("subset_2");
+
+    dataset.SubDataSets().Add(sub1);
+    dataset.SubDataSets().Add(sub2);
+    EXPECT_EQ(2, dataset.SubDataSets().Size());
+
+    // direct access
+    const SubDataSets& subdatasets = dataset.SubDataSets();
+    EXPECT_EQ(string("subset_1"), subdatasets[0].Name());
+    EXPECT_EQ(string("subset_2"), subdatasets[1].Name());
+
+    // iterable
+    size_t i = 0;
+    for (const DataSetBase& ds : subdatasets) {
+        if (i == 0)
+            EXPECT_EQ(string("subset_1"), ds.Name());
+        else
+            EXPECT_EQ(string("subset_2"), ds.Name());
+        ++i;
+    }
+}
+
+TEST(DataSetCoreTest, EditSubDataSets)
+{
+    DataSet dataset;
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+    DataSetBase sub1;
+    sub1.Name("subset_1");
+
+    DataSetBase sub2;
+    sub2.Name("subset_2");
+
+    dataset.SubDataSets().Add(sub1);
+    dataset.SubDataSets().Add(sub2);
+    EXPECT_EQ(2, dataset.SubDataSets().Size());
+
+    // edit
+    dataset.SubDataSets()[0].Name("subset_1_edited");
+
+    // direct access
+    const SubDataSets& subdatasets = dataset.SubDataSets();
+    EXPECT_EQ(string("subset_1_edited"), subdatasets[0].Name());
+    EXPECT_EQ(string("subset_2"), subdatasets[1].Name());
+
+    // iterable
+    size_t i = 0;
+    for (const DataSetBase& ds : subdatasets) {
+        if (i == 0)
+            EXPECT_EQ(string("subset_1_edited"), ds.Name());
+        else
+            EXPECT_EQ(string("subset_2"), ds.Name());
+        ++i;
+    }
+}
+
+TEST(DataSetCoreTest, RemoveExternalResources)
+{
+    DataSet dataset;
+    EXPECT_EQ(0, dataset.ExternalResources().Size());
+
+    ExternalResource resource1;
+    resource1.Name("file1");
+
+    ExternalResource resource2;
+    resource2.Name("file2");
+
+    dataset.ExternalResources().Add(resource1);
+    dataset.ExternalResources().Add(resource2);
+    EXPECT_EQ(2, dataset.ExternalResources().Size());
+
+    // remove
+    dataset.ExternalResources().Remove(resource1);
+    EXPECT_EQ(1, dataset.ExternalResources().Size());
+
+    // direct access
+    const ExternalResources& resources = dataset.ExternalResources();
+    EXPECT_EQ(string("file2"), resources[0].Name());
+
+    // iterable
+    size_t i = 0;
+    for (auto r : resources) {
+        if (i == 0)
+            EXPECT_EQ(string("file2"), r.Name());
+        ++i;
+    }
+}
+
+TEST(DataSetCoreTest, RemoveFilters)
+{
+    DataSet dataset;
+    EXPECT_EQ(0, dataset.Filters().Size());
+
+    Filter filter;
+    filter.Properties().Add(Property("rq", "0.85", ">"));
+    filter.Properties().Add(Property("RNAME", "chr1", "=="));
+    EXPECT_EQ(2, filter.Properties().Size());
+
+    Filter filter2;
+    filter2.Properties().Add(Property("rq", "0.50", ">="));
+    filter2.Properties().Add(Property("RNAME", "chr2", "!="));
+    EXPECT_EQ(2, filter2.Properties().Size());
+
+    dataset.Filters().Add(filter);
+    dataset.Filters().Add(filter2);
+    EXPECT_EQ(2, dataset.Filters().Size());
+
+    // remove
+    dataset.Filters().Remove(filter);
+    EXPECT_EQ(1, dataset.Filters().Size());
+
+    const Filters& filters = dataset.Filters();
+    EXPECT_EQ(2, filters[0].Properties().Size());
+}
+
+TEST(DataSetCoreTest, RemoveSubDataSets)
+{
+    DataSet dataset;
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+    DataSetBase sub1;
+    sub1.Name("subset_1");
+
+    DataSetBase sub2;
+    sub2.Name("subset_2");
+
+    dataset.SubDataSets().Add(sub1);
+    dataset.SubDataSets().Add(sub2);
+    EXPECT_EQ(2, dataset.SubDataSets().Size());
+
+    // remove
+    dataset.SubDataSets().Remove(sub2);
+    EXPECT_EQ(1, dataset.SubDataSets().Size());
+}
diff --git a/tests/src/test_DataSetIO.cpp b/tests/src/test_DataSetIO.cpp
new file mode 100644
index 0000000..b075788
--- /dev/null
+++ b/tests/src/test_DataSetIO.cpp
@@ -0,0 +1,1281 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/DataSet.h>
+#include <pbbam/internal/DataSetElement.h>
+#include <stdexcept>
+#include <sstream>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string ex2BamFn      = tests::Data_Dir + "/ex2.bam";
+const string bamGroupFofn  = tests::Data_Dir + "/test_group_query/group.fofn";
+
+const string ali1XmlFn = tests::Data_Dir + "/dataset/ali1.xml";
+const string ali2XmlFn = tests::Data_Dir + "/dataset/ali2.xml";
+const string ali3XmlFn = tests::Data_Dir + "/dataset/ali3.xml";
+const string ali4XmlFn = tests::Data_Dir + "/dataset/ali4.xml";
+const string mappingStaggeredXmlFn = tests::Data_Dir + "/dataset/bam_mapping_staggered.xml";
+const string barcodeXmlFn = tests::Data_Dir + "/dataset/barcode.dataset.xml";
+const string ccsReadXmlFn = tests::Data_Dir + "/dataset/ccsread.dataset.xml";
+const string datasetFofn  = tests::Data_Dir + "/dataset/fofn.fofn";
+const string hdfSubreadXmlFn    = tests::Data_Dir + "/dataset/hdfsubread_dataset.xml";
+const string lambdaContigsXmlFn = tests::Data_Dir + "/dataset/lambda_contigs.xml";
+const string pbalchemyXmlFn   = tests::Data_Dir + "/dataset/pbalchemy10kbp.xml";
+const string referenceXmlFn   = tests::Data_Dir + "/dataset/reference.dataset.xml";
+const string subread1XmlFn    = tests::Data_Dir + "/dataset/subread_dataset1.xml";
+const string subread2XmlFn    = tests::Data_Dir + "/dataset/subread_dataset2.xml";
+const string subread3XmlFn    = tests::Data_Dir + "/dataset/subread_dataset3.xml";
+const string transformedXmlFn = tests::Data_Dir + "/dataset/transformed_rs_subread_dataset.xml";
+
+static void TestFromXmlString(void);
+static void TestAli1Xml(void);
+static void TestAli2Xml(void);
+static void TestAli3Xml(void);
+static void TestAli4Xml(void);
+static void TestMappingStaggeredXml(void);
+static void TestBarcodeXml(void);
+static void TestCcsReadXml(void);
+static void TestHdfSubreadXml(void);
+static void TestLambdaContigsXml(void);
+static void TestPbalchemyXml(void);
+static void TestReferenceXml(void);
+static void TestSubread1Xml(void);
+static void TestSubread2Xml(void);
+static void TestSubread3Xml(void);
+static void TestTransformedXml(void);
+
+TEST(DataSetIOTest, FromBamFilename)
+{
+    DataSet dataset(ex2BamFn);
+
+    EXPECT_EQ(1, dataset.ExternalResources().Size());
+    const ExternalResource& bamRef = dataset.ExternalResources()[0];
+
+    EXPECT_EQ(ex2BamFn, bamRef.ResourceId());
+}
+
+TEST(DataSetIOTest, FromBamFileObject)
+{
+    BamFile bamFile(ex2BamFn);
+    DataSet dataset(bamFile.Filename());
+
+    EXPECT_EQ(1, dataset.ExternalResources().Size());
+    const ExternalResource& bamRef = dataset.ExternalResources()[0];
+
+    EXPECT_EQ(ex2BamFn, bamRef.ResourceId());
+}
+
+TEST(DataSetIOTest, FromFofn)
+{
+    DataSet dataset(bamGroupFofn);
+    EXPECT_EQ(3, dataset.ExternalResources().Size());
+}
+
+TEST(DataSetIOTest, FromXml)
+{
+    EXPECT_NO_THROW(TestFromXmlString());
+}
+
+TEST(DataSetIOTest, FromXmlFile)
+{
+    EXPECT_NO_THROW(TestAli1Xml());
+    EXPECT_NO_THROW(TestAli2Xml());
+    EXPECT_NO_THROW(TestAli3Xml());
+    EXPECT_NO_THROW(TestAli4Xml());
+    EXPECT_NO_THROW(TestMappingStaggeredXml());
+    EXPECT_NO_THROW(TestBarcodeXml());
+    EXPECT_NO_THROW(TestCcsReadXml());
+    EXPECT_NO_THROW(TestHdfSubreadXml());
+    EXPECT_NO_THROW(TestLambdaContigsXml());
+    EXPECT_NO_THROW(TestPbalchemyXml());
+    EXPECT_NO_THROW(TestReferenceXml());
+    EXPECT_NO_THROW(TestSubread1Xml());
+    EXPECT_NO_THROW(TestSubread2Xml());
+    EXPECT_NO_THROW(TestSubread3Xml());
+    EXPECT_NO_THROW(TestTransformedXml());
+}
+
+TEST(DataSetIOTest, ThrowsOnNonexistentFofnFile)
+{
+    EXPECT_THROW(
+    {
+        DataSet dataset("does/not/exist.fofn");
+
+    }, std::exception);
+}
+
+TEST(DataSetIOTest, ThrowsOnNonexistentXmlFile)
+{
+    EXPECT_THROW(
+    {
+        DataSet dataset("does/not/exist.xml");
+
+    }, std::exception);
+}
+
+TEST(DataSetIOTest, ToXml)
+{
+    // top-level data
+    DataSet dataset(DataSet::ALIGNMENT);
+    dataset.CreatedAt("2015-01-27T09:00:01");
+    dataset.MetaType("PacBio.DataSet.AlignmentSet");
+    dataset.Name("DataSet_AlignmentSet");
+    dataset.Tags("barcode moreTags mapping mytags");
+    dataset.UniqueId("b095d0a3-94b8-4918-b3af-a3f81bbe519c");
+    dataset.Version("2.3.0");
+    dataset.Attribute("xmlns","http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd")
+           .Attribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
+           .Attribute("xsi:schemaLocation",
+                      "http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd PacBioSecondaryDataModel.xsd");
+
+    // external resources
+    ExternalResource resource1;
+    resource1.Name("Third Alignments BAM");
+    resource1.Description("Points to an example Alignments BAM file.");
+    resource1.MetaType("AlignmentFile.AlignmentBamFile");
+    resource1.ResourceId("file:/mnt/path/to/alignments2.bam");
+    resource1.Tags("Example");
+    FileIndex pbi1;
+    pbi1.MetaType("PacBio.Index.PacBioIndex");
+    pbi1.ResourceId("file:/mnt/path/to/alignments2.pbi");
+    resource1.FileIndices().Add(pbi1);
+    dataset.ExternalResources().Add(resource1);
+
+    ExternalResource resource2;
+    resource2.Name("Fourth Alignments BAM");
+    resource2.Description("Points to another example Alignments BAM file, by relative path.");
+    resource2.MetaType("AlignmentFile.AlignmentBamFile");
+    resource2.ResourceId("file:./alignments3.bam");
+    resource2.Tags("Example");
+    FileIndex pbi2;
+    pbi2.MetaType("PacBio.Index.PacBioIndex");
+    pbi2.ResourceId("file:/mnt/path/to/alignments3.pbi");
+    resource2.FileIndices().Add(pbi2);
+    dataset.ExternalResources().Add(resource2);
+
+    // sub-datasets with filters
+    DataSetBase subDataSet1;
+    subDataSet1.Name("HighQuality Read Alignments");
+    subDataSet1.UniqueId("ab95d0a3-94b8-4918-b3af-a3f81bbe519c");
+    subDataSet1.Version("2.3.0");
+    Filter filter1;
+    filter1.Properties().Add(Property("rq", "0.85", ">"));
+    subDataSet1.Filters().Add(filter1);
+    dataset.SubDataSets().Add(subDataSet1);
+
+    DataSetBase subDataSet2;
+    subDataSet2.Name("Alignments to chromosome 1");
+    subDataSet2.UniqueId("ac95d0a3-94b8-4918-b3af-a3f81bbe519c");
+    subDataSet2.Version("2.3.0");
+    Filter filter2;
+    filter2.Properties().Add(Property("RNAME", "chr1", "=="));
+    subDataSet2.Filters().Add(filter2);
+    dataset.SubDataSets().Add(subDataSet2);
+
+    // write dataset
+    const string expectedXml =
+        "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+        "<pbds:AlignmentSet CreatedAt=\"2015-01-27T09:00:01\" MetaType=\"PacBio.DataSet.AlignmentSet\" "
+                "Name=\"DataSet_AlignmentSet\" Tags=\"barcode moreTags mapping mytags\" "
+                "UniqueId=\"b095d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\" "
+                "xmlns=\"http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd\" "
+                "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+                "xsi:schemaLocation=\"http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd "
+                "PacBioSecondaryDataModel.xsd\">\n"
+        "\t<pbbase:ExternalResources>\n"
+        "\t\t<pbbase:ExternalResource Description=\"Points to an example Alignments BAM file.\" "
+                "MetaType=\"AlignmentFile.AlignmentBamFile\" Name=\"Third Alignments BAM\" "
+                "ResourceId=\"file:/mnt/path/to/alignments2.bam\" Tags=\"Example\">\n"
+        "\t\t\t<pbbase:FileIndices>\n"
+        "\t\t\t\t<pbbase:FileIndex MetaType=\"PacBio.Index.PacBioIndex\" ResourceId=\"file:/mnt/path/to/alignments2.pbi\" />\n"
+        "\t\t\t</pbbase:FileIndices>\n"
+        "\t\t</pbbase:ExternalResource>\n"
+        "\t\t<pbbase:ExternalResource Description=\"Points to another example Alignments BAM file, by relative path.\" "
+                "MetaType=\"AlignmentFile.AlignmentBamFile\" Name=\"Fourth Alignments BAM\" "
+                "ResourceId=\"file:./alignments3.bam\" Tags=\"Example\">\n"
+        "\t\t\t<pbbase:FileIndices>\n"
+        "\t\t\t\t<pbbase:FileIndex MetaType=\"PacBio.Index.PacBioIndex\" ResourceId=\"file:/mnt/path/to/alignments3.pbi\" />\n"
+        "\t\t\t</pbbase:FileIndices>\n"
+        "\t\t</pbbase:ExternalResource>\n"
+        "\t</pbbase:ExternalResources>\n"
+        "\t<pbds:DataSets>\n"
+        "\t\t<pbds:DataSet Name=\"HighQuality Read Alignments\" UniqueId=\"ab95d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\">\n"
+        "\t\t\t<pbds:Filters>\n"
+        "\t\t\t\t<pbds:Filter>\n"
+        "\t\t\t\t\t<pbbase:Properties>\n"
+        "\t\t\t\t\t\t<pbbase:Property Name=\"rq\" Operator=\">\" Value=\"0.85\" />\n"
+        "\t\t\t\t\t</pbbase:Properties>\n"
+        "\t\t\t\t</pbds:Filter>\n"
+        "\t\t\t</pbds:Filters>\n"
+        "\t\t</pbds:DataSet>\n"
+        "\t\t<pbds:DataSet Name=\"Alignments to chromosome 1\" UniqueId=\"ac95d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\">\n"
+        "\t\t\t<pbds:Filters>\n"
+        "\t\t\t\t<pbds:Filter>\n"
+        "\t\t\t\t\t<pbbase:Properties>\n"
+        "\t\t\t\t\t\t<pbbase:Property Name=\"RNAME\" Operator=\"==\" Value=\"chr1\" />\n"
+        "\t\t\t\t\t</pbbase:Properties>\n"
+        "\t\t\t\t</pbds:Filter>\n"
+        "\t\t\t</pbds:Filters>\n"
+        "\t\t</pbds:DataSet>\n"
+        "\t</pbds:DataSets>\n"
+        "</pbds:AlignmentSet>\n";
+
+    stringstream s;
+    dataset.SaveToStream(s);
+    EXPECT_EQ(expectedXml, s.str());
+}
+
+static void TestFromXmlString(void)
+{
+    const string inputXml =
+        "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+        "<pbds:AlignmentSet CreatedAt=\"2015-01-27T09:00:01\" MetaType=\"PacBio.DataSet.AlignmentSet\" "
+                "Name=\"DataSet_AlignmentSet\" Tags=\"barcode moreTags mapping mytags\" "
+                "UniqueId=\"b095d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\" "
+                "xmlns=\"http://pacificbiosciences.com/PacBioDataModel.xsd\" "
+                "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+                "xsi:schemaLocation=\"http://pacificbiosciences.com/PacBioDataModel.xsd\">\n"
+        "\t<pbbase:ExternalResources>\n"
+        "\t\t<pbbase:ExternalResource Description=\"Points to an example Alignments BAM file.\" "
+                "MetaType=\"AlignmentFile.AlignmentBamFile\" Name=\"Third Alignments BAM\" "
+                "ResourceId=\"file:/mnt/path/to/alignments2.bam\" Tags=\"Example\">\n"
+        "\t\t\t<pbbase:FileIndices>\n"
+        "\t\t\t\t<pbbase:FileIndex MetaType=\"PacBio.Index.PacBioIndex\" ResourceId=\"file:/mnt/path/to/alignments2.pbi\" />\n"
+        "\t\t\t</pbbase:FileIndices>\n"
+        "\t\t</pbbase:ExternalResource>\n"
+        "\t\t<pbbase:ExternalResource Description=\"Points to another example Alignments BAM file, by relative path.\" "
+                "MetaType=\"AlignmentFile.AlignmentBamFile\" Name=\"Fourth Alignments BAM\" "
+                "ResourceId=\"file:./alignments3.bam\" Tags=\"Example\">\n"
+        "\t\t\t<pbbase:FileIndices>\n"
+        "\t\t\t\t<pbbase:FileIndex MetaType=\"PacBio.Index.PacBioIndex\" ResourceId=\"file:/mnt/path/to/alignments3.pbi\" />\n"
+        "\t\t\t</pbbase:FileIndices>\n"
+        "\t\t</pbbase:ExternalResource>\n"
+        "\t</pbbase:ExternalResources>\n"
+        "\t<pbds:DataSets>\n"
+        "\t\t<pbds:DataSet Name=\"HighQuality Read Alignments\" UniqueId=\"ab95d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\">\n"
+        "\t\t\t<pbds:Filters>\n"
+        "\t\t\t\t<pbds:Filter>\n"
+        "\t\t\t\t\t<pbbase:Properties>\n"
+        "\t\t\t\t\t\t<pbbase:Property Name=\"rq\" Operator=\">\" Value=\"0.85\" />\n"
+        "\t\t\t\t\t</pbbase:Properties>\n"
+        "\t\t\t\t</pbds:Filter>\n"
+        "\t\t\t</pbds:Filters>\n"
+        "\t\t</pbds:DataSet>\n"
+        "\t\t<pbds:DataSet Name=\"Alignments to chromosome 1\" UniqueId=\"ac95d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\">\n"
+        "\t\t\t<pbds:Filters>\n"
+        "\t\t\t\t<pbds:Filter>\n"
+        "\t\t\t\t\t<pbbase:Properties>\n"
+        "\t\t\t\t\t\t<pbbase:Property Name=\"RNAME\" Operator=\"==\" Value=\"chr1\" />\n"
+        "\t\t\t\t\t</pbbase:Properties>\n"
+        "\t\t\t\t</pbds:Filter>\n"
+        "\t\t\t</pbds:Filters>\n"
+        "\t\t</pbds:DataSet>\n"
+        "\t</pbds:DataSets>\n"
+        "</pbds:AlignmentSet>\n";
+
+    const DataSet dataset = DataSet::FromXml(inputXml);
+
+    EXPECT_EQ(DataSet::ALIGNMENT,                     dataset.Type());
+    EXPECT_EQ("2015-01-27T09:00:01",                  dataset.CreatedAt());
+    EXPECT_EQ("PacBio.DataSet.AlignmentSet",          dataset.MetaType());
+    EXPECT_EQ("DataSet_AlignmentSet",                 dataset.Name());
+    EXPECT_EQ("barcode moreTags mapping mytags",      dataset.Tags());
+    EXPECT_EQ("b095d0a3-94b8-4918-b3af-a3f81bbe519c", dataset.UniqueId());
+    EXPECT_EQ("2.3.0",                                dataset.Version());
+    EXPECT_EQ("http://pacificbiosciences.com/PacBioDataModel.xsd", dataset.Attribute("xmlns"));
+    EXPECT_EQ("http://www.w3.org/2001/XMLSchema-instance",         dataset.Attribute("xmlns:xsi"));
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    EXPECT_EQ(2, resources.Size());
+
+    const ExternalResource& resource1 = resources[0];
+    EXPECT_EQ("Third Alignments BAM",                      resource1.Name());
+    EXPECT_EQ("Points to an example Alignments BAM file.", resource1.Description());
+    EXPECT_EQ("AlignmentFile.AlignmentBamFile",            resource1.MetaType());
+    EXPECT_EQ("file:/mnt/path/to/alignments2.bam",         resource1.ResourceId());
+    EXPECT_EQ("Example",                                   resource1.Tags());
+    const FileIndices& fileIndices1 = resource1.FileIndices();
+    EXPECT_EQ(1, fileIndices1.Size());
+    const FileIndex& pbi1 = fileIndices1[0];
+    EXPECT_EQ("PacBio.Index.PacBioIndex",          pbi1.MetaType());
+    EXPECT_EQ("file:/mnt/path/to/alignments2.pbi", pbi1.ResourceId());
+
+    const ExternalResource& resource2 = resources[1];
+    EXPECT_EQ("Fourth Alignments BAM",                     resource2.Name());
+    EXPECT_EQ("Points to another example Alignments BAM file, by relative path.", resource2.Description());
+    EXPECT_EQ("AlignmentFile.AlignmentBamFile",            resource2.MetaType());
+    EXPECT_EQ("file:./alignments3.bam",                    resource2.ResourceId());
+    EXPECT_EQ("Example",                                   resource2.Tags());
+    const FileIndices& fileIndices2 = resource2.FileIndices();
+    EXPECT_EQ(1, fileIndices2.Size());
+    const FileIndex& pbi2 = fileIndices2[0];
+    EXPECT_EQ("PacBio.Index.PacBioIndex",          pbi2.MetaType());
+    EXPECT_EQ("file:/mnt/path/to/alignments3.pbi", pbi2.ResourceId());
+
+    const SubDataSets& subDatasets = dataset.SubDataSets();
+    EXPECT_EQ(2, subDatasets.Size());
+
+    const DataSetBase& sub1 = subDatasets[0];
+    EXPECT_EQ("HighQuality Read Alignments",          sub1.Name());
+    EXPECT_EQ("ab95d0a3-94b8-4918-b3af-a3f81bbe519c", sub1.UniqueId());
+    EXPECT_EQ("2.3.0",                                sub1.Version());
+    const Filters& sub1Filters = sub1.Filters();
+    EXPECT_EQ(1, sub1Filters.Size());
+    const Filter& sub1Filter = sub1Filters[0];
+    EXPECT_EQ(1, sub1Filter.Properties().Size());
+    const Property& property1 = sub1Filter.Properties()[0];
+    EXPECT_EQ("rq",   property1.Name());
+    EXPECT_EQ(">",    property1.Operator());
+    EXPECT_EQ("0.85", property1.Value());
+
+    const DataSetBase& sub2 = subDatasets[1];
+    EXPECT_EQ("Alignments to chromosome 1",          sub2.Name());
+    EXPECT_EQ("ac95d0a3-94b8-4918-b3af-a3f81bbe519c", sub2.UniqueId());
+    EXPECT_EQ("2.3.0",                                sub2.Version());
+    const Filters& sub2Filters = sub2.Filters();
+    EXPECT_EQ(1, sub2Filters.Size());
+    const Filter& sub2Filter = sub2Filters[0];
+    EXPECT_EQ(1, sub2Filter.Properties().Size());
+    const Property& property2 = sub2Filter.Properties()[0];
+    EXPECT_EQ("RNAME",   property2.Name());
+    EXPECT_EQ("==",    property2.Operator());
+    EXPECT_EQ("chr1", property2.Value());
+}
+
+static void TestAli1Xml(void)
+{
+    const DataSet dataset(ali1XmlFn);
+    EXPECT_EQ(DataSet::ALIGNMENT, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"),                  dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.AlignmentSet"),          dataset.MetaType());
+    EXPECT_EQ(string("DataSet_AlignmentSet"),                 dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"),      dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"),                                dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(2, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string("First Alignments BAM"), resource.Name());
+            EXPECT_EQ(string("Points to an example Alignments BAM file."), resource.Description());
+            EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/alignments0.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/alignments0.pbi"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("Second Alignments BAM"), resource.Name());
+            EXPECT_EQ(string("Points to another example Alignments BAM file, by relative path."), resource.Description());
+            EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:./alignments1.bam"),  resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/alignments1.pbi"), index.ResourceId());
+        }
+    }
+
+    const SubDataSets& subdatasets = dataset.SubDataSets();
+    ASSERT_EQ(2, subdatasets.Size());
+    for (size_t i = 0; i < subdatasets.Size(); ++i) {
+        const DataSetBase& subdataset = subdatasets[i];
+        if (i == 0) {
+            EXPECT_EQ(string(""), subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string("HighQuality Read Alignments"), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("ab95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const Filters& filters = subdataset.Filters();
+            ASSERT_EQ(1, filters.Size());
+            const Filter& filter = filters[0];
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("rq"), property.Name());
+            EXPECT_EQ(string("0.85"), property.Value());
+            EXPECT_EQ(string(">"), property.Operator());
+        }
+        else {
+            EXPECT_EQ(string(""), subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string("Alignments to chromosome 1"), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("ac95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const Filters& filters = subdataset.Filters();
+            ASSERT_EQ(1, filters.Size());
+            const Filter& filter = filters[0];
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("RNAME"), property.Name());
+            EXPECT_EQ(string("chr1"), property.Value());
+            EXPECT_EQ(string("=="), property.Operator());
+        }
+    }
+}
+
+static void TestAli2Xml(void)
+{
+    const DataSet dataset(ali2XmlFn);
+    EXPECT_EQ(DataSet::ALIGNMENT, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"),                  dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.AlignmentSet"),          dataset.MetaType());
+    EXPECT_EQ(string("DataSet_AlignmentSet"),                 dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"),      dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"),                                dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(2, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string("First Alignments BAM"), resource.Name());
+            EXPECT_EQ(string("Points to an example Alignments BAM file."), resource.Description());
+            EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/alignments2.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/alignments2.pbi"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("Second Alignments BAM"), resource.Name());
+            EXPECT_EQ(string("Points to another example Alignments BAM file, by relative path."), resource.Description());
+            EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:./alignments3.bam"),  resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/alignments3.pbi"), index.ResourceId());
+        }
+    }
+
+    const SubDataSets& subdatasets = dataset.SubDataSets();
+    ASSERT_EQ(2, subdatasets.Size());
+    for (size_t i = 0; i < subdatasets.Size(); ++i) {
+        const DataSetBase& subdataset = subdatasets[i];
+        if (i == 0) {
+            EXPECT_EQ(string(""), subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string("HighQuality Read Alignments"), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("ab95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const Filters& filters = subdataset.Filters();
+            ASSERT_EQ(1, filters.Size());
+            const Filter& filter = filters[0];
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("rq"), property.Name());
+            EXPECT_EQ(string("0.85"), property.Value());
+            EXPECT_EQ(string(">"), property.Operator());
+        }
+        else {
+            EXPECT_EQ(string(""), subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string("Alignments to chromosome 1"), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("ac95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const Filters& filters = subdataset.Filters();
+            ASSERT_EQ(1, filters.Size());
+            const Filter& filter = filters[0];
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("RNAME"), property.Name());
+            EXPECT_EQ(string("chr1"), property.Value());
+            EXPECT_EQ(string("=="), property.Operator());
+        }
+    }
+}
+
+static void TestAli3Xml(void)
+{
+    const DataSet dataset(ali3XmlFn);
+    EXPECT_EQ(DataSet::ALIGNMENT, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"),                  dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.AlignmentSet"),          dataset.MetaType());
+    EXPECT_EQ(string("DataSet_AlignmentSet"),                 dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"),      dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"),                                dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(2, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string("First Alignments BAM"), resource.Name());
+            EXPECT_EQ(string("Points to an example Alignments BAM file."), resource.Description());
+            EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/alignments2.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/alignments2.pbi"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("Second Alignments BAM"), resource.Name());
+            EXPECT_EQ(string("Points to another example Alignments BAM file, by relative path."), resource.Description());
+            EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:./alignments3.bam"),  resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/alignments3.pbi"), index.ResourceId());
+        }
+    }
+
+    const SubDataSets& subdatasets = dataset.SubDataSets();
+    ASSERT_EQ(2, subdatasets.Size());
+    for (size_t i = 0; i < subdatasets.Size(); ++i) {
+        const DataSetBase& subdataset = subdatasets[i];
+        if (i == 0) {
+            EXPECT_EQ(string(""), subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string("HighQuality Read Alignments"), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("ab95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const Filters& filters = subdataset.Filters();
+            ASSERT_EQ(1, filters.Size());
+            const Filter& filter = filters[0];
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("rq"), property.Name());
+            EXPECT_EQ(string("0.75"), property.Value());
+            EXPECT_EQ(string(">"), property.Operator());
+        }
+        else {
+            EXPECT_EQ(string(""), subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string("Alignments to chromosome 1"), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("ac95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const Filters& filters = subdataset.Filters();
+            ASSERT_EQ(1, filters.Size());
+            const Filter& filter = filters[0];
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("RNAME"), property.Name());
+            EXPECT_EQ(string("chr1"), property.Value());
+            EXPECT_EQ(string("=="), property.Operator());
+        }
+    }
+}
+
+static void TestAli4Xml(void)
+{
+    const DataSet dataset(ali4XmlFn);
+    EXPECT_EQ(DataSet::ALIGNMENT, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"),                  dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.AlignmentSet"),          dataset.MetaType());
+    EXPECT_EQ(string("DataSet_AlignmentSet"),                 dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"),      dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"),                                dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(2, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string("First Alignments BAM"), resource.Name());
+            EXPECT_EQ(string("Points to an example Alignments BAM file."), resource.Description());
+            EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/alignments0.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/alignments0.pbi"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("Second Alignments BAM"), resource.Name());
+            EXPECT_EQ(string("Points to another example Alignments BAM file, by relative path."), resource.Description());
+            EXPECT_EQ(string("AlignmentFile.AlignmentBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:./alignments1.bam"),  resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/alignments1.pbi"), index.ResourceId());
+        }
+    }
+
+    const SubDataSets& subdatasets = dataset.SubDataSets();
+    ASSERT_EQ(2, subdatasets.Size());
+    for (size_t i = 0; i < subdatasets.Size(); ++i) {
+        const DataSetBase& subdataset = subdatasets[i];
+        if (i == 0) {
+            EXPECT_EQ(string(""), subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string("HighQuality Read Alignments"), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("ab95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const Filters& filters = subdataset.Filters();
+            ASSERT_EQ(1, filters.Size());
+            const Filter& filter = filters[0];
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("rq"), property.Name());
+            EXPECT_EQ(string("0.85"), property.Value());
+            EXPECT_EQ(string(">"), property.Operator());
+        }
+        else {
+            EXPECT_EQ(string(""), subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string("Alignments to chromosome 1"), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("ac95d0a3-94b8-4918-b3af-a3f81bbe519c"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const Filters& filters = subdataset.Filters();
+            ASSERT_EQ(1, filters.Size());
+            const Filter& filter = filters[0];
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("RNAME"), property.Name());
+            EXPECT_EQ(string("chr1"), property.Value());
+            EXPECT_EQ(string("=="), property.Operator());
+        }
+    }
+}
+
+static void TestMappingStaggeredXml(void)
+{
+    const DataSet dataset(mappingStaggeredXmlFn);
+    EXPECT_EQ(DataSet::GENERIC, dataset.Type());
+    EXPECT_EQ(string("2015-05-13T10:58:26"),    dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.DataSet"), dataset.MetaType());
+    EXPECT_EQ(string(""), dataset.Name());
+    EXPECT_EQ(string(""), dataset.Tags());
+    EXPECT_EQ(string("30f72098-bc5b-e06b-566c-8b28dda909a8"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(2, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string(""), resource.Name());
+            EXPECT_EQ(string(""), resource.Description());
+            EXPECT_EQ(string(""), resource.MetaType());
+            EXPECT_EQ(string("file:tests/data/bam_mapping_1.bam"), resource.ResourceId());
+            EXPECT_EQ(string(""), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:tests/data/bam_mapping_1.bam.bai"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string(""), resource.Name());
+            EXPECT_EQ(string(""), resource.Description());
+            EXPECT_EQ(string(""), resource.MetaType());
+            EXPECT_EQ(string("file:tests/data/bam_mapping_2.bam"), resource.ResourceId());
+            EXPECT_EQ(string(""), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:tests/data/bam_mapping_2.bam.bai"), index.ResourceId());
+        }
+    }
+
+    const SubDataSets& subdatasets = dataset.SubDataSets();
+    ASSERT_EQ(2, subdatasets.Size());
+    for (size_t i = 0; i < subdatasets.Size(); ++i) {
+        const DataSetBase& subdataset = subdatasets[i];
+        if (i == 0) {
+            EXPECT_EQ(string("2015-05-13T10:58:26"),    subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string(""), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("c5402d06-4643-057c-e300-fe229b4e8909"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const ExternalResources& resources = subdataset.ExternalResources();
+            ASSERT_EQ(1, resources.Size());
+            const ExternalResource& resource = resources[0];
+            EXPECT_EQ(string("file:tests/data/bam_mapping_2.bam"), resource.ResourceId());
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:tests/data/bam_mapping_2.bam.bai"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("2015-05-13T10:58:26"),    subdataset.CreatedAt());
+            EXPECT_EQ(string(""), subdataset.MetaType());
+            EXPECT_EQ(string(""), subdataset.Name());
+            EXPECT_EQ(string(""), subdataset.Tags());
+            EXPECT_EQ(string("f8b54a55-5fb7-706f-ab35-39afc9c86924"), subdataset.UniqueId());
+            EXPECT_EQ(string("2.3.0"), subdataset.Version());
+
+            const ExternalResources& resources = subdataset.ExternalResources();
+            ASSERT_EQ(1, resources.Size());
+            const ExternalResource& resource = resources[0];
+            EXPECT_EQ(string("file:tests/data/bam_mapping_1.bam"), resource.ResourceId());
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:tests/data/bam_mapping_1.bam.bai"), index.ResourceId());
+        }
+    }
+}
+
+static void TestBarcodeXml(void)
+{
+    const DataSet dataset(barcodeXmlFn);
+    EXPECT_EQ(DataSet::BARCODE, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"),    dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.BarcodeSet"), dataset.MetaType());
+    EXPECT_EQ(string("DataSet_BarcodeSet"), dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(1, resources.Size());
+    const ExternalResource& resource = resources[0];
+    EXPECT_EQ(string("First Barcodes FASTA"), resource.Name());
+    EXPECT_EQ(string("Points to an example Barcodes FASTA file."), resource.Description());
+    EXPECT_EQ(string("BarcodeFile.BarcodeFastaFile"), resource.MetaType());
+    EXPECT_EQ(string("file:///mnt/path/to/barcode.fasta"), resource.ResourceId());
+    EXPECT_EQ(string("Example"), resource.Tags());
+
+    const DataSetMetadata& metadata = dataset.Metadata();
+    EXPECT_EQ(string("30"),     metadata.NumRecords());
+    EXPECT_EQ(string("400"),    metadata.TotalLength());
+
+    // access metadata extensions directly for now
+    EXPECT_EQ(string("paired"), metadata.ChildText("BarcodeConstruction"));
+}
+
+static void TestCcsReadXml(void)
+{
+    const DataSet dataset(ccsReadXmlFn);
+    EXPECT_EQ(DataSet::CONSENSUS_READ, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"),    dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.ConsensusReadSet"), dataset.MetaType());
+    EXPECT_EQ(string("DataSet_ConsensusReadSet"), dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(2, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string("First ConsensusRead BAM"), resource.Name());
+            EXPECT_EQ(string("Points to an example ConsensusRead BAM file."), resource.Description());
+            EXPECT_EQ(string("PacBio.ConsensusReadFile.ConsensusReadBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/ccsreads0.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("PacBio.Index.PacBioIndex"), index.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/ccsreads0.pbi"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("Second ConsensusRead BAM"), resource.Name());
+            EXPECT_EQ(string("Points to another example ConsensusRead BAM file."), resource.Description());
+            EXPECT_EQ(string("PacBio.ConsensusReadFile.ConsensusReadBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/ccsreads1.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("PacBio.Index.PacBioIndex"), index.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/ccsreads0.pbi"), index.ResourceId());
+        }
+    }
+}
+
+static void TestHdfSubreadXml(void)
+{
+    // Looks like a bunch of TYPOS in XML file !!
+}
+
+static void TestLambdaContigsXml(void)
+{
+    const DataSet dataset(lambdaContigsXmlFn);
+    EXPECT_EQ(DataSet::REFERENCE, dataset.Type());
+    EXPECT_EQ(string("2015-05-28T10:56:36"),    dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.ReferenceSet"), dataset.MetaType());
+    EXPECT_EQ(string(""), dataset.Name());
+    EXPECT_EQ(string(""), dataset.Tags());
+    EXPECT_EQ(string("596e87db-34f9-d2fd-c905-b017543170e1"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(1, resources.Size());
+    const ExternalResource& resource = resources[0];
+    EXPECT_EQ(string("file:tests/data/lambda_contigs.fasta"), resource.ResourceId());
+}
+
+static void TestPbalchemyXml(void)
+{
+    const DataSet dataset(pbalchemyXmlFn);
+    EXPECT_EQ(DataSet::GENERIC, dataset.Type());
+    EXPECT_EQ(string("2015-05-22T16:56:16"),    dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.DataSet"), dataset.MetaType());
+    EXPECT_EQ(string(""), dataset.Name());
+    EXPECT_EQ(string(""), dataset.Tags());
+    EXPECT_EQ(string("58e3f7c5-24c1-b58b-fbd5-37de268cc2f0"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(1, resources.Size());
+    const ExternalResource& resource = resources[0];
+    EXPECT_EQ(string("file:tests/data/pbalchemy10kbp.pbalign.sorted.pbver1.bam"), resource.ResourceId());
+    const FileIndices& fileIndices = resource.FileIndices();
+    ASSERT_EQ(1, fileIndices.Size());
+    const FileIndex& index = fileIndices[0];
+    EXPECT_EQ(string("file:tests/data/pbalchemy10kbp.pbalign.sorted.pbver1.bam.bai"), index.ResourceId());
+
+    // TYPOs: Should be Filter Properties/Property not Parameter(s)
+
+}
+
+static void TestReferenceXml(void)
+{
+    const DataSet dataset(referenceXmlFn);
+    EXPECT_EQ(DataSet::REFERENCE, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"),    dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.ReferenceSet"), dataset.MetaType());
+    EXPECT_EQ(string("DataSet_ReferenceSet"), dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(1, resources.Size());
+    const ExternalResource& resource = resources[0];
+    EXPECT_EQ(string("First References FASTA"), resource.Name());
+    EXPECT_EQ(string("Points to an example references FASTA file."), resource.Description());
+    EXPECT_EQ(string("PacBio.ReferenceFile.ReferenceFastaFile"), resource.MetaType());
+    EXPECT_EQ(string("file:///mnt/path/to/reference.fasta"), resource.ResourceId());
+    EXPECT_EQ(string("Example"), resource.Tags());
+    const FileIndices& fileIndices = resource.FileIndices();
+    ASSERT_EQ(2, fileIndices.Size());
+    for (size_t i = 0; i < fileIndices.Size(); ++i) {
+        const FileIndex& index = fileIndices[i];
+        if (i == 0) {
+            EXPECT_EQ(string("PacBio.Index.SaWriterIndex"), index.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/reference.fasta.sa"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("PacBio.Index.SamIndex"), index.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/reference.fasta.fai"), index.ResourceId());
+        }
+    }
+
+    const DataSetMetadata& metadata = dataset.Metadata();
+    EXPECT_EQ(string("500"),     metadata.NumRecords());
+    EXPECT_EQ(string("5000000"), metadata.TotalLength());
+
+    // access metadata extensions directly for now
+    EXPECT_EQ(string("Tribble"), metadata.ChildText("Organism"));
+    EXPECT_EQ(string("Diploid"), metadata.ChildText("Ploidy"));
+
+    const internal::DataSetListElement<internal::DataSetElement>& contigs =
+            metadata.Child<internal::DataSetListElement<internal::DataSetElement> >("Contigs");
+    ASSERT_EQ(1, contigs.NumChildren());
+    const internal::DataSetElement& contig = contigs[0];
+    EXPECT_EQ(string("gi|229359445|emb|AM181176.4|"), contig.Attribute("Name"));
+    EXPECT_EQ(string("Pseudomonas fluorescens SBW25 complete genome|quiver"), contig.Attribute("Description"));
+    EXPECT_EQ(string("6722109"), contig.Attribute("Length"));
+    EXPECT_EQ(string("f627c795efad7ce0050ed42b942d408e"), contig.Attribute("Digest"));
+}
+
+static void TestSubread1Xml(void)
+{
+    const DataSet dataset(subread1XmlFn);
+    EXPECT_EQ(DataSet::SUBREAD, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"),    dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.SubreadSet"), dataset.MetaType());
+    EXPECT_EQ(string("DataSet_SubreadSet"), dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(2, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string("First Subreads BAM"), resource.Name());
+            EXPECT_EQ(string("Points to an example Subreads BAM file."), resource.Description());
+            EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/subreads0.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/subreads0.pbi"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("Second Subreads BAM"), resource.Name());
+            EXPECT_EQ(string("Points to another example Subreads BAM file."), resource.Description());
+            EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/subreads1.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/subreads0.pbi"), index.ResourceId());
+        }
+    }
+
+    const Filters& filters = dataset.Filters();
+    ASSERT_EQ(2, filters.Size());
+    for (size_t i = 0; i < filters.Size(); ++i) {
+        const Filter& filter = filters[i];
+        if (i == 0) {
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("rq"), property.Name());
+            EXPECT_EQ(string("0.75"), property.Value());
+            EXPECT_EQ(string(">"), property.Operator());
+        } else {
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("QNAME"), property.Name());
+            EXPECT_EQ(string("100/0/0_100"), property.Value());
+            EXPECT_EQ(string("=="), property.Operator());
+        }
+    }
+
+    const DataSetMetadata& metadata = dataset.Metadata();
+    EXPECT_EQ(string("500"),    metadata.NumRecords());
+    EXPECT_EQ(string("500000"), metadata.TotalLength());
+}
+
+static void TestSubread2Xml(void)
+{
+    const DataSet dataset(subread2XmlFn);
+    EXPECT_EQ(DataSet::SUBREAD, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"),    dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.SubreadSet"), dataset.MetaType());
+    EXPECT_EQ(string("DataSet_SubreadSet"), dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(2, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string("First Subreads BAM"), resource.Name());
+            EXPECT_EQ(string("Points to an example Subreads BAM file."), resource.Description());
+            EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/subreads2.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/subreads2.pbi"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("Second Subreads BAM"), resource.Name());
+            EXPECT_EQ(string("Points to another example Subreads BAM file."), resource.Description());
+            EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/subreads3.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/subreads3.pbi"), index.ResourceId());
+        }
+    }
+
+    const Filters& filters = dataset.Filters();
+    ASSERT_EQ(2, filters.Size());
+    for (size_t i = 0; i < filters.Size(); ++i) {
+        const Filter& filter = filters[i];
+        if (i == 0) {
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("rq"), property.Name());
+            EXPECT_EQ(string("0.75"), property.Value());
+            EXPECT_EQ(string(">"), property.Operator());
+        } else {
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("QNAME"), property.Name());
+            EXPECT_EQ(string("100/0/0_100"), property.Value());
+            EXPECT_EQ(string("=="), property.Operator());
+        }
+    }
+
+    const DataSetMetadata& metadata = dataset.Metadata();
+    EXPECT_EQ(string("500"),    metadata.NumRecords());
+    EXPECT_EQ(string("500000"), metadata.TotalLength());
+}
+
+static void TestSubread3Xml(void)
+{
+    const DataSet dataset(subread3XmlFn);
+    EXPECT_EQ(DataSet::SUBREAD, dataset.Type());
+    EXPECT_EQ(string("2015-01-27T09:00:01"), dataset.CreatedAt());
+    EXPECT_EQ(string("PacBio.DataSet.SubreadSet"), dataset.MetaType());
+    EXPECT_EQ(string("DataSet_SubreadSet"), dataset.Name());
+    EXPECT_EQ(string("barcode moreTags mapping mytags"), dataset.Tags());
+    EXPECT_EQ(string("b095d0a3-94b8-4918-b3af-a3f81bbe519c"), dataset.UniqueId());
+    EXPECT_EQ(string("2.3.0"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema-instance"),         dataset.Attribute("xmlns:xsi"));
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xsi:schemaLocation"));
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(2, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string("First Subreads BAM"), resource.Name());
+            EXPECT_EQ(string("Points to an example Subreads BAM file."), resource.Description());
+            EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/subreads2.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/subreads2.pbi"), index.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("Second Subreads BAM"), resource.Name());
+            EXPECT_EQ(string("Points to another example Subreads BAM file."), resource.Description());
+            EXPECT_EQ(string("SubreadFile.SubreadBamFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/path/to/subreads3.bam"), resource.ResourceId());
+            EXPECT_EQ(string("Example"), resource.Tags());
+
+            const FileIndices& fileIndices = resource.FileIndices();
+            ASSERT_EQ(1, fileIndices.Size());
+            const FileIndex& index = fileIndices[0];
+            EXPECT_EQ(string("file:///mnt/path/to/subreads3.pbi"), index.ResourceId());
+        }
+    }
+
+    const Filters& filters = dataset.Filters();
+    ASSERT_EQ(2, filters.Size());
+    for (size_t i = 0; i < filters.Size(); ++i) {
+        const Filter& filter = filters[i];
+        if (i == 0) {
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("rq"), property.Name());
+            EXPECT_EQ(string("0.85"), property.Value());
+            EXPECT_EQ(string(">"), property.Operator());
+        } else {
+            const Properties& properties = filter.Properties();
+            ASSERT_EQ(1, properties.Size());
+            const Property& property = properties[0];
+            EXPECT_EQ(string("QNAME"), property.Name());
+            EXPECT_EQ(string("100/0/0_100"), property.Value());
+            EXPECT_EQ(string("=="), property.Operator());
+        }
+    }
+
+    const DataSetMetadata& metadata = dataset.Metadata();
+    EXPECT_EQ(string("500"),    metadata.NumRecords());
+    EXPECT_EQ(string("500000"), metadata.TotalLength());
+}
+
+static void TestTransformedXml(void)
+{
+    const DataSet dataset(transformedXmlFn);
+    EXPECT_EQ(DataSet::HDF_SUBREAD, dataset.Type());
+    EXPECT_EQ(string("PacBio.DataSet.SubreadSet"), dataset.MetaType());
+    EXPECT_EQ(string("Subreads from run r001173_42129_130607"), dataset.Name());
+    EXPECT_EQ(string("pacbio.secondary.instrument=RS"), dataset.Tags());
+    EXPECT_EQ(string("abbc9183-b01e-4671-8c12-19efee534647"), dataset.UniqueId());
+    EXPECT_EQ(string("0.5"), dataset.Version());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDataModel.xsd"), dataset.Attribute("xmlns"));
+    EXPECT_EQ(string("http://www.w3.org/2001/XMLSchema"),         dataset.Attribute("xmlns:xs"));
+    EXPECT_EQ(string("http://www.w3.org/2005/xpath-functions"), dataset.Attribute("xmlns:fn"));
+    EXPECT_EQ(string("java:java.util.UUID"), dataset.Attribute("xmlns:uuid"));
+    EXPECT_EQ(string("http://whatever"), dataset.Attribute("xmlns:bax"));
+
+    EXPECT_EQ(0, dataset.Filters().Size());
+    EXPECT_EQ(0, dataset.SubDataSets().Size());
+
+    const ExternalResources& resources = dataset.ExternalResources();
+    ASSERT_EQ(3, resources.Size());
+    for (size_t i = 0; i < resources.Size(); ++i) {
+        const ExternalResource& resource = resources[i];
+        if (i == 0) {
+            EXPECT_EQ(string("PacBio.SubreadFile.BaxFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.0.bax.h5"),
+                      resource.ResourceId());
+        }
+        else if (i == 1) {
+            EXPECT_EQ(string("PacBio.SubreadFile.BaxFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.1.bax.h5"),
+                      resource.ResourceId());
+        }
+        else {
+            EXPECT_EQ(string("PacBio.SubreadFile.BaxFile"), resource.MetaType());
+            EXPECT_EQ(string("file:///mnt/secondary-siv/testdata/LIMS/2590727/0001/Analysis_Results/m130608_033634_42129_c100515232550000001823076608221351_s1_p0.2.bax.h5"),
+                      resource.ResourceId());
+        }
+    }
+
+    const DataSetMetadata& metadata = dataset.Metadata();
+    EXPECT_EQ(string("150000"),   metadata.NumRecords());
+    EXPECT_EQ(string("50000000"), metadata.TotalLength());
+}
diff --git a/tests/src/test_DataSetMetadata.cpp b/tests/src/test_DataSetMetadata.cpp
new file mode 100644
index 0000000..ac5d469
--- /dev/null
+++ b/tests/src/test_DataSetMetadata.cpp
@@ -0,0 +1,63 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/dataset/DataSet.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+//static inline
+//DataSet CreateDataSet(void)
+//{
+//    DataSet d;
+//    d.Name("foo");
+//    return d;
+//}
+
+} // namespace tests
+
+TEST(DataSetMetadataTest, DummyTest) {
+    EXPECT_TRUE(true);
+}
diff --git a/tests/src/test_DataSetQuery.cpp b/tests/src/test_DataSetQuery.cpp
new file mode 100644
index 0000000..da9b41e
--- /dev/null
+++ b/tests/src/test_DataSetQuery.cpp
@@ -0,0 +1,434 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "TestData.h"
+#include <boost/any.hpp>
+#include <gtest/gtest.h>
+#include <pbbam/EntireFileQuery.h>
+#include <pbbam/GenomicIntervalQuery.h>
+#include <pbbam/ZmwQuery.h>
+#include <pbbam/ZmwGroupQuery.h>
+#include <pbbam/DataSet.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string ex2BamFn     = tests::Data_Dir + "/ex2.bam";
+const string bamMappingFn = tests::Data_Dir + "/dataset/bam_mapping.bam";
+const string bamMappingFn_1 = tests::Data_Dir + "/dataset/bam_mapping_1.bam";
+const string bamMappingFn_2 = tests::Data_Dir + "/dataset/bam_mapping_2.bam";
+const string group_fofn   = tests::Data_Dir + "/test_group_query/group.fofn";
+const string group_file1  = tests::Data_Dir + "/test_group_query/test1.bam";
+const string group_file2  = tests::Data_Dir + "/test_group_query/test2.bam";
+const string group_file3  = tests::Data_Dir + "/test_group_query/test3.bam";
+
+const vector<string> group_file1_names =
+{
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/24962/0_427"
+};
+
+const vector<string> group_file2_names =
+{
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/14743/2114_2531",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/14743/2579_4055",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/14743/4101_5571",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/14743/5615_6237"
+};
+
+const vector<string> group_file3_names =
+{
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/45203/0_893",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/45203/0_893",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/46835/3759_4005",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/46835/4052_4686",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/46835/4732_4869",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/47698/9482_9628",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/47698/9675_10333",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/47698/10378_10609",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49050/48_1132",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49050/48_1132",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49194/0_798",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49194/845_1541",
+    "m140905_042212_sidney_c100564852550000001823085912221377_s1_X0/49521/0_134"
+};
+
+static inline
+bool InGroup(const string& name, const vector<string>& group)
+{
+    for (const string& s : group) {
+        if (s == name)
+            return true;
+    }
+    return false;
+}
+
+TEST(DataSetQueryTest, EntireFileQueryTest)
+{
+    // single file
+    EXPECT_NO_THROW(
+    {
+        BamFile bamFile(ex2BamFn);
+
+        DataSet dataset;
+        dataset.ExternalResources().Add(bamFile);
+
+        int count =0;
+        EntireFileQuery query(dataset); // from DataSet object
+        for (const BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(3307, count);
+
+        count = 0;
+        EntireFileQuery query2(ex2BamFn); // from BAM filename
+        for (const BamRecord& record : query2) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(3307, count);
+
+        count = 0;
+        EntireFileQuery query3(bamFile); // from BamFile object
+        for (const BamRecord& record : query3) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(3307, count);
+    });
+
+    // simple multi-file (actually just same file twice)
+    EXPECT_NO_THROW(
+    {
+        BamFile bamFile(ex2BamFn);
+
+        DataSet dataset;
+        dataset.ExternalResources().Add(bamFile);
+        dataset.ExternalResources().Add(bamFile);
+
+        int count =0;
+        EntireFileQuery query(dataset);
+        for (const BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(3307*2, count);
+    });
+
+    // true multi-file dataset
+    EXPECT_NO_THROW(
+    {
+        BamFile file1(group_file1); // 1 read
+        BamFile file2(group_file2); // 4 reads
+        BamFile file3(group_file3); // 13 reads
+
+        DataSet dataset;
+        dataset.ExternalResources().Add(file1);
+        dataset.ExternalResources().Add(file2);
+        dataset.ExternalResources().Add(file3);
+
+        int count = 0;
+        EntireFileQuery query(dataset);
+        for (const BamRecord& record : query) {
+
+            // ensure sequential merge of files
+            if (count == 0)     EXPECT_TRUE(InGroup(record.FullName(), group_file1_names));
+            else if (count < 5) EXPECT_TRUE(InGroup(record.FullName(), group_file2_names));
+            else                EXPECT_TRUE(InGroup(record.FullName(), group_file3_names));
+
+            ++count;
+        }
+        EXPECT_EQ(18, count);
+    });
+
+    // same as above, from FOFN
+    EXPECT_NO_THROW(
+    {
+        int count = 0;
+
+        DataSet dataset(group_fofn);
+        EntireFileQuery query(dataset);
+        for (const BamRecord& record : query) {
+
+            // ensure sequential merge of files
+            if (count == 0)     EXPECT_TRUE(InGroup(record.FullName(), group_file1_names));
+            else if (count < 5) EXPECT_TRUE(InGroup(record.FullName(), group_file2_names));
+            else                EXPECT_TRUE(InGroup(record.FullName(), group_file3_names));
+
+            ++count;
+        }
+        EXPECT_EQ(18, count);
+    });
+}
+
+TEST(DataSetQueryTest, GenomicIntervalQueryTest)
+{
+    // single file
+    EXPECT_NO_THROW(
+    {
+        DataSet dataset(ex2BamFn); // from BAM filename
+
+        // count records
+        int count = 0;
+        GenomicInterval interval("seq1", 0, 100);
+        GenomicIntervalQuery query(interval, dataset);
+        for (const BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(39, count);
+
+        // adjust interval and pass back in
+        count = 0;
+        interval.Start(500);
+        interval.Stop(600);
+        query.Interval(interval);
+        for (const BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(166, count);
+
+        // adjust again
+        count = 0;
+        interval.Name("seq2");
+        interval.Start(0);
+        interval.Stop(100);
+        query.Interval(interval);
+        for (const BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(83, count);
+
+        // unknown ref
+        count = 0;
+        interval.Name("does not exist");
+        interval.Start(0);
+        interval.Stop(100);
+        EXPECT_THROW(
+            query.Interval(interval);
+        , std::exception);
+        for (const BamRecord& record : query) {    // iteration is still safe, just returns no data
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(0, count);
+
+        // adjust again - make sure we can read a real region after an invalid one
+        interval.Name("seq2");
+        interval.Start(0);
+        interval.Stop(100);
+        query.Interval(interval);
+        count = 0;
+        for (const BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(83, count);
+    });
+
+    // multi-file (same twice)
+    EXPECT_NO_THROW(
+    {
+        BamFile bamFile(ex2BamFn);
+
+        DataSet dataset;
+        dataset.ExternalResources().Add(bamFile);
+        dataset.ExternalResources().Add(bamFile);
+
+        // count records & also ensure sorted merge
+        int count = 0;
+        int prevId = 0;
+        int prevPos = 0;
+
+        GenomicInterval interval("seq1", 0, 100);
+        GenomicIntervalQuery query(interval, dataset);
+        for (const BamRecord& record : query) {
+
+            EXPECT_TRUE(record.ReferenceId()   >= prevId);
+            EXPECT_TRUE(record.ReferenceStart() >= prevPos);
+
+            prevId = record.ReferenceId();
+            prevPos = record.ReferenceStart();
+            ++count;
+        }
+        EXPECT_EQ(39*2, count);
+
+        // adjust interval and pass back in
+        count = 0;
+        interval.Start(500);
+        interval.Stop(600);
+        query.Interval(interval);
+        for (const BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(166*2, count);
+
+        // adjust again
+        count = 0;
+        interval.Name("seq2");
+        interval.Start(0);
+        interval.Stop(100);
+        query.Interval(interval);
+        for (const BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(83*2, count);
+
+        // unknown ref
+        count = 0;
+        interval.Name("does not exist");
+        interval.Start(0);
+        interval.Stop(100);
+        EXPECT_THROW(
+            query.Interval(interval);
+        , std::exception);
+        for (const BamRecord& record : query) {    // iteration is still safe, just returns no data
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(0, count);
+
+        // adjust again - make sure we can read a real region after an invalid one
+        interval.Name("seq2");
+        interval.Start(0);
+        interval.Stop(100);
+        query.Interval(interval);
+        count = 0;
+        for (const BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(83*2, count);
+    });
+
+    // multi file BAM
+
+}
+
+// TODO: implement me
+TEST(DataSetQueryTest, QNameQueryTest)
+{
+    EXPECT_TRUE(true);
+}
+
+TEST(DataSetQueryTest, ZmwQueryTest)
+{
+    const std::vector<int32_t> whitelist = { 13473, 38025 };
+
+    // single file
+    EXPECT_NO_THROW(
+    {
+        BamFile bamFile(bamMappingFn);
+        bamFile.EnsurePacBioIndexExists();
+        DataSet dataset(bamFile);
+
+        int count = 0;
+        ZmwQuery query(whitelist, dataset);
+        for (const BamRecord& record: query) {
+            const int32_t holeNumber = record.HoleNumber();
+            EXPECT_TRUE(holeNumber == 13473 || holeNumber == 38025);
+            ++count;
+        }
+        EXPECT_EQ(5, count);
+    });
+
+    // multi-file
+}
+
+TEST(DataSetQueryTest, ZmwGroupQueryTest)
+{
+    const std::vector<int32_t> whitelist = { 13473, 38025 };
+
+    // single-file
+    EXPECT_NO_THROW(
+    {
+        BamFile bamFile(bamMappingFn);
+        bamFile.EnsurePacBioIndexExists();
+        DataSet dataset(bamFile);
+
+        int count = 0;
+        int32_t groupZmw = -1;
+        ZmwGroupQuery query(whitelist, dataset);
+        for (const vector<BamRecord>& group : query)  {
+            for (const BamRecord& record: group) {
+                if (groupZmw == -1)
+                    groupZmw = record.HoleNumber();
+                EXPECT_EQ(groupZmw, record.HoleNumber());
+                ++count;
+            }
+            groupZmw = -1;
+        }
+        EXPECT_EQ(5, count);
+    });
+
+    // multi-file
+    EXPECT_NO_THROW(
+    {
+        BamFile bamFile(bamMappingFn);
+        bamFile.EnsurePacBioIndexExists();
+
+        BamFile bamFile_1(bamMappingFn_1);
+        bamFile_1.EnsurePacBioIndexExists();
+
+        BamFile bamFile_2(bamMappingFn_2);
+        bamFile_2.EnsurePacBioIndexExists();
+
+        DataSet dataset;
+        dataset.ExternalResources().Add(ExternalResource(bamFile));
+        dataset.ExternalResources().Add(ExternalResource(bamFile_1));
+        dataset.ExternalResources().Add(ExternalResource(bamFile_2));
+
+        int count = 0;
+        int32_t groupZmw = -1;
+        ZmwGroupQuery query(whitelist, dataset);
+        for (const vector<BamRecord>& group : query)  {
+            for (const BamRecord& record: group) {
+                if (groupZmw == -1)
+                    groupZmw = record.HoleNumber();
+                EXPECT_EQ(groupZmw, record.HoleNumber());
+                ++count;
+            }
+            groupZmw = -1;
+        }
+        EXPECT_EQ(15, count);
+    });
+}
diff --git a/tests/src/test_DataSetXsd.cpp b/tests/src/test_DataSetXsd.cpp
new file mode 100644
index 0000000..177b758
--- /dev/null
+++ b/tests/src/test_DataSetXsd.cpp
@@ -0,0 +1,124 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/DataSet.h>
+#include <pbbam/DataSetXsd.h>
+#include <string>
+#include <sstream>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(DataSetXsdTest, DefaultsOk)
+{
+    NamespaceRegistry registry;
+
+    const NamespaceInfo& baseInfo = registry.Namespace(XsdType::BASE_DATA_MODEL);
+    const NamespaceInfo& dsInfo   = registry.Namespace(XsdType::DATASETS);
+    const NamespaceInfo& defaultInfo = registry.DefaultNamespace();
+
+    EXPECT_EQ(XsdType::DATASETS, registry.DefaultXsd());
+
+    EXPECT_EQ(string("pbds"),   dsInfo.Name());
+    EXPECT_EQ(string("pbbase"), baseInfo.Name());
+    EXPECT_EQ(string("pbds"),   defaultInfo.Name());
+
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioBaseDataModel.xsd"), baseInfo.Uri());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDatasets.xsd"),      dsInfo.Uri());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDatasets.xsd"),      defaultInfo.Uri());
+}
+
+TEST(DataSetXsdTest, EditDefaultOk)
+{
+    NamespaceRegistry registry;
+    registry.SetDefaultXsd(XsdType::DATASETS);
+
+    const NamespaceInfo& defaultInfo = registry.DefaultNamespace();
+
+    EXPECT_EQ(XsdType::DATASETS, registry.DefaultXsd());
+    EXPECT_EQ(string("pbds"), defaultInfo.Name());
+    EXPECT_EQ(string("http://pacificbiosciences.com/PacBioDatasets.xsd"), defaultInfo.Uri());
+}
+
+TEST(DataSetXsdTest, EditRegistryOk)
+{
+    NamespaceRegistry registry;
+    registry.Register(XsdType::DATASETS, NamespaceInfo("custom", "http://custom/uri.xsd"));
+
+    const NamespaceInfo& dsInfo = registry.Namespace(XsdType::DATASETS);
+
+    EXPECT_EQ(string("custom"),                dsInfo.Name());
+    EXPECT_EQ(string("http://custom/uri.xsd"), dsInfo.Uri());
+}
+
+TEST(DataSetXsdTest, EditDatasetRegistry)
+{
+    DataSet dataset(DataSet::ALIGNMENT);
+    dataset.CreatedAt("2015-01-27T09:00:01");
+    dataset.MetaType("PacBio.DataSet.AlignmentSet");
+    dataset.Name("DataSet_AlignmentSet");
+    dataset.Tags("barcode moreTags mapping mytags");
+    dataset.UniqueId("b095d0a3-94b8-4918-b3af-a3f81bbe519c");
+    dataset.Version("2.3.0");
+    dataset.Attribute("xmlns","http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd")
+           .Attribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
+           .Attribute("xsi:schemaLocation",
+                      "http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd PacBioSecondaryDataModel.xsd");
+    dataset.ExternalResources().Add(ExternalResource("Fake.MetaType", "filename"));
+
+    dataset.Namespaces().Register(XsdType::BASE_DATA_MODEL, NamespaceInfo("custom", "http://custom/uri.xsd"));
+
+    const string expectedXml =
+        "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+        "<pbds:AlignmentSet CreatedAt=\"2015-01-27T09:00:01\" MetaType=\"PacBio.DataSet.AlignmentSet\" "
+                "Name=\"DataSet_AlignmentSet\" Tags=\"barcode moreTags mapping mytags\" "
+                "UniqueId=\"b095d0a3-94b8-4918-b3af-a3f81bbe519c\" Version=\"2.3.0\" "
+                "xmlns=\"http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd\" "
+                "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+                "xsi:schemaLocation=\"http://pacificbiosciences.com/PacBioSecondaryDataModel.xsd "
+                "PacBioSecondaryDataModel.xsd\">\n"
+        "\t<custom:ExternalResources>\n"
+        "\t\t<custom:ExternalResource MetaType=\"Fake.MetaType\" ResourceId=\"filename\" />\n"
+        "\t</custom:ExternalResources>\n"
+        "</pbds:AlignmentSet>\n";
+
+    stringstream s;
+    dataset.SaveToStream(s);
+    EXPECT_EQ(expectedXml, s.str());
+}
diff --git a/tests/src/test_EndToEnd.cpp b/tests/src/test_EndToEnd.cpp
new file mode 100644
index 0000000..7fe951e
--- /dev/null
+++ b/tests/src/test_EndToEnd.cpp
@@ -0,0 +1,252 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#define protected public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <htslib/sam.h>
+#include <pbbam/BamFile.h>
+#include <pbbam/BamWriter.h>
+#include <pbbam/EntireFileQuery.h>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <cstdio>
+#include <cstdlib>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+struct Bam1Deleter
+{
+    void operator()(bam1_t* b) {
+        if (b)
+            bam_destroy1(b);
+        b = nullptr;
+    }
+};
+
+struct SamFileDeleter
+{
+    void operator()(samFile* file) {
+        if (file)
+            sam_close(file);
+        file = nullptr;
+    }
+};
+
+struct BamHdrDeleter
+{
+    void operator()(bam_hdr_t* hdr) {
+        if (hdr)
+            bam_hdr_destroy(hdr);
+        hdr = nullptr;
+    }
+};
+
+const string inputBamFn        = tests::Data_Dir + "/ex2.bam";
+const string goldStandardSamFn = tests::Data_Dir + "/ex2.sam";
+const string generatedBamFn    = tests::Data_Dir + "/generated.bam";
+const string generatedSamFn    = tests::Data_Dir + "/generated.sam";
+
+static inline
+int Samtools_Bam2Sam(const string& bamFilename,
+                     const string& samFilename)
+{
+    const std::string& convertArgs = string("view -h ") + bamFilename + string(" > ")  + samFilename;
+    const std::string& convertCommandLine = tests::Samtools_Bin + string(" ") + convertArgs;
+    return system(convertCommandLine.c_str());
+}
+
+static inline
+int Diff_Sam2Sam(const string& fn1,
+                 const string& fn2)
+{
+    const std::string& diffCommandLine = string("diff ") + fn1 + string(" ") + fn2;
+    return system(diffCommandLine.c_str());
+}
+
+static inline
+void RemoveGeneratedFiles(const string& fn1,
+                          const string& fn2)
+{
+    remove(fn1.c_str());
+    remove(fn2.c_str());
+}
+
+// sanity check for rest of tests below
+TEST(EndToEndTest, ReadPureHtslib_WritePureHtslib)
+{
+    // open input BAM file
+    PBBAM_SHARED_PTR<samFile> inputBam(sam_open(inputBamFn.c_str(), "r"), SamFileDeleter());
+    EXPECT_TRUE(inputBam != 0);
+    PBBAM_SHARED_PTR<bam_hdr_t> header(sam_hdr_read(inputBam.get()), BamHdrDeleter());
+
+    // open output BAM file
+    PBBAM_SHARED_PTR<samFile> outputBam(sam_open(generatedBamFn.c_str(), "wb"), SamFileDeleter());
+    sam_hdr_write(outputBam.get(), header.get());
+
+    // copy BAM file
+    PBBAM_SHARED_PTR<bam1_t> record(bam_init1(), Bam1Deleter());
+    while (sam_read1(inputBam.get(), header.get(), record.get()) >= 0)
+        sam_write1(outputBam.get(), header.get(), record.get());
+
+    // need to close files before comparing (to flush any buffers)
+    inputBam.reset();
+    outputBam.reset();
+
+    // convert to sam & diff against gold standard
+
+    // TODO: disabled for now - need to replace non-PB BAM files in test cases
+
+//    const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+//    const int diffRet    = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+//    EXPECT_EQ(0, convertRet);
+//    EXPECT_EQ(0, diffRet);
+
+    // clean up
+    RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+}
+
+TEST(EndToEndTest, ReadBamRecord_WriteBamRecord_SingleThread)
+{
+    EXPECT_NO_THROW(
+    {
+        // open input BAM file
+        BamFile bamFile(inputBamFn);
+
+        // open output BAM file
+        BamWriter writer(generatedBamFn, bamFile.Header(), BamWriter::DefaultCompression, 1);
+
+        // copy BAM file
+        EntireFileQuery entireFile(bamFile);
+        for (const BamRecord& record : entireFile)
+            writer.Write(record);
+    });
+
+    // convert to sam & diff against gold standard
+    const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+    const int diffRet    = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+    EXPECT_EQ(0, convertRet);
+    EXPECT_EQ(0, diffRet);
+
+    // clean up
+    RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+}
+
+TEST(EndToEndTest, ReadBamRecord_WriteBamRecord_APIDefaultThreadCount)
+{
+    EXPECT_NO_THROW(
+    {
+        // open input BAM file
+        BamFile bamFile(inputBamFn);
+
+        // open output BAM file
+        BamWriter writer(generatedBamFn, bamFile.Header());
+
+        // copy BAM file
+        EntireFileQuery entireFile(bamFile);
+        for (const BamRecord& record : entireFile)
+            writer.Write(record);
+    });
+
+    // convert to sam & diff against gold standard
+    const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+    const int diffRet    = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+    EXPECT_EQ(0, convertRet);
+    EXPECT_EQ(0, diffRet);
+
+    // clean up
+    RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+
+}
+
+TEST(EndToEndTest, ReadBamRecord_WriteBamRecord_SystemDefaultThreadCount)
+{
+    EXPECT_NO_THROW(
+    {
+        // open input BAM file
+        BamFile bamFile(inputBamFn);
+
+        // open output BAM file
+        BamWriter writer(generatedBamFn, bamFile.Header(), BamWriter::DefaultCompression, 0);
+
+        // copy BAM file
+        EntireFileQuery entireFile(bamFile);
+        for (const BamRecord& record : entireFile)
+            writer.Write(record);
+    });
+
+    // convert to sam & diff against gold standard
+    const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+    const int diffRet    = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+    EXPECT_EQ(0, convertRet);
+    EXPECT_EQ(0, diffRet);
+
+    // clean up
+    RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+}
+
+TEST(EndToEndTest, ReadBamRecord_WriteBamRecord_UserThreadCount)
+{
+    EXPECT_NO_THROW(
+    {
+        // open input BAM file
+        BamFile bamFile(inputBamFn);
+
+        // open output BAM file
+        BamWriter writer(generatedBamFn, bamFile.Header(), BamWriter::DefaultCompression, 6);
+
+        // copy BAM file
+        EntireFileQuery entireFile(bamFile);
+        for (const BamRecord& record : entireFile)
+            writer.Write(record);
+    });
+
+    // convert to sam & diff against gold standard
+    const int convertRet = Samtools_Bam2Sam(generatedBamFn, generatedSamFn);
+    const int diffRet    = Diff_Sam2Sam(goldStandardSamFn, generatedSamFn);
+    EXPECT_EQ(0, convertRet);
+    EXPECT_EQ(0, diffRet);
+
+    // clean up
+    RemoveGeneratedFiles(generatedBamFn, generatedSamFn);
+}
diff --git a/tests/src/test_EntireFileQuery.cpp b/tests/src/test_EntireFileQuery.cpp
new file mode 100644
index 0000000..b444f2b
--- /dev/null
+++ b/tests/src/test_EntireFileQuery.cpp
@@ -0,0 +1,151 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/EntireFileQuery.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string inputBamFn = tests::Data_Dir + "/ex2.bam";
+
+TEST(EntireFileQueryTest, CountRecords)
+{
+    EXPECT_NO_THROW(
+    {
+        // open input BAM file
+        BamFile bamFile(inputBamFn);
+
+        // count records
+        int count = 0;
+        EntireFileQuery entireFile(bamFile);
+        for (const BamRecord& record : entireFile) {
+            (void)record;
+            ++count;
+        }
+
+        EXPECT_EQ(3307, count);
+    });
+}
+
+TEST(EntireFileQueryTest, NonConstBamRecord)
+{
+    EXPECT_NO_THROW(
+    {
+        // open input BAM file
+        BamFile bamFile(inputBamFn);
+
+        // count records
+        int count = 0;
+        EntireFileQuery entireFile(bamFile);
+        for (BamRecord& record : entireFile) {
+            (void)record;
+            ++count;
+        }
+
+        EXPECT_EQ(3307, count);
+    });
+}
+
+TEST(BamRecordTest, HandlesDeletionOK)
+{
+    // this file raised no error in Debug mode, but segfaulted when
+    // trying to access the aligned qualities in Release mode
+
+    EXPECT_NO_THROW(
+    {
+        // open input BAM file
+        const string problemBamFn = tests::Data_Dir + "/segfault.bam";
+        BamFile bamFile(problemBamFn);
+
+        // count records
+        int count = 0;
+        EntireFileQuery entireFile(bamFile);
+        for (const BamRecord& record : entireFile) {
+
+            const auto rawQualities     = record.Qualities(Orientation::GENOMIC, false);
+            const auto alignedQualities = record.Qualities(Orientation::GENOMIC, true);
+
+            const string rawExpected =
+                "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";
+
+            // 1=1D98=
+            const string alignedExpected =
+                "I!IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";
+
+            EXPECT_EQ(rawExpected,     rawQualities.Fastq());
+            EXPECT_EQ(alignedExpected, alignedQualities.Fastq());
+
+            ++count;
+        }
+
+        EXPECT_EQ(1, count);
+    });
+}
+
+
+TEST(BamRecordTest, ReferenceName)
+{
+    // check reference name of first record
+//    {
+        const string exampleBam  = tests::Data_Dir + "/ex2.bam";
+        BamFile bamFile(exampleBam);
+        EntireFileQuery records(bamFile);
+
+        auto it = records.begin();
+        auto record = *it;
+
+//        EXPECT_EQ("seq1", records.begin()->ReferenceName());
+//    }
+
+//    // unmapped records have no reference name, should throw
+//    {
+//        const string exampleBam  = tests::Data_Dir + "/unmap1.bam";
+//        BamFile bamFile(exampleBam);
+//        staging::EntireFileQuery records(bamFile);
+
+//        EXPECT_THROW(records.begin()->ReferenceName(), std::exception);
+//    }
+}
+
+// add add'l special cases as needed
diff --git a/tests/src/test_Frames.cpp b/tests/src/test_Frames.cpp
new file mode 100644
index 0000000..797eb6a
--- /dev/null
+++ b/tests/src/test_Frames.cpp
@@ -0,0 +1,97 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/Frames.h>
+#include <string>
+#include <vector>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+namespace tests {
+
+static const vector<uint16_t> testFrames =
+{
+    0,  8,  140, 0,   0,  7,   4,  0,  85, 2,
+    1,  3,  2,   10,  1,  20,  47, 10, 9,  60,
+    20, 3,  12,  5,   13, 165, 6,  14, 22, 12,
+    2,  4,  9,   218, 27, 3,   15, 2,  17, 2,
+    45, 24, 89,  10,  7,  1,   11, 15, 0,  7,
+    0,  28, 17,  12,  6,  10,  37, 0,  12, 52,
+    0,  7,  1,   14,  3,  26,  12, 0,  20, 17,
+    2,  13, 2,   9,   13, 7,   15, 29, 3,   6,
+    2,  1,  28,  10,  3,  14,  7,  1,  22, 1,
+    6,  6,  0,   19,  31, 6,   2,  14, 0,  0,
+    1000, 947, 948
+};
+
+static const vector<uint8_t> encodedFrames =
+{
+    0,     8,  102,   0,   0,   7,   4,   0,  75,   2,   1,   3,   2,
+    10,    1,   20,  47,  10,   9,  60,  20,   3,  12,   5,  13, 115,
+    6,    14,   22,  12,   2,   4,   9, 135,  27,   3,  15,   2,  17,
+    2,    45,   24,  77,  10,   7,   1,  11,  15,   0,   7,   0,  28,
+    17,   12,    6,  10,  37,   0,  12,  52,   0,   7,   1,  14,   3,
+    26,   12,    0,  20,  17,   2,  13,   2,   9,  13,   7,  15,  29,
+    3,     6,    2,   1,  28,  10,   3,  14,   7,   1,  22,   1,   6,
+    6,     0,   19,  31,   6,   2,  14,   0,   0,
+    255, 254,  255
+};
+
+} // namespace tests
+
+TEST(FramesTest, Constructors)
+{
+    const Frames f;
+    ASSERT_TRUE(f.Data().empty());
+
+    const Frames f2(tests::testFrames);
+    const auto d = f2.Data();
+    ASSERT_EQ(tests::testFrames, d);
+}
+
+TEST(FramesTest, Encoded)
+{
+    const Frames f(tests::testFrames);
+    const auto e = f.Encode();
+    ASSERT_EQ(tests::encodedFrames, e);
+}
diff --git a/tests/src/test_GenomicIntervalQuery.cpp b/tests/src/test_GenomicIntervalQuery.cpp
new file mode 100644
index 0000000..0fb98bc
--- /dev/null
+++ b/tests/src/test_GenomicIntervalQuery.cpp
@@ -0,0 +1,182 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/GenomicIntervalQuery.h>
+#include <iostream>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string inputBamFn = tests::Data_Dir + "/ex2.bam";
+
+TEST(GenomicIntervalQueryTest, ReuseQueryAndCountRecords)
+{
+    const string seq1 = "seq1";
+    const string seq2 = "seq2";
+
+    // open input BAM file
+    BamFile bamFile(inputBamFn);
+
+    // count records
+    int count = 0;
+    GenomicInterval interval(seq1, 0, 100);
+    GenomicIntervalQuery query(interval, bamFile);
+    for (const BamRecord& record : query) {
+        (void)record;
+        ++count;
+    }
+    EXPECT_EQ(39, count);
+
+    // adjust interval and pass back in
+    count = 0;
+    interval.Start(500);
+    interval.Stop(600);
+    query.Interval(interval);
+    for (const BamRecord& record : query) {
+        (void)record;
+        ++count;
+    }
+    EXPECT_EQ(166, count);
+
+    // adjust again
+    count = 0;
+    interval.Name(seq2);
+    interval.Start(0);
+    interval.Stop(100);
+    query.Interval(interval);
+    for (const BamRecord& record : query) {
+        (void)record;
+        ++count;
+    }
+    EXPECT_EQ(83, count);
+
+    // unknown ref
+    count = 0;
+    interval.Name("does not exist");
+    interval.Start(0);
+    interval.Stop(100);
+    EXPECT_THROW(
+        query.Interval(interval);
+    , std::exception);
+    for (const BamRecord& record : query) {    // iteration is still safe, just returns no data
+        (void)record;
+        ++count;
+    }
+    EXPECT_EQ(0, count);
+
+    // adjust again - make sure we can read a real region after an invalid one
+    interval.Name(seq2);
+    interval.Start(0);
+    interval.Stop(100);
+    query.Interval(interval);
+    count = 0;
+    for (const BamRecord& record : query) {
+        (void)record;
+        ++count;
+    }
+    EXPECT_EQ(83, count);
+}
+
+TEST(GenomicIntervalQueryTest, NonConstBamRecord)
+{
+    EXPECT_NO_THROW(
+    {
+        // open input BAM file
+        BamFile bamFile(inputBamFn);
+
+        // count records
+        int count = 0;
+        GenomicInterval interval("seq1", 0, 100);
+        GenomicIntervalQuery query(interval, bamFile);
+        for (BamRecord& record : query) {
+            (void)record;
+            ++count;
+        }
+        EXPECT_EQ(39, count);
+    });
+}
+
+//TEST(GenomicIntervalQueryTest, WorksWithBamRecordImpl)
+//{
+//    // open input BAM file
+//    BamFile bamFile(inputBamFn);
+//    EXPECT_TRUE(bamFile);
+
+//    const int id = bamFile.ReferenceId("seq1");
+//    EXPECT_TRUE(id != -1);
+
+//    // count records
+//    int count = 0;
+//    GenomicInterval interval(id, 0, 100);
+//    GenomicIntervalQuery query(interval, bamFile);
+//    EXPECT_TRUE(query);
+//    for (const BamRecordImpl& record : query) {
+//        (void)record;
+//        ++count;
+//    }
+//    EXPECT_EQ(39, count);
+//}
+
+//TEST(GenomicIntervalQueryTest, WorksWithNonConstBamRecordImpl)
+//{
+//    // open input BAM file
+//    BamFile bamFile(inputBamFn);
+//    EXPECT_TRUE(bamFile);
+
+//    const int id = bamFile.ReferenceId("seq1");
+//    EXPECT_TRUE(id != -1);
+
+//    // count records
+//    int count = 0;
+//    GenomicInterval interval(id, 0, 100);
+//    GenomicIntervalQuery query(interval, bamFile);
+//    EXPECT_TRUE(query);
+//    for (BamRecordImpl& record : query) {
+//        (void)record;
+//        ++count;
+//    }
+//    EXPECT_EQ(39, count);
+//}
+
+// add special cases as needed
diff --git a/tests/src/test_GroupQuery.cpp b/tests/src/test_GroupQuery.cpp
new file mode 100644
index 0000000..2f6769f
--- /dev/null
+++ b/tests/src/test_GroupQuery.cpp
@@ -0,0 +1,149 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Yuan Li
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/ZmwGroupQuery.h>
+#include <pbbam/GroupQuery.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+
+const string dataDir = tests::Data_Dir + "/test_group_query/";
+const string test1fn = string(dataDir) + "test1.bam";
+const string test2fn = string(dataDir) + "test2.bam";
+const string test3fn = string(dataDir) + "test3.bam";
+
+//void TestZmwQuery(const string & fn, const vector<int> & expected)
+//{
+//    EXPECT_NO_THROW(
+//    {
+//        BamFile bamFile(fn);
+//        vector<int> counts;
+//        ZmwGroupQuery zmwQuery(bamFile);
+//        for (const vector<BamRecord>& records : zmwQuery)
+//            counts.push_back(records.size());
+//        EXPECT_EQ(expected, counts);
+//    });
+//}
+
+//void TestNoneConstZmwQuery(const string & fn, const vector<int> & expected)
+//{
+//    EXPECT_NO_THROW(
+//    {
+//        BamFile bamFile(fn);
+//        vector<int> counts;
+//        ZmwGroupQuery zmwQuery(bamFile);
+//        for (vector<BamRecord>& records : zmwQuery)
+//            counts.push_back(records.size());
+//        EXPECT_EQ(expected, counts);
+//    });
+//}
+
+void TestQNameQuery(const string & fn, const vector<int> & expected) 
+{
+    EXPECT_NO_THROW(
+    {
+        BamFile bamFile(fn);
+        vector<int> counts;
+        QNameQuery qQuery(bamFile);
+        for (const vector<BamRecord>& records : qQuery) 
+            counts.push_back(records.size());
+        EXPECT_EQ(expected, counts);
+    });
+}
+
+void TestNoneConstQNameQuery(const string & fn, const vector<int> & expected) 
+{    
+    EXPECT_NO_THROW(
+    {
+        BamFile bamFile(fn);
+        vector<int> counts;
+        QNameQuery qQuery(bamFile);
+        for (vector<BamRecord>& records : qQuery) 
+            counts.push_back(records.size());
+        EXPECT_EQ(expected, counts);
+    });
+}
+
+TEST(ZmwQueryTest, CountZmwSizes)
+{
+//    // test case 1 has exactly one bamRecord.
+//    string fn = test1fn;
+//    vector<int> expected({1});
+//    TestZmwQuery(fn, expected);
+//    TestNoneConstZmwQuery(fn, expected);
+
+//    // test case 2 has four bamRecords from the same zmw.
+//    fn = test2fn;
+//    expected = vector<int>({4});
+//    TestZmwQuery(fn, expected);
+//    TestNoneConstZmwQuery(fn, expected);
+
+//    // more bamRecords in test case 3.
+//    fn = test3fn;
+//    expected = {2,3,3,2,2,1};
+//    TestZmwQuery(fn, expected);
+//    TestNoneConstZmwQuery(fn, expected);
+}
+
+TEST(QNameQueryTest, CountQSizes)
+{
+    // test case 1 has exactly one bamRecord.
+    string fn = test1fn;
+    vector<int> expected({1});
+    TestQNameQuery(fn, expected);
+    TestNoneConstQNameQuery(fn, expected);
+
+    // test case 2 has bamRecords of four subreads.
+    fn = test2fn;
+    expected = {1, 1, 1, 1};
+    TestQNameQuery(fn, expected);
+    TestNoneConstQNameQuery(fn, expected);
+
+    fn = test3fn;
+    expected = {2,1,1,1,1,1,1,2,1,1,1};
+    TestQNameQuery(fn, expected);
+    TestNoneConstQNameQuery(fn, expected);
+}
+
diff --git a/tests/src/test_IndexedFastaReader.cpp b/tests/src/test_IndexedFastaReader.cpp
new file mode 100644
index 0000000..68a0331
--- /dev/null
+++ b/tests/src/test_IndexedFastaReader.cpp
@@ -0,0 +1,212 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include "pbbam/IndexedFastaReader.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/EntireFileQuery.h"
+#include <gtest/gtest.h>
+#include <iostream>
+#include <sstream>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string lambdaFasta = tests::Data_Dir + "/lambdaNEB.fa";
+const string singleInsertionBam = tests::Data_Dir + "/aligned.bam";
+
+TEST(IndexedFastaReaderTests, PrintSingleInsertion)
+{
+    IndexedFastaReader r(lambdaFasta);
+
+    // Open BAM file
+    BamFile bamFile(singleInsertionBam);
+    EntireFileQuery bamQuery(bamFile);
+
+    auto it = bamQuery.begin();
+    auto record = *it++;
+    EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+        r.ReferenceSubsequence(record, Orientation::NATIVE, true));
+    EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+        r.ReferenceSubsequence(record, Orientation::NATIVE, true, true));
+    EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+        r.ReferenceSubsequence(record, Orientation::GENOMIC, true));
+    EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+        r.ReferenceSubsequence(record, Orientation::GENOMIC, true, true));
+    record = *it++;
+    EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+        r.ReferenceSubsequence(record, Orientation::NATIVE, true));
+    EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+        r.ReferenceSubsequence(record, Orientation::NATIVE, true, true));
+    EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+        r.ReferenceSubsequence(record, Orientation::GENOMIC, true));
+    EXPECT_EQ("GGCTGCAGTGTACAGCGGTCAGGAGGCC-ATTGATGCCGGACTGGCTGAT",
+        r.ReferenceSubsequence(record, Orientation::GENOMIC, true, true));
+    record = *it++;
+    EXPECT_EQ("----------------------------------------------------AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+        r.ReferenceSubsequence(record, Orientation::NATIVE, true));
+    EXPECT_EQ("AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+        r.ReferenceSubsequence(record, Orientation::NATIVE, true, true));
+    EXPECT_EQ("----------------------------------------------------AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+        r.ReferenceSubsequence(record, Orientation::GENOMIC, true));
+    EXPECT_EQ("AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+        r.ReferenceSubsequence(record, Orientation::GENOMIC, true, true));
+    record = *it++;
+    EXPECT_EQ("AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA----------------------------------------------------",
+        r.ReferenceSubsequence(record, Orientation::GENOMIC, true));
+    EXPECT_EQ("----------------------------------------------------TTGCCGCTGTT-ACCGTGCTGCGATCTTCTGCCATCGACGGACGTCCCACATTGGTGACTT",
+        r.ReferenceSubsequence(record, Orientation::NATIVE, true));
+    EXPECT_EQ("AAGTCACCAATGTGGGACGTCCGTCGATGGCAGAAGATCGCAGCACGGT-AACAGCGGCAA",
+        r.ReferenceSubsequence(record, Orientation::GENOMIC, true, true));
+    EXPECT_EQ("TTGCCGCTGTT-ACCGTGCTGCGATCTTCTGCCATCGACGGACGTCCCACATTGGTGACTT",
+        r.ReferenceSubsequence(record, Orientation::NATIVE, true, true));
+
+    // {
+    //     std::stringstream output;
+    //     auto itSS = bamQuery.begin();
+    //     {
+    //         const auto recordSS = *itSS;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::NATIVE, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::NATIVE, true, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::GENOMIC, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+    //         output << std::endl;
+    //     }
+    //     ++itSS;
+    //     {
+    //         const auto recordSS = *itSS;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::NATIVE, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::NATIVE, true, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::GENOMIC, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+    //         output << std::endl;
+    //     }
+    //     ++itSS;
+    //     {
+    //         const auto recordSS = *itSS;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::NATIVE, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::NATIVE, true, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::GENOMIC, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+    //         output << std::endl;
+    //     }
+    //     ++itSS;
+    //     {
+    //         const auto recordSS = *itSS;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::GENOMIC, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::NATIVE, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::GENOMIC, true, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::GENOMIC, true, true) << std::endl;
+    //         output << std::endl;
+    //         output << r.ReferenceSubsequence(recordSS, Orientation::NATIVE, true, true) << std::endl;
+    //         output << recordSS.Sequence(Orientation::NATIVE, true, true) << std::endl;
+    //     }
+    //     std::cerr << output.str();
+    // }
+}
+
+TEST(IndexedFastaReaderTests, ReadLambda)
+{
+    IndexedFastaReader r(lambdaFasta);
+
+    EXPECT_TRUE(r.HasSequence("lambda_NEB3011"));
+    EXPECT_FALSE(r.HasSequence("dog"));
+    EXPECT_EQ(1, r.NumSequences());
+    EXPECT_EQ(48502, r.SequenceLength("lambda_NEB3011"));
+
+    string seq = r.Subsequence("lambda_NEB3011:0-10");
+    EXPECT_EQ("GGGCGGCGAC", seq);
+
+    string seq2 = r.Subsequence("lambda_NEB3011", 0, 10);
+    EXPECT_EQ("GGGCGGCGAC", seq2);
+
+    // subsequence extending beyond bounds returns clipped
+    string seq3 = r.Subsequence("lambda_NEB3011", 48400, 48600);
+    EXPECT_EQ(102, seq3.length());
+
+    // bad subsequence
+}
+
+TEST(IndexedFastaReaderTests, Errors)
+{
+    IndexedFastaReader r(lambdaFasta);
+
+    //
+    // attempt access without "opening"
+    //
+    // EXPECT_THROW(r.NumSequences(), std::exception);
+    // EXPECT_THROW(r.HasSequence("lambda_NEB3011"), std::exception);
+    // EXPECT_THROW(r.SequenceLength("lambda_NEB3011"), std::exception);
+    // EXPECT_THROW(r.Subsequence("lambda_NEB3011:0-10"), std::exception);
+
+    //
+    // invalid accesses after opening
+    //
+    EXPECT_THROW(r.SequenceLength("dog"), std::exception);
+    EXPECT_THROW(r.Subsequence("dog:0-10"), std::exception);
+}
diff --git a/tests/src/test_Intervals.cpp b/tests/src/test_Intervals.cpp
new file mode 100644
index 0000000..14231b1
--- /dev/null
+++ b/tests/src/test_Intervals.cpp
@@ -0,0 +1,330 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/GenomicInterval.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(IntervalTest, Constructors)
+{
+    Interval<Position> empty;
+    Interval<Position> singleton(4);
+    Interval<Position> normal(5, 8);
+
+    EXPECT_EQ(0, empty.Start());
+    EXPECT_EQ(0, empty.Stop());
+
+    EXPECT_EQ(4, singleton.Start());
+    EXPECT_EQ(5, singleton.Stop());
+
+    EXPECT_EQ(5, normal.Start());
+    EXPECT_EQ(8, normal.Stop());
+
+    // TODO: check out-of-order intervals, etc
+}
+
+TEST(IntervalTest, EqualityTest)
+{
+    Interval<Position> empty;
+    Interval<Position> empty2;
+
+    Interval<Position> singleton(4);
+    Interval<Position> sameAsSingleton(4,5);
+
+    Interval<Position> normal(5, 8);
+    Interval<Position> sameAsNormal(5, 8);
+
+    Interval<Position> different(20, 40);
+
+    // self-equality
+    EXPECT_TRUE(empty == empty);
+    EXPECT_TRUE(singleton == singleton);
+    EXPECT_TRUE(normal == normal);
+    EXPECT_TRUE(different == different);
+
+    // same values equality
+    EXPECT_TRUE(empty == empty2);
+    EXPECT_TRUE(singleton == sameAsSingleton);
+    EXPECT_TRUE(normal == sameAsNormal);
+
+    // different values
+    EXPECT_FALSE(empty == singleton);
+    EXPECT_FALSE(empty == normal);
+    EXPECT_FALSE(empty == different);
+    EXPECT_FALSE(singleton == normal);
+    EXPECT_FALSE(normal == different);
+}
+
+TEST(IntervalTest, Copy)
+{
+    Interval<Position> interval1(5, 8);
+    Interval<Position> interval2(interval1);
+    Interval<Position> interval3 = interval1;
+
+    EXPECT_TRUE(interval1 == interval1);
+    EXPECT_TRUE(interval1 == interval2);
+    EXPECT_TRUE(interval1 == interval3);
+}
+
+TEST(IntervalTest, Modifier)
+{
+    Interval<Position> interval1(5, 8);
+    Interval<Position> interval2(interval1);
+    interval2.Start(2);
+    interval2.Stop(10);
+
+    EXPECT_FALSE(interval1 == interval2);
+    EXPECT_EQ(2, interval2.Start());
+    EXPECT_EQ(10, interval2.Stop());
+}
+
+TEST(IntervalTest, CoverTest)
+{
+    Interval<Position> interval1(2, 4);
+    Interval<Position> interval2(3, 5);
+    Interval<Position> interval3(6, 8);
+    Interval<Position> interval4(1, 7);
+    Interval<Position> interval5(5, 8);
+
+    EXPECT_TRUE(interval1.Covers(interval1));    // self-cover: a.covers(a)
+    EXPECT_TRUE(interval1.CoveredBy(interval1)); // self-cover: a.coveredBy(a)
+
+    EXPECT_TRUE(interval2.CoveredBy(interval4)); // a.coveredBy(b)
+    EXPECT_TRUE(interval4.Covers(interval2));    // thus b.covers(a)
+    EXPECT_FALSE(interval2 == interval4);        // if a != b
+    EXPECT_FALSE(interval2.Covers(interval4));   // then !a.covers(b)
+
+    EXPECT_FALSE(interval2.Covers(interval3));    // completely disjoint
+    EXPECT_FALSE(interval3.Covers(interval2));
+    EXPECT_FALSE(interval2.CoveredBy(interval3));
+    EXPECT_FALSE(interval3.CoveredBy(interval2));
+
+    EXPECT_FALSE(interval2.Covers(interval5));    // a.stop == b.start
+    EXPECT_FALSE(interval2.CoveredBy(interval5));
+
+    EXPECT_TRUE(interval5.Covers(interval3));    // shared endpoint, start contained, thus a.covers(b)
+    EXPECT_TRUE(interval3.CoveredBy(interval5)); // and b.coveredBy(a)
+}
+
+TEST(IntervalTest, IntersectTest)
+{
+    Interval<Position> interval1(2, 4);
+    Interval<Position> interval2(3, 5);
+    Interval<Position> interval3(6, 8);
+    Interval<Position> interval4(1, 7);
+    Interval<Position> interval5(5, 8);
+
+    EXPECT_TRUE(interval1.Intersects(interval1)); // self-intersection: a.intersects(a)
+
+    EXPECT_TRUE(interval1.Intersects(interval2)); // if a.intersects(b)
+    EXPECT_TRUE(interval2.Intersects(interval1)); // then b.intersects(a)
+
+    EXPECT_TRUE(interval4.Covers(interval1));      // if b.covers(a),
+    EXPECT_TRUE(interval1.Intersects(interval4));  // then a.intersects(b)
+    EXPECT_TRUE(interval4.Intersects(interval1));  // and b.intersects(a)
+
+    EXPECT_FALSE(interval2.Intersects(interval3)); // b.start > a.stop (obvious disjoint)
+    EXPECT_FALSE(interval2.Intersects(interval5)); // b.start == a.stop (intervals are right open, so disjoint)
+}
+
+TEST(IntervalTest, ValidityTest)
+{
+    Interval<Position> interval1;        // default ctor
+    Interval<Position> interval2(0,0);   // start == stop (zero)
+    Interval<Position> interval3(4,4);   // start == stop (nonzero)
+    Interval<Position> interval4(0,1);   // start < stop  (start is zero)
+    Interval<Position> interval5(4,5);   // start < stop  (start is nonzero)
+    Interval<Position> interval6(5,4);   // start > stop
+
+    EXPECT_FALSE(interval1.IsValid());
+    EXPECT_FALSE(interval2.IsValid());
+    EXPECT_FALSE(interval3.IsValid());
+    EXPECT_TRUE(interval4.IsValid());
+    EXPECT_TRUE(interval5.IsValid());
+    EXPECT_FALSE(interval6.IsValid());
+}
+
+TEST(IntervalTest, LengthTest)
+{
+    Interval<Position> interval1(2, 4);
+    Interval<Position> interval2(3, 5);
+    Interval<Position> interval3(6, 8);
+    Interval<Position> interval4(1, 7);
+    Interval<Position> interval5(5, 8);
+
+    EXPECT_EQ(2, interval1.Length());
+    EXPECT_EQ(2, interval2.Length());
+    EXPECT_EQ(2, interval3.Length());
+    EXPECT_EQ(6, interval4.Length());
+    EXPECT_EQ(3, interval5.Length());
+
+    // TODO: check out-of-order intervals, etc
+}
+
+TEST(GenomicIntervalTest, DefaultConstructor)
+{
+    GenomicInterval gi;
+    EXPECT_EQ("", gi.Name());
+    EXPECT_EQ(0,  gi.Start());
+    EXPECT_EQ(0,  gi.Stop());
+}
+
+TEST(GenomicIntervalTest, ExplicitConstructor)
+{
+    GenomicInterval gi("foo", 100, 200);
+    EXPECT_EQ("foo", gi.Name());
+    EXPECT_EQ(100,   gi.Start());
+    EXPECT_EQ(200,   gi.Stop());
+}
+
+TEST(GenomicIntervalTest, RegionStringConstructor)
+{
+    GenomicInterval gi("foo:100-200");
+    EXPECT_EQ("foo", gi.Name());
+    EXPECT_EQ(100,   gi.Start());
+    EXPECT_EQ(200,   gi.Stop());
+
+    GenomicInterval refOnly("foo");
+    EXPECT_EQ("foo", refOnly.Name());
+    EXPECT_EQ(0,     refOnly.Start());
+    EXPECT_EQ(1<<29, refOnly.Stop()); // htslib's default, "read-to-end" interval stop
+}
+
+TEST(GenomicIntervalTest, Copy)
+{
+    GenomicInterval interval1("foo", 10, 20);
+    GenomicInterval interval2(interval1);
+    GenomicInterval interval3 = interval1;
+
+    EXPECT_TRUE(interval1 == interval1);
+    EXPECT_TRUE(interval1 == interval2);
+    EXPECT_TRUE(interval1 == interval3);
+}
+
+TEST(GenomicIntervalTest, Modifiers)
+{
+    GenomicInterval interval1("foo", 10, 20);
+
+    // modify individual properties
+    GenomicInterval interval2(interval1);
+    interval2.Name("bar");
+    interval2.Start(2);
+    interval2.Stop(10);
+
+    // modify interval as a whole
+    GenomicInterval interval3(interval1);
+    interval3.Interval(interval2.Interval());
+
+    EXPECT_FALSE(interval1 == interval2);
+    EXPECT_EQ("bar", interval2.Name());
+    EXPECT_EQ(2,     interval2.Start());
+    EXPECT_EQ(10,    interval2.Stop());
+
+    EXPECT_EQ(interval1.Name(),     interval3.Name());
+    EXPECT_EQ(interval2.Interval(), interval3.Interval());
+}
+
+TEST(GenomicIntervalTest, CoverTest)
+{
+    GenomicInterval interval1("foo", 2, 4);
+    GenomicInterval interval2("foo", 3, 5);
+    GenomicInterval interval3("foo", 6, 8);
+    GenomicInterval interval4("foo", 1, 7);
+    GenomicInterval interval5("foo", 5, 8);
+
+    // same as interval2, but different ref
+    GenomicInterval interval6(interval2);
+    interval6.Name("bar");
+
+    EXPECT_TRUE(interval1.Covers(interval1));    // self-cover: a.covers(a)
+    EXPECT_TRUE(interval1.CoveredBy(interval1)); // self-cover: a.coveredBy(a)
+
+    EXPECT_TRUE(interval2.CoveredBy(interval4)); // a.coveredBy(b)
+    EXPECT_TRUE(interval4.Covers(interval2));    // thus b.covers(a)
+    EXPECT_FALSE(interval2 == interval4);        // if a != b
+    EXPECT_FALSE(interval2.Covers(interval4));   // then !a.covers(b)
+
+    EXPECT_FALSE(interval6.CoveredBy(interval4)); // interval 6 has same start/stop as 2, w/ different ref
+    EXPECT_FALSE(interval4.Covers(interval6));    //
+    EXPECT_FALSE(interval6 == interval4);         //
+    EXPECT_FALSE(interval6.Covers(interval4));    //
+
+    EXPECT_FALSE(interval2.Covers(interval3));    // completely disjoint
+    EXPECT_FALSE(interval3.Covers(interval2));
+    EXPECT_FALSE(interval2.CoveredBy(interval3));
+    EXPECT_FALSE(interval3.CoveredBy(interval2));
+
+    EXPECT_FALSE(interval2.Covers(interval5));    // a.stop == b.start
+    EXPECT_FALSE(interval2.CoveredBy(interval5));
+
+    EXPECT_TRUE(interval5.Covers(interval3));    // shared endpoint, start contained, thus a.covers(b)
+    EXPECT_TRUE(interval3.CoveredBy(interval5)); // and b.coveredBy(a)
+}
+
+TEST(GenomicIntervalTest, ValidityTest)
+{
+    GenomicInterval interval1;            // default ctor
+    GenomicInterval interval2("foo",0,0);     // valid id, start == stop (zero)
+    GenomicInterval interval3("foo",4,4);     // valid id, start == stop (nonzero)
+    GenomicInterval interval4("foo",0,1);     // valid id, start < stop  (start is zero)
+    GenomicInterval interval5("foo",4,5);     // valid id, start < stop  (start is nonzero)
+    GenomicInterval interval6("foo",5,4);     // valid id, start > stop
+    GenomicInterval interval7("",0,0);    // invalid id, start == stop (zero)
+    GenomicInterval interval8("",4,4);    // invalid id, start == stop (nonzero)
+    GenomicInterval interval9("",0,1);    // invalid id, start < stop  (start is zero)
+    GenomicInterval interval10("",4,5);   // invalid id, start < stop  (start is nonzero)
+    GenomicInterval interval11("",5,4);   // invalid id, start > stop
+
+    EXPECT_FALSE(interval1.IsValid());
+    EXPECT_FALSE(interval2.IsValid());
+    EXPECT_FALSE(interval3.IsValid());
+    EXPECT_TRUE(interval4.IsValid());
+    EXPECT_TRUE(interval5.IsValid());
+    EXPECT_FALSE(interval6.IsValid());
+    EXPECT_FALSE(interval7.IsValid());
+    EXPECT_FALSE(interval8.IsValid());
+    EXPECT_FALSE(interval9.IsValid());
+    EXPECT_FALSE(interval10.IsValid());
+    EXPECT_FALSE(interval11.IsValid());
+}
diff --git a/tests/src/test_PacBioIndex.cpp b/tests/src/test_PacBioIndex.cpp
new file mode 100644
index 0000000..c841c68
--- /dev/null
+++ b/tests/src/test_PacBioIndex.cpp
@@ -0,0 +1,768 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/BamFile.h>
+#include <pbbam/BamWriter.h>
+#include <pbbam/EntireFileQuery.h>
+#include <pbbam/PbiBuilder.h>
+#include <pbbam/PbiIndex.h>
+#include <pbbam/PbiRawData.h>
+#include <pbbam/internal/PbiIndex_p.h>
+#include <string>
+#include <cstdio>
+#include <cstdlib>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+const string test2BamFn = tests::Data_Dir + "/test_group_query/test2.bam";
+
+namespace PacBio {
+namespace BAM {
+namespace tests {
+
+static
+PbiRawData Test2Bam_RawIndex(void)
+{
+    PbiRawData index;
+    index.Version(PbiFile::Version_3_0_0);
+    index.FileSections(PbiFile::SUBREAD | PbiFile::MAPPED);
+    index.NumReads(4);
+
+    PbiRawSubreadData& subreadData = index.SubreadData();
+    subreadData.rgId_       = { -1197849594, -1197849594, -1197849594, -1197849594 };
+    subreadData.qStart_     = { 2114, 2579, 4101, 5615 };
+    subreadData.qEnd_       = { 2531, 4055, 5571, 6237 };
+    subreadData.holeNumber_ = { 14743, 14743, 14743, 14743 };
+    subreadData.readQual_   = { 901, 901, 901, 901 };
+    subreadData.fileOffset_ =  { 35651584, 35655123, 35667124, 35679164 };
+
+    PbiRawMappedData& mappedData = index.mappedData_;
+    mappedData.tId_       = { 0, 0, 0, 0 };
+    mappedData.tStart_    = { 9507, 8453, 8455, 9291 };
+    mappedData.tEnd_      = { 9903, 9902, 9893, 9900 };
+    mappedData.aStart_    = { 2130, 2581, 4102, 5619 };
+    mappedData.aEnd_      = { 2531, 4055, 5560, 6237 };
+    mappedData.revStrand_ = { 0, 1, 0, 1 };
+    mappedData.mapQV_     = { 254, 254, 254, 254 };
+    mappedData.nM_        = { 384, 1411, 1393, 598 };
+    mappedData.nMM_       = { 0, 0, 0, 0 };             // old 'M' ops were just replaced w/ '=', no 'X'
+
+    // reference & barcode data are empty for this file
+    return index;
+}
+
+static
+void ExpectRawIndicesEqual(const PbiRawData& expected, const PbiRawData& actual)
+{
+    // header data
+    EXPECT_EQ(expected.Version(),      actual.Version());
+    EXPECT_EQ(expected.FileSections(), actual.FileSections());
+    EXPECT_EQ(expected.NumReads(),     actual.NumReads());
+
+    // subread data
+    const PbiRawSubreadData& e = expected.SubreadData();
+    const PbiRawSubreadData& a = actual.SubreadData();
+    EXPECT_EQ(e.rgId_,       a.rgId_);
+    EXPECT_EQ(e.qStart_,     a.qStart_);
+    EXPECT_EQ(e.qEnd_,       a.qEnd_);
+    EXPECT_EQ(e.holeNumber_, a.holeNumber_);
+    EXPECT_EQ(e.readQual_,   a.readQual_);
+    EXPECT_EQ(e.fileOffset_, a.fileOffset_);
+
+    // mapped data
+    EXPECT_EQ(expected.HasMappedData(), actual.HasMappedData());
+    if (expected.HasMappedData() && actual.HasMappedData()) {
+        const PbiRawMappedData& e = expected.MappedData();
+        const PbiRawMappedData& a = actual.MappedData();
+        EXPECT_EQ(e.tId_,       a.tId_);
+        EXPECT_EQ(e.tStart_,    a.tStart_);
+        EXPECT_EQ(e.tEnd_,      a.tEnd_);
+        EXPECT_EQ(e.aStart_,    a.aStart_);
+        EXPECT_EQ(e.aEnd_,      a.aEnd_);
+        EXPECT_EQ(e.revStrand_, a.revStrand_);
+        EXPECT_EQ(e.nM_,        a.nM_);
+        EXPECT_EQ(e.nMM_,       a.nMM_);
+        EXPECT_EQ(e.mapQV_,     a.mapQV_);
+    }
+
+    // reference data
+    EXPECT_EQ(expected.HasReferenceData(), actual.HasReferenceData());
+    if (expected.HasReferenceData() && actual.HasReferenceData()) {
+        const PbiRawReferenceData& e = expected.ReferenceData();
+        const PbiRawReferenceData& a = actual.ReferenceData();
+        EXPECT_EQ(e.entries_, a.entries_);
+    }
+
+    // barcode data
+    EXPECT_EQ(expected.HasBarcodeData(), actual.HasBarcodeData());
+    if (expected.HasBarcodeData() && actual.HasBarcodeData()) {
+        const PbiRawBarcodeData& e = expected.BarcodeData();
+        const PbiRawBarcodeData& a = actual.BarcodeData();
+        EXPECT_EQ(e.bcLeft_,   a.bcLeft_);
+        EXPECT_EQ(e.bcRight_,  a.bcRight_);
+        EXPECT_EQ(e.bcQual_,   a.bcQual_);
+        EXPECT_EQ(e.ctxtFlag_, a.ctxtFlag_);
+    }
+}
+
+static
+bool SubreadLookupsEqual(const internal::SubreadLookupData& lhs,
+                         const internal::SubreadLookupData& rhs)
+{
+    return (lhs.rgId_ == rhs.rgId_ &&
+            lhs.qStart_ == rhs.qStart_ &&
+            lhs.qEnd_ == rhs.qEnd_ &&
+            lhs.holeNumber_ == rhs.holeNumber_ &&
+            lhs.readQual_ == rhs.readQual_ &&
+            lhs.fileOffset_ == rhs.fileOffset_);
+}
+
+static
+bool MappedLookupsEqual(const internal::MappedLookupData& lhs,
+                        const internal::MappedLookupData& rhs)
+{
+    return (lhs.tId_ == rhs.tId_ &&
+            lhs.tStart_ == rhs.tStart_ &&
+            lhs.tEnd_ == rhs.tEnd_ &&
+            lhs.aStart_ == rhs.aStart_ &&
+            lhs.aEnd_ == rhs.aEnd_ &&
+            lhs.nM_ == rhs.nM_ &&
+            lhs.nMM_ == rhs.nMM_ &&
+            lhs.mapQV_ == rhs.mapQV_ &&
+            lhs.forwardStrand_ == rhs.forwardStrand_ &&
+            lhs.reverseStrand_ == rhs.reverseStrand_);
+}
+
+static
+bool ReferenceLookupsEqual(const internal::ReferenceLookupData& lhs,
+                           const internal::ReferenceLookupData& rhs)
+{
+    return lhs.references_ == rhs.references_;
+}
+
+static
+bool BarcodeLookupsEqual(const internal::BarcodeLookupData& lhs,
+                         const internal::BarcodeLookupData& rhs)
+{
+    return (lhs.bcLeft_ == rhs.bcLeft_ &&
+            lhs.bcRight_ == rhs.bcRight_ &&
+            lhs.bcQual_ == rhs.bcQual_ &&
+            lhs.ctxtFlag_ == rhs.ctxtFlag_);
+}
+
+static
+bool PbiIndicesEqual(const PbiIndex& lhs, const PbiIndex& rhs)
+{
+    using namespace ::PacBio::BAM;
+    const unique_ptr<internal::PbiIndexPrivate>& lhsImpl = lhs.d_;
+    const unique_ptr<internal::PbiIndexPrivate>& rhsImpl = rhs.d_;
+    if (lhsImpl == rhsImpl)
+        return true;
+    if (lhsImpl == nullptr || rhsImpl == nullptr)
+        return false;
+
+    // metadata compare
+    if (lhsImpl->version_  != rhsImpl->version_  ||
+        lhsImpl->sections_ != rhsImpl->sections_ ||
+        lhsImpl->numReads_ != rhsImpl->numReads_)
+    { return false; }
+
+    // component compare
+    if ( !SubreadLookupsEqual(lhsImpl->subreadData_,     rhsImpl->subreadData_)   ||
+         !MappedLookupsEqual(lhsImpl->mappedData_,       rhsImpl->mappedData_)    ||
+         !ReferenceLookupsEqual(lhsImpl->referenceData_, rhsImpl->referenceData_) ||
+         !BarcodeLookupsEqual(lhsImpl->barcodeData_,     rhsImpl->barcodeData_))
+    { return false; }
+
+    // if we get here, OK
+    return true;
+}
+
+} // namespace tests
+} // namespace BAM
+} // namespace PacBio
+
+TEST(PacBioIndexTest, CreateFromExistingBam)
+{
+    // do this in temp directory, so we can ensure write access
+    const string tempDir    = "/tmp/";
+    const string tempBamFn  = tempDir + "test2.bam";
+    const string tempPbiFn  = tempBamFn + ".pbi";
+    string cmd("cp ");
+    cmd += test2BamFn;
+    cmd += " ";
+    cmd += tempDir;
+    int cmdResult = system(cmd.c_str());
+    (void)cmdResult;
+
+    BamFile bamFile(tempBamFn);
+    PbiFile::CreateFrom(bamFile);
+    EXPECT_EQ(tempPbiFn, bamFile.PacBioIndexFilename());
+
+    PbiRawData index(bamFile.PacBioIndexFilename());
+    EXPECT_EQ(PbiFile::Version_3_0_0,  index.Version());
+    EXPECT_EQ(4, index.NumReads());
+    EXPECT_TRUE(index.HasMappedData());
+
+    const PbiRawData& expectedIndex = tests::Test2Bam_RawIndex();
+    tests::ExpectRawIndicesEqual(expectedIndex, index);
+
+    // clean up temp file(s)
+    remove(tempBamFn.c_str());
+    remove(tempPbiFn.c_str());
+}
+
+TEST(PacBioIndexTest, CreateOnTheFly)
+{
+    // do this in temp directory, so we can ensure write access
+    const string tempDir    = "/tmp/";
+    const string tempBamFn  = tempDir + "temp.bam";
+    const string tempPbiFn  = tempBamFn + ".pbi";
+
+    // create PBI on the fly from input BAM while we write to new file
+    {
+        BamFile bamFile(test2BamFn);
+        BamHeader header = bamFile.Header();
+
+        BamWriter writer(tempBamFn, header);
+        PbiBuilder builder(tempPbiFn, header.Sequences().size());
+
+        int64_t vOffset = 0;
+        EntireFileQuery entireFile(bamFile);
+        for (const BamRecord& record : entireFile) {
+            writer.Write(record, &vOffset);
+            builder.AddRecord(record, vOffset);
+        }
+    }
+
+    // compare data in new PBI file, to expected data
+    const PbiRawData& expectedIndex = tests::Test2Bam_RawIndex();
+    const PbiRawData& fromBuilt = PbiRawData(tempPbiFn);
+    tests::ExpectRawIndicesEqual(expectedIndex, fromBuilt);
+
+    // straight diff of newly-generated PBI file to existing PBI
+    const string pbiDiffCmd = string("diff -q ") + test2BamFn + ".pbi " + tempPbiFn;
+    EXPECT_EQ(0, system(pbiDiffCmd.c_str()));
+
+    // clean up temp file(s)
+    remove(tempBamFn.c_str());
+    remove(tempPbiFn.c_str());
+}
+
+TEST(PacBioIndexTest, RawLoadFromPbiFile)
+{
+    const BamFile bamFile(test2BamFn);
+    const string& pbiFilename = bamFile.PacBioIndexFilename();
+    const PbiRawData loadedIndex(pbiFilename);
+
+    const PbiRawData& expectedIndex = tests::Test2Bam_RawIndex();
+    tests::ExpectRawIndicesEqual(expectedIndex, loadedIndex);
+}
+
+TEST(PacBioIndexTest, ReferenceDataNotLoadedOnUnsortedBam)
+{
+    BamFile bamFile(test2BamFn);
+    PbiRawData raw(bamFile.PacBioIndexFilename());
+    EXPECT_FALSE(raw.HasReferenceData());
+}
+
+TEST(PacBioIndexTest, LookupLoadFromFileOk)
+{
+    BamFile bamFile(test2BamFn);
+    EXPECT_NO_THROW(
+    {
+        PbiIndex index(bamFile.PacBioIndexFilename());
+        EXPECT_EQ(4, index.NumReads());
+        EXPECT_EQ(vector<int64_t>({ 35651584, 35655123, 35667124, 35679164 }), index.VirtualFileOffsets());
+    });
+}
+
+TEST(PacBioIndexTest, ThrowOnNonExistentPbiFile)
+{
+    EXPECT_THROW(PbiRawData raw("does_not_exist.pbi"), std::exception);
+    EXPECT_THROW(PbiIndex idx("does_not_exist.pbi"),   std::exception);
+}
+
+TEST(PacBioIndexTest, ThrowOnNonPbiFile)
+{
+    // completely wrong format
+    const std::string fastaFn = tests::Data_Dir + "/lambdaNEB.fa";
+    EXPECT_THROW(PbiRawData raw(fastaFn), std::exception);
+    EXPECT_THROW(PbiIndex idx(fastaFn),   std::exception);
+
+    // BGZF file, but not PBI
+    const std::string& bamFn = tests::Data_Dir + "/ex2.bam";
+    EXPECT_THROW(PbiRawData raw(bamFn), std::exception);
+    EXPECT_THROW(PbiIndex idx(bamFn),   std::exception);
+}
+
+TEST(PacBioIndexTest, Copy_and_Move)
+{
+    const PbiIndex lookup(test2BamFn + ".pbi");
+
+    const PbiIndex copyConstructed(lookup);
+    const PbiIndex moveConstructed(std::move(PbiIndex(test2BamFn + ".pbi")));
+
+    PbiIndex copyAssigned;
+    copyAssigned = lookup;
+
+    PbiIndex moveAssigned;
+    moveAssigned = std::move(PbiIndex(test2BamFn + ".pbi"));
+
+    EXPECT_TRUE(tests::PbiIndicesEqual(lookup, copyConstructed));
+    EXPECT_TRUE(tests::PbiIndicesEqual(lookup, moveConstructed));
+    EXPECT_TRUE(tests::PbiIndicesEqual(lookup, copyAssigned));
+    EXPECT_TRUE(tests::PbiIndicesEqual(lookup, moveAssigned));
+}
+
+TEST(PacBioIndexTest, OrderedLookup)
+{
+    using PacBio::BAM::CompareType;
+    using PacBio::BAM::IndexList;
+    using PacBio::BAM::internal::OrderedLookup;
+
+    OrderedLookup<int>::ContainerType oRawData;
+    oRawData[11] = { 0, 3, 4 };
+    oRawData[20] = { 1 };
+    oRawData[42] = { 2, 7, 8 };
+    oRawData[10] = { 5 };
+    oRawData[12] = { 6 };
+    oRawData[99] = { 9 };
+
+    OrderedLookup<int> oLookup(oRawData);
+
+    // EQUAL
+    EXPECT_EQ(IndexList({5}),       oLookup.LookupIndices(10, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({0, 3, 4}), oLookup.LookupIndices(11, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({6}),       oLookup.LookupIndices(12, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({1}),       oLookup.LookupIndices(20, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({2, 7, 8}), oLookup.LookupIndices(42, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({9}),       oLookup.LookupIndices(99, CompareType::EQUAL));
+    EXPECT_EQ(IndexList(),          oLookup.LookupIndices(66, CompareType::EQUAL)); // does not exist
+
+    // NOT_EQUAL
+    EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 6, 7, 8, 9}),    oLookup.LookupIndices(10, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({1, 2, 5, 6, 7, 8, 9}),          oLookup.LookupIndices(11, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 7, 8, 9}),    oLookup.LookupIndices(12, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 2, 3, 4, 5, 6, 7, 8, 9}),    oLookup.LookupIndices(20, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 1, 3, 4, 5, 6, 9}),          oLookup.LookupIndices(42, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 6, 7, 8}),    oLookup.LookupIndices(99, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}), oLookup.LookupIndices(66, CompareType::NOT_EQUAL)); // does not exist
+
+    // LESS_THAN
+    EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), oLookup.LookupIndices(13, CompareType::LESS_THAN));
+    EXPECT_EQ(IndexList({0, 3, 4, 5}),    oLookup.LookupIndices(12, CompareType::LESS_THAN));
+    // do more checks
+
+    // LESS_THAN_EQUAL
+    EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), oLookup.LookupIndices(13, CompareType::LESS_THAN_EQUAL));
+    EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), oLookup.LookupIndices(12, CompareType::LESS_THAN_EQUAL));
+    // more checks?
+
+    // GREATER_THAN
+    EXPECT_EQ(IndexList({2,7,8,9}), oLookup.LookupIndices(41, CompareType::GREATER_THAN));
+    EXPECT_EQ(IndexList({9}),       oLookup.LookupIndices(42, CompareType::GREATER_THAN));
+    // more checks?
+
+    // GREATER_THAN_EQUAL
+    EXPECT_EQ(IndexList({2,7,8,9}), oLookup.LookupIndices(41, CompareType::GREATER_THAN_EQUAL));
+    EXPECT_EQ(IndexList({2,7,8,9}), oLookup.LookupIndices(42, CompareType::GREATER_THAN_EQUAL));
+    // more checks?
+}
+
+TEST(PacBioIndexTest, UnorderedLookup)
+{
+    using PacBio::BAM::CompareType;
+    using PacBio::BAM::IndexList;
+    using PacBio::BAM::internal::UnorderedLookup;
+
+    UnorderedLookup<int>::ContainerType uRawData;
+    uRawData[11] = { 0, 3, 4 };
+    uRawData[20] = { 1 };
+    uRawData[42] = { 2, 7, 8 };
+    uRawData[10] = { 5 };
+    uRawData[12] = { 6 };
+    uRawData[99] = { 9 };
+
+    UnorderedLookup<int> uLookup(uRawData);
+
+    // EQUAL
+    EXPECT_EQ(IndexList({5}),       uLookup.LookupIndices(10, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({0, 3, 4}), uLookup.LookupIndices(11, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({6}),       uLookup.LookupIndices(12, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({1}),       uLookup.LookupIndices(20, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({2, 7, 8}), uLookup.LookupIndices(42, CompareType::EQUAL));
+    EXPECT_EQ(IndexList({9}),       uLookup.LookupIndices(99, CompareType::EQUAL));
+    EXPECT_EQ(IndexList(),          uLookup.LookupIndices(66, CompareType::EQUAL)); // does not exist
+
+    // NOT_EQUAL
+    EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 6, 7, 8, 9}),    uLookup.LookupIndices(10, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({1, 2, 5, 6, 7, 8, 9}),          uLookup.LookupIndices(11, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 7, 8, 9}),    uLookup.LookupIndices(12, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 2, 3, 4, 5, 6, 7, 8, 9}),    uLookup.LookupIndices(20, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 1, 3, 4, 5, 6, 9}),          uLookup.LookupIndices(42, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 6, 7, 8}),    uLookup.LookupIndices(99, CompareType::NOT_EQUAL));
+    EXPECT_EQ(IndexList({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}), uLookup.LookupIndices(66, CompareType::NOT_EQUAL)); // does not exist
+
+    // LESS_THAN
+    EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), uLookup.LookupIndices(13, CompareType::LESS_THAN));
+    EXPECT_EQ(IndexList({0, 3, 4, 5}),    uLookup.LookupIndices(12, CompareType::LESS_THAN));
+    // more checks?
+
+    // LESS_THAN_EQUAL
+    EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), uLookup.LookupIndices(13, CompareType::LESS_THAN_EQUAL));
+    EXPECT_EQ(IndexList({0, 3, 4, 5, 6}), uLookup.LookupIndices(12, CompareType::LESS_THAN_EQUAL));
+    // more checks?
+
+    // GREATER_THAN
+    EXPECT_EQ(IndexList({2,7,8,9}), uLookup.LookupIndices(41, CompareType::GREATER_THAN));
+    EXPECT_EQ(IndexList({9}),       uLookup.LookupIndices(42, CompareType::GREATER_THAN));
+    // more checks?
+
+    // GREATER_THAN_EQUAL
+    EXPECT_EQ(uLookup.LookupIndices(41, CompareType::GREATER_THAN_EQUAL), IndexList({2,7,8,9}));
+    EXPECT_EQ(uLookup.LookupIndices(42, CompareType::GREATER_THAN_EQUAL), IndexList({2,7,8,9}));
+    // more checks?
+}
+
+TEST(PacBioIndexTest, MergeBlocks)
+{
+    using PacBio::BAM::CompareType;
+    using PacBio::BAM::IndexList;
+    using PacBio::BAM::IndexResultBlock;
+    using PacBio::BAM::IndexResultBlocks;
+    using PacBio::BAM::internal::mergedIndexBlocks;
+    using PacBio::BAM::internal::OrderedLookup;
+
+    OrderedLookup<int>::ContainerType oRawData;
+    oRawData[11] = { 0, 3, 4 };
+    oRawData[20] = { 1 };
+    oRawData[42] = { 2, 7, 8 };
+    oRawData[10] = { 5 };
+    oRawData[12] = { 6 };
+    oRawData[99] = { 9 };
+
+    OrderedLookup<int> oLookup(oRawData);
+
+    // EQUAL
+    auto mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(10, CompareType::EQUAL));
+    EXPECT_EQ(1, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(5, 1), mergedBlocks.at(0));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(11, CompareType::EQUAL));
+    EXPECT_EQ(2, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(0, 1), mergedBlocks.at(0));
+    EXPECT_EQ(IndexResultBlock(3, 2), mergedBlocks.at(1));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(12, CompareType::EQUAL));
+    EXPECT_EQ(1, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(6, 1), mergedBlocks.at(0));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(20, CompareType::EQUAL));
+    EXPECT_EQ(1, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(1, 1), mergedBlocks.at(0));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(42, CompareType::EQUAL));
+    EXPECT_EQ(2, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(2, 1), mergedBlocks.at(0));
+    EXPECT_EQ(IndexResultBlock(7, 2), mergedBlocks.at(1));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(99, CompareType::EQUAL));
+    EXPECT_EQ(1, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(9, 1), mergedBlocks.at(0));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(66, CompareType::EQUAL));
+    EXPECT_TRUE(mergedBlocks.empty());
+
+    // NOT_EQUAL
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(10, CompareType::NOT_EQUAL));
+    EXPECT_EQ(2, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(0, 5), mergedBlocks.at(0));
+    EXPECT_EQ(IndexResultBlock(6, 4), mergedBlocks.at(1));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(11, CompareType::NOT_EQUAL));
+    EXPECT_EQ(2, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(1, 2), mergedBlocks.at(0));
+    EXPECT_EQ(IndexResultBlock(5, 5), mergedBlocks.at(1));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(12, CompareType::NOT_EQUAL));
+    EXPECT_EQ(2, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(0, 6), mergedBlocks.at(0));
+    EXPECT_EQ(IndexResultBlock(7, 3), mergedBlocks.at(1));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(20, CompareType::NOT_EQUAL));
+    EXPECT_EQ(2, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(0, 1), mergedBlocks.at(0));
+    EXPECT_EQ(IndexResultBlock(2, 8), mergedBlocks.at(1));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(42, CompareType::NOT_EQUAL));
+    EXPECT_EQ(3, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(0, 2), mergedBlocks.at(0));
+    EXPECT_EQ(IndexResultBlock(3, 4), mergedBlocks.at(1));
+    EXPECT_EQ(IndexResultBlock(9, 1), mergedBlocks.at(2));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(99, CompareType::NOT_EQUAL));
+    EXPECT_EQ(1, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(0, 9), mergedBlocks.at(0));
+
+    mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(66, CompareType::NOT_EQUAL));
+    EXPECT_EQ(1, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(0, 10), mergedBlocks.at(0));
+}
+
+TEST(PacBioIndexTest, ApplyOffsetsToBlocks)
+{
+    using PacBio::BAM::CompareType;
+    using PacBio::BAM::IndexList;
+    using PacBio::BAM::IndexResultBlock;
+    using PacBio::BAM::IndexResultBlocks;
+    using PacBio::BAM::internal::mergedIndexBlocks;
+    using PacBio::BAM::internal::OrderedLookup;
+    using PacBio::BAM::internal::SubreadLookupData;
+
+    OrderedLookup<int>::ContainerType oRawData;
+    oRawData[11] = { 0, 3, 4 };
+    oRawData[20] = { 1 };
+    oRawData[42] = { 2, 7, 8 };
+    oRawData[10] = { 5 };
+    oRawData[12] = { 6 };
+    oRawData[99] = { 9 };
+
+    OrderedLookup<int> oLookup(oRawData);
+    auto mergedBlocks = mergedIndexBlocks(oLookup.LookupIndices(10, CompareType::NOT_EQUAL));
+
+    EXPECT_EQ(2, mergedBlocks.size());
+    EXPECT_EQ(IndexResultBlock(0, 5), mergedBlocks.at(0));
+    EXPECT_EQ(IndexResultBlock(6, 4), mergedBlocks.at(1));
+
+    SubreadLookupData subreadIndex;
+    subreadIndex.fileOffset_ = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 };
+    subreadIndex.ApplyOffsets(mergedBlocks);
+
+    EXPECT_EQ(2,  mergedBlocks.size());
+    EXPECT_EQ(0,  mergedBlocks.at(0).virtualOffset_);
+    EXPECT_EQ(5,  mergedBlocks.at(0).numReads_);
+    EXPECT_EQ(60, mergedBlocks.at(1).virtualOffset_);
+    EXPECT_EQ(4,  mergedBlocks.at(1).numReads_);
+}
+
+TEST(PacBioIndexTest, LookupMulti)
+{
+    using PacBio::BAM::CompareType;
+    using PacBio::BAM::IndexList;
+    using PacBio::BAM::IndexResultBlock;
+    using PacBio::BAM::IndexResultBlocks;
+    using PacBio::BAM::SubreadField;
+    using PacBio::BAM::internal::mergedIndexBlocks;
+    using PacBio::BAM::internal::SubreadLookupData;
+    using PacBio::BAM::internal::UnorderedLookup;
+
+    UnorderedLookup<int32_t>::ContainerType uRawData;
+    uRawData[11] = { 0, 3, 4 };
+    uRawData[20] = { 1 };
+    uRawData[42] = { 2, 7, 8 };
+    uRawData[10] = { 5 };
+    uRawData[12] = { 6 };
+    uRawData[99] = { 9 };
+
+    SubreadLookupData subreadIndex;
+    subreadIndex.rgId_ = UnorderedLookup<int32_t>(uRawData);
+    subreadIndex.fileOffset_ = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 };
+
+    const std::vector<int32_t> whitelist = { 11, 42, 20 };
+    const auto indices = subreadIndex.IndicesMulti(SubreadField::RG_ID, whitelist);
+
+    IndexResultBlocks mergedBlocks = mergedIndexBlocks(indices);
+    subreadIndex.ApplyOffsets(mergedBlocks);
+
+    EXPECT_EQ(IndexList({0, 3, 4, 2, 7, 8, 1}), indices);
+    EXPECT_EQ(2, mergedBlocks.size());
+
+    const IndexResultBlock& block0 = mergedBlocks.at(0);
+    EXPECT_EQ(0, block0.firstIndex_);
+    EXPECT_EQ(5, block0.numReads_);
+    EXPECT_EQ(0, block0.virtualOffset_);
+
+    const IndexResultBlock& block1 = mergedBlocks.at(1);
+    EXPECT_EQ(7,  block1.firstIndex_);
+    EXPECT_EQ(2,  block1.numReads_);
+    EXPECT_EQ(70, block1.virtualOffset_);
+}
+
+TEST(PacBioIndexTest, LookupAPI)
+{
+    const PbiIndex index(test2BamFn + ".pbi");
+
+    // rgId == x
+    const IndexResultBlocks rgResult = index.Lookup(ReadGroupIndexRequest(-1197849594));
+    EXPECT_EQ(1, rgResult.size());
+    EXPECT_EQ(0, rgResult.at(0).firstIndex_);
+    EXPECT_EQ(4, rgResult.at(0).numReads_);
+    EXPECT_EQ(35651584, rgResult.at(0).virtualOffset_);
+
+    // rg != x
+    const IndexResultBlocks notRgResult = index.Lookup(ReadGroupIndexRequest(-1197849594, CompareType::NOT_EQUAL));
+    EXPECT_TRUE(notRgResult.empty());
+
+    // tEnd <= x
+    const IndexResultBlocks tEndLteResult = index.Lookup(ReferenceEndIndexRequest(9900, CompareType::LESS_THAN_EQUAL));
+    EXPECT_EQ(1, tEndLteResult.size());
+    EXPECT_EQ(2, tEndLteResult.at(0).firstIndex_);
+    EXPECT_EQ(2, tEndLteResult.at(0).numReads_);
+    EXPECT_EQ(35667124, tEndLteResult.at(0).virtualOffset_);
+
+    // tEnd >= x
+    const IndexResultBlocks tEndGteResult = index.Lookup(ReferenceEndIndexRequest(9900, CompareType::GREATER_THAN_EQUAL));
+    EXPECT_EQ(2, tEndGteResult.size());
+    EXPECT_EQ(0, tEndGteResult.at(0).firstIndex_);
+    EXPECT_EQ(2, tEndGteResult.at(0).numReads_);
+    EXPECT_EQ(35651584, tEndGteResult.at(0).virtualOffset_);
+    EXPECT_EQ(3, tEndGteResult.at(1).firstIndex_);
+    EXPECT_EQ(1, tEndGteResult.at(1).numReads_);
+    EXPECT_EQ(35679164, tEndGteResult.at(1).virtualOffset_);
+
+    // strand query
+    const IndexResultBlocks forward = index.Lookup(StrandIndexRequest(Strand::FORWARD));
+    EXPECT_EQ(2, forward.size());
+    EXPECT_EQ(0, forward.at(0).firstIndex_);
+    EXPECT_EQ(1, forward.at(0).numReads_);
+    EXPECT_EQ(35651584, forward.at(0).virtualOffset_);
+    EXPECT_EQ(2, forward.at(1).firstIndex_);
+    EXPECT_EQ(1, forward.at(1).numReads_);
+    EXPECT_EQ(35667124, forward.at(1).virtualOffset_);
+
+    const IndexResultBlocks reverse = index.Lookup(StrandIndexRequest(Strand::REVERSE));
+    EXPECT_EQ(2, reverse.size());
+    EXPECT_EQ(1, reverse.at(0).firstIndex_);
+    EXPECT_EQ(1, reverse.at(0).numReads_);
+    EXPECT_EQ(35655123, reverse.at(0).virtualOffset_);
+    EXPECT_EQ(3, reverse.at(1).firstIndex_);
+    EXPECT_EQ(1, reverse.at(1).numReads_);
+    EXPECT_EQ(35679164, reverse.at(1).virtualOffset_);
+
+    // query data field that is not in the PBI
+    const IndexResultBlocks missing = index.Lookup(BarcodeQualityIndexRequest(77, CompareType::GREATER_THAN));
+    EXPECT_TRUE(missing.empty());
+}
+
+TEST(PacBioIndexTest, LookupByZmw)
+{
+    BamFile f(tests::Data_Dir + "/dataset/bam_mapping.bam");
+    f.EnsurePacBioIndexExists();
+
+    PbiIndex index(f.PacBioIndexFilename());
+
+    const IndexResultBlocks blocks = index.Lookup(ZmwIndexRequest(20000, CompareType::LESS_THAN));
+    EXPECT_EQ(14, blocks.size());
+
+    //
+    // we'll take a look at first 5 contiguous blocks of reads with ZMW < 20000
+    //
+    // skipped: { 49050, 32328, 32328 }
+    // block0:  { 6469, 6469 }
+    // skipped: { 30983 }
+    // block1:  { 13473, 13473, 19915 }
+    // skipped: { 30983 }
+    // block2:  { 19915, 7247, 7247 }
+    // skipped: { 38025 }
+    // block3:  { 13473 }
+    // skipped: { 36363, 36363, 31174, 31174, 38025, 50257, 50257 }
+    // block4:  { 14743, 14743 }
+    //
+
+    const IndexResultBlock& block0 = blocks.at(0);
+    EXPECT_EQ(3, block0.firstIndex_);
+    EXPECT_EQ(2, block0.numReads_);
+    EXPECT_EQ(32654529, block0.virtualOffset_);
+
+    const IndexResultBlock& block1 = blocks.at(1);
+    EXPECT_EQ(6, block1.firstIndex_);
+    EXPECT_EQ(3, block1.numReads_);
+    EXPECT_EQ(32669996, block1.virtualOffset_);
+
+    const IndexResultBlock& block2 = blocks.at(2);
+    EXPECT_EQ(10, block2.firstIndex_);
+    EXPECT_EQ(3,  block2.numReads_);
+    EXPECT_EQ(1388841957, block2.virtualOffset_);
+
+    const IndexResultBlock& block3 = blocks.at(3);
+    EXPECT_EQ(14, block3.firstIndex_);
+    EXPECT_EQ(1,  block3.numReads_);
+    EXPECT_EQ(1388864866, block3.virtualOffset_);
+
+    const IndexResultBlock& block4 = blocks.at(4);
+    EXPECT_EQ(22, block4.firstIndex_);
+    EXPECT_EQ(2,  block4.numReads_);
+    EXPECT_EQ(1388892121, block4.virtualOffset_);
+}
+
+TEST(PacBioIndexTest, LookupMultiZmw)
+{
+    BamFile f(tests::Data_Dir + "/dataset/bam_mapping.bam");
+    f.EnsurePacBioIndexExists();
+
+    PbiIndex index(f.PacBioIndexFilename());
+
+    const std::vector<int32_t> whitelist = { 13473, 38025 };
+    const ZmwIndexMultiRequest request(whitelist);
+    const IndexResultBlocks& blocks = index.Lookup(request);
+
+    EXPECT_EQ(3, blocks.size());
+
+    const IndexResultBlock& block0 = blocks.at(0);
+    EXPECT_EQ(6, block0.firstIndex_);
+    EXPECT_EQ(2, block0.numReads_);
+    EXPECT_EQ(32669996, block0.virtualOffset_);
+
+    const IndexResultBlock& block1 = blocks.at(1);
+    EXPECT_EQ(13, block1.firstIndex_);
+    EXPECT_EQ(2, block1.numReads_);
+    EXPECT_EQ(1388851626, block1.virtualOffset_);
+
+    const IndexResultBlock& block2 = blocks.at(2);
+    EXPECT_EQ(19, block2.firstIndex_);
+    EXPECT_EQ(1,  block2.numReads_);
+    EXPECT_EQ(1388881468, block2.virtualOffset_);
+}
diff --git a/tests/src/test_PolymeraseStitching.cpp b/tests/src/test_PolymeraseStitching.cpp
new file mode 100644
index 0000000..500f8c6
--- /dev/null
+++ b/tests/src/test_PolymeraseStitching.cpp
@@ -0,0 +1,352 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Armin Töpfer
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <iostream>
+#include <map>
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include "pbbam/virtual/VirtualPolymeraseReader.h"
+#include "pbbam/BamFile.h"
+#include "pbbam/BamRecord.h"
+#include "pbbam/EntireFileQuery.h"
+#include "pbbam/Frames.h"
+#include "TestData.h"
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+
+void Compare(const BamRecord& b1, const BamRecord& b2)
+{
+    EXPECT_TRUE(b1.HasDeletionQV());
+    EXPECT_TRUE(b1.HasDeletionTag());
+    EXPECT_TRUE(b1.HasInsertionQV());
+    EXPECT_TRUE(b1.HasMergeQV());
+    EXPECT_TRUE(b1.HasSubstitutionQV());
+    EXPECT_TRUE(b1.HasSubstitutionTag());
+    EXPECT_TRUE(b1.HasLabelQV());
+    EXPECT_TRUE(b1.HasAltLabelQV());
+    EXPECT_TRUE(b1.HasAltLabelTag());
+    EXPECT_TRUE(b1.HasPkmean());
+    EXPECT_TRUE(b1.HasPkmid());
+    EXPECT_TRUE(b1.HasPulseCall());
+    EXPECT_TRUE(b1.HasIPD());
+    EXPECT_TRUE(b1.HasPulseWidth());
+    EXPECT_TRUE(b1.HasPrePulseFrames());
+    EXPECT_TRUE(b1.HasPulseCallWidth());
+    EXPECT_TRUE(b1.HasPulseMergeQV());
+
+    EXPECT_TRUE(b2.HasDeletionQV());
+    EXPECT_TRUE(b2.HasDeletionTag());
+    EXPECT_TRUE(b2.HasInsertionQV());
+    EXPECT_TRUE(b2.HasMergeQV());
+    EXPECT_TRUE(b2.HasSubstitutionQV());
+    EXPECT_TRUE(b2.HasSubstitutionTag());
+    EXPECT_TRUE(b2.HasLabelQV());
+    EXPECT_TRUE(b2.HasAltLabelQV());
+    EXPECT_TRUE(b2.HasAltLabelTag());
+    EXPECT_TRUE(b2.HasPkmean());
+    EXPECT_TRUE(b2.HasPkmid());
+    EXPECT_TRUE(b2.HasPulseCall());
+    EXPECT_TRUE(b2.HasIPD());
+    EXPECT_TRUE(b2.HasPulseWidth());
+    EXPECT_TRUE(b2.HasPrePulseFrames());
+    EXPECT_TRUE(b2.HasPulseCallWidth());
+    EXPECT_TRUE(b2.HasPulseMergeQV());
+
+    EXPECT_EQ(b1.FullName(),        b2.FullName());
+    EXPECT_EQ(b1.HoleNumber(),      b2.HoleNumber());
+    EXPECT_EQ(b1.NumPasses(),       b2.NumPasses());
+    EXPECT_EQ(b1.Sequence(),        b2.Sequence());
+    EXPECT_EQ(b1.Qualities(),       b2.Qualities());
+    EXPECT_EQ(b1.DeletionQV(),      b2.DeletionQV());
+    EXPECT_EQ(b1.DeletionTag(),     b2.DeletionTag());
+    EXPECT_EQ(b1.InsertionQV(),     b2.InsertionQV());
+    EXPECT_EQ(b1.MergeQV(),         b2.MergeQV());
+    EXPECT_EQ(b1.SubstitutionQV(),  b2.SubstitutionQV());
+    EXPECT_EQ(b1.SubstitutionTag(), b2.SubstitutionTag());
+    EXPECT_EQ(b1.LabelQV(),         b2.LabelQV());
+    EXPECT_EQ(b1.AltLabelQV(),      b2.AltLabelQV());
+    EXPECT_EQ(b1.AltLabelTag(),     b2.AltLabelTag());
+    EXPECT_EQ(b1.Pkmean(),          b2.Pkmean());
+    EXPECT_EQ(b1.Pkmid(),           b2.Pkmid());
+    EXPECT_EQ(b1.PulseCall(),       b2.PulseCall());
+    EXPECT_EQ(b1.IPD(),             b2.IPD());
+    EXPECT_EQ(b1.PulseWidth(),      b2.PulseWidth());
+    EXPECT_EQ(b1.PrePulseFrames(),  b2.PrePulseFrames());
+    EXPECT_EQ(b1.PulseCallWidth(),  b2.PulseCallWidth());
+    EXPECT_EQ(b1.ReadGroup(),       b2.ReadGroup());
+    EXPECT_EQ(b1.PulseMergeQV(),    b2.PulseMergeQV());
+}
+
+TEST(VirtualPolymeraseReader, InternalSubreadsToOriginal)
+{
+	// Create virtual polymerase read
+    VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/internal.subreads.bam",
+                                tests::Data_Dir + "/polymerase/internal.scraps.bam");
+    EXPECT_TRUE(vpr.HasNext());
+    auto virtualRecord = vpr.Next();
+    EXPECT_FALSE(vpr.HasNext());
+
+    // Read original polymerase read
+    BamFile polyBam(tests::Data_Dir + "/polymerase/internal.polymerase.bam");
+    EntireFileQuery polyQuery(polyBam);
+
+    auto begin = polyQuery.begin();
+    auto end = polyQuery.begin();
+
+    EXPECT_TRUE(begin != end);
+    auto polyRecord = *begin++;
+	EXPECT_TRUE(begin == end); 
+
+	Compare(polyRecord, virtualRecord);
+}
+
+TEST(VirtualPolymeraseReader, InternalHQToOriginal)
+{
+	// Create virtual polymerase read
+    VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/internal.hqregions.bam",
+                                tests::Data_Dir + "/polymerase/internal.lqregions.bam");
+    EXPECT_TRUE(vpr.HasNext());
+    auto virtualRecord = vpr.Next();
+    EXPECT_FALSE(vpr.HasNext());
+
+    // Read original polymerase read
+    BamFile polyBam(tests::Data_Dir + "/polymerase/internal.polymerase.bam");
+    EntireFileQuery polyQuery(polyBam);
+
+    auto begin = polyQuery.begin();
+    auto end = polyQuery.begin();
+
+    EXPECT_TRUE(begin != end);
+    auto polyRecord = *begin++;
+	EXPECT_TRUE(begin == end);    
+
+	Compare(polyRecord, virtualRecord);
+}
+
+TEST(VirtualPolymeraseReader, VirtualRegions)
+{
+	// Create virtual polymerase read
+    VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/internal.subreads.bam",
+                                tests::Data_Dir + "/polymerase/internal.scraps.bam");
+    auto virtualRecord = vpr.Next();
+
+    auto regionMap = virtualRecord.VirtualRegionsMap();
+    auto adapter = virtualRecord.VirtualRegionsTable(VirtualRegionType::ADAPTER);
+
+    // Compare different accessors to same source
+    EXPECT_EQ(regionMap[VirtualRegionType::ADAPTER], adapter);
+
+    // Compare to truth
+    EXPECT_EQ(3047,adapter[0].beginPos);
+    EXPECT_EQ(3095,adapter[0].endPos);
+    EXPECT_EQ(3650,adapter[1].beginPos);
+    EXPECT_EQ(3700,adapter[1].endPos);
+    EXPECT_EQ(4289,adapter[2].beginPos);
+    EXPECT_EQ(4335,adapter[2].endPos);
+    EXPECT_EQ(4888,adapter[3].beginPos);
+    EXPECT_EQ(4939,adapter[3].endPos);
+    EXPECT_EQ(5498,adapter[4].beginPos);
+    EXPECT_EQ(5546,adapter[4].endPos);
+    EXPECT_EQ(6116,adapter[5].beginPos);
+    EXPECT_EQ(6173,adapter[5].endPos);
+    EXPECT_EQ(6740,adapter[6].beginPos);
+    EXPECT_EQ(6790,adapter[6].endPos);
+
+
+    auto barcode = virtualRecord.VirtualRegionsTable(VirtualRegionType::BARCODE);
+    EXPECT_EQ(regionMap[VirtualRegionType::BARCODE], barcode);
+
+    EXPECT_EQ(3025,barcode[0].beginPos);
+    EXPECT_EQ(3047,barcode[0].endPos);
+    EXPECT_EQ(3095,barcode[1].beginPos);
+    EXPECT_EQ(3116,barcode[1].endPos);
+    EXPECT_EQ(3628,barcode[2].beginPos);
+    EXPECT_EQ(3650,barcode[2].endPos);
+    EXPECT_EQ(3700,barcode[3].beginPos);
+    EXPECT_EQ(3722,barcode[3].endPos);
+    EXPECT_EQ(4267,barcode[4].beginPos);
+    EXPECT_EQ(4289,barcode[4].endPos);
+    EXPECT_EQ(4335,barcode[5].beginPos);
+    EXPECT_EQ(4356,barcode[5].endPos);
+    EXPECT_EQ(4864,barcode[6].beginPos);
+    EXPECT_EQ(4888,barcode[6].endPos);
+    EXPECT_EQ(4939,barcode[7].beginPos);
+    EXPECT_EQ(4960,barcode[7].endPos);
+    EXPECT_EQ(5477,barcode[8].beginPos);
+    EXPECT_EQ(5498,barcode[8].endPos);
+    EXPECT_EQ(5546,barcode[9].beginPos);
+    EXPECT_EQ(5571,barcode[9].endPos);
+    EXPECT_EQ(6087,barcode[10].beginPos);
+    EXPECT_EQ(6116,barcode[10].endPos);
+    EXPECT_EQ(6173,barcode[11].beginPos);
+    EXPECT_EQ(6199,barcode[11].endPos);
+    EXPECT_EQ(6719,barcode[12].beginPos);
+    EXPECT_EQ(6740,barcode[12].endPos);
+    EXPECT_EQ(6790,barcode[13].beginPos);
+    EXPECT_EQ(6812,barcode[13].endPos);
+
+
+    auto lqregion = virtualRecord.VirtualRegionsTable(VirtualRegionType::LQREGION);
+    EXPECT_EQ(regionMap[VirtualRegionType::LQREGION], lqregion);
+
+    EXPECT_EQ(0,lqregion[0].beginPos);
+    EXPECT_EQ(2659,lqregion[0].endPos);
+    EXPECT_EQ(7034,lqregion[1].beginPos);
+    EXPECT_EQ(7035,lqregion[1].endPos);
+
+
+    auto hqregion = virtualRecord.VirtualRegionsTable(VirtualRegionType::HQREGION);
+    EXPECT_EQ(regionMap[VirtualRegionType::HQREGION], hqregion);
+
+    EXPECT_EQ(2659,hqregion[0].beginPos);
+    EXPECT_EQ(7034,hqregion[0].endPos);
+}
+
+TEST(VirtualPolymeraseReader, ProductionSubreadsToOriginal)
+{
+    // Create virtual polymerase read
+    VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/production.subreads.bam",
+                                tests::Data_Dir + "/polymerase/production.scraps.bam");
+    EXPECT_TRUE(vpr.HasNext());
+    auto virtualRecord = vpr.Next();
+    EXPECT_FALSE(vpr.HasNext());
+
+    // Read original polymerase read
+    BamFile polyBam(tests::Data_Dir + "/polymerase/production.polymerase.bam");
+    EntireFileQuery polyQuery(polyBam);
+
+    auto begin = polyQuery.begin();
+    auto end = polyQuery.begin();
+
+    EXPECT_TRUE(begin != end);
+    auto polyRecord = *begin++;
+    EXPECT_TRUE(begin == end); 
+
+    EXPECT_EQ(polyRecord.FullName(),        virtualRecord.FullName());
+    EXPECT_EQ(polyRecord.HoleNumber(),      virtualRecord.HoleNumber());
+    EXPECT_EQ(polyRecord.ReadAccuracy(),    virtualRecord.ReadAccuracy());
+    EXPECT_EQ(polyRecord.NumPasses(),       virtualRecord.NumPasses());
+    EXPECT_EQ(polyRecord.Sequence(),        virtualRecord.Sequence());
+    EXPECT_EQ(polyRecord.Qualities(),       virtualRecord.Qualities());
+    EXPECT_EQ(polyRecord.DeletionQV(),      virtualRecord.DeletionQV());
+    EXPECT_EQ(polyRecord.DeletionTag(),     virtualRecord.DeletionTag());
+    EXPECT_EQ(polyRecord.InsertionQV(),     virtualRecord.InsertionQV());
+    EXPECT_EQ(polyRecord.MergeQV(),         virtualRecord.MergeQV());
+    EXPECT_EQ(polyRecord.SubstitutionQV(),  virtualRecord.SubstitutionQV());
+    EXPECT_EQ(polyRecord.SubstitutionTag(), virtualRecord.SubstitutionTag());
+    EXPECT_EQ(polyRecord.IPD(),             virtualRecord.IPDV1Frames());
+    EXPECT_EQ(polyRecord.ReadGroup(),       virtualRecord.ReadGroup());
+}
+
+TEST(VirtualPolymeraseReader, ProductionHQToOriginal)
+{
+    // Create virtual polymerase read
+    VirtualPolymeraseReader vpr(tests::Data_Dir + "/polymerase/production_hq.hqregion.bam",
+                                tests::Data_Dir + "/polymerase/production_hq.scraps.bam");
+    EXPECT_TRUE(vpr.HasNext());
+    auto virtualRecord = vpr.Next();
+    EXPECT_FALSE(vpr.HasNext());
+
+    // Read original polymerase read
+    BamFile polyBam(tests::Data_Dir + "/polymerase/production.polymerase.bam");
+    EntireFileQuery polyQuery(polyBam);
+
+    auto begin = polyQuery.begin();
+    auto end = polyQuery.begin();
+
+    EXPECT_TRUE(begin != end);
+    auto polyRecord = *begin++;
+    EXPECT_TRUE(begin == end); 
+
+    EXPECT_FALSE(polyRecord.HasPulseCall());
+    EXPECT_FALSE(virtualRecord.HasPulseCall());
+    EXPECT_EQ(polyRecord.FullName(),        virtualRecord.FullName());
+    EXPECT_EQ(polyRecord.HoleNumber(),      virtualRecord.HoleNumber());
+    EXPECT_EQ(polyRecord.ReadAccuracy(),    virtualRecord.ReadAccuracy());
+    EXPECT_EQ(polyRecord.NumPasses(),       virtualRecord.NumPasses());
+    EXPECT_EQ(polyRecord.Sequence(),        virtualRecord.Sequence());
+    EXPECT_EQ(polyRecord.Qualities(),       virtualRecord.Qualities());
+    EXPECT_EQ(polyRecord.DeletionQV(),      virtualRecord.DeletionQV());
+    EXPECT_EQ(polyRecord.DeletionTag(),     virtualRecord.DeletionTag());
+    EXPECT_EQ(polyRecord.InsertionQV(),     virtualRecord.InsertionQV());
+    EXPECT_EQ(polyRecord.MergeQV(),         virtualRecord.MergeQV());
+    EXPECT_EQ(polyRecord.SubstitutionQV(),  virtualRecord.SubstitutionQV());
+    EXPECT_EQ(polyRecord.SubstitutionTag(), virtualRecord.SubstitutionTag());
+    EXPECT_EQ(polyRecord.IPD(),             virtualRecord.IPDV1Frames());
+    EXPECT_EQ(polyRecord.ReadGroup(),       virtualRecord.ReadGroup());
+
+    EXPECT_TRUE(polyRecord.HasDeletionQV());
+    EXPECT_TRUE(polyRecord.HasDeletionTag());
+    EXPECT_TRUE(polyRecord.HasInsertionQV());
+    EXPECT_TRUE(polyRecord.HasMergeQV());
+    EXPECT_TRUE(polyRecord.HasSubstitutionQV());
+    EXPECT_TRUE(polyRecord.HasSubstitutionTag());
+    EXPECT_TRUE(polyRecord.HasIPD());
+    EXPECT_FALSE(polyRecord.HasLabelQV());
+    EXPECT_FALSE(polyRecord.HasAltLabelQV());
+    EXPECT_FALSE(polyRecord.HasAltLabelTag());
+    EXPECT_FALSE(polyRecord.HasPkmean());
+    EXPECT_FALSE(polyRecord.HasPkmid());
+    EXPECT_FALSE(polyRecord.HasPulseCall());
+    EXPECT_FALSE(polyRecord.HasPulseWidth());
+    EXPECT_FALSE(polyRecord.HasPrePulseFrames());
+    EXPECT_FALSE(polyRecord.HasPulseCallWidth());
+
+    EXPECT_TRUE(virtualRecord.HasDeletionQV());
+    EXPECT_TRUE(virtualRecord.HasDeletionTag());
+    EXPECT_TRUE(virtualRecord.HasInsertionQV());
+    EXPECT_TRUE(virtualRecord.HasMergeQV());
+    EXPECT_TRUE(virtualRecord.HasSubstitutionQV());
+    EXPECT_TRUE(virtualRecord.HasSubstitutionTag());
+    EXPECT_TRUE(virtualRecord.HasIPD());
+    EXPECT_FALSE(virtualRecord.HasLabelQV());
+    EXPECT_FALSE(virtualRecord.HasAltLabelQV());
+    EXPECT_FALSE(virtualRecord.HasAltLabelTag());
+    EXPECT_FALSE(virtualRecord.HasPkmean());
+    EXPECT_FALSE(virtualRecord.HasPkmid());
+    EXPECT_FALSE(virtualRecord.HasPulseCall());
+    EXPECT_FALSE(virtualRecord.HasPulseWidth());
+    EXPECT_FALSE(virtualRecord.HasPrePulseFrames());
+    EXPECT_FALSE(virtualRecord.HasPulseCallWidth());
+}
diff --git a/tests/src/test_QualityValues.cpp b/tests/src/test_QualityValues.cpp
new file mode 100644
index 0000000..98795a3
--- /dev/null
+++ b/tests/src/test_QualityValues.cpp
@@ -0,0 +1,120 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/QualityValues.h>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(QualityValueTest, DefaultsOk)
+{
+    const QualityValue value;
+    EXPECT_EQ(0,   value);
+    EXPECT_EQ('!', value.Fastq());
+}
+
+TEST(QualityValueTest, FromNumber)
+{
+    const QualityValue zero(0);
+    const QualityValue thirtyThree(33);
+    const QualityValue valid(42);
+    const QualityValue max(93);
+    const QualityValue tooHigh(94);
+    const QualityValue wayTooHigh(INT8_MAX);
+
+    EXPECT_EQ(0,  zero);
+    EXPECT_EQ(33, thirtyThree);
+    EXPECT_EQ(42, valid);
+    EXPECT_EQ(93, max);
+    EXPECT_EQ(93, tooHigh);
+    EXPECT_EQ(93, wayTooHigh);
+
+    EXPECT_EQ('!', zero.Fastq());
+    EXPECT_EQ('B', thirtyThree.Fastq());
+    EXPECT_EQ('K', valid.Fastq());
+    EXPECT_EQ('~', max.Fastq());
+    EXPECT_EQ('~', tooHigh.Fastq());
+    EXPECT_EQ('~', wayTooHigh.Fastq());
+}
+
+TEST(QualityValueTest, FromFastq)
+{
+    const QualityValue zero        = QualityValue::FromFastq('!');
+    const QualityValue thirtyThree = QualityValue::FromFastq('B');
+    const QualityValue valid       = QualityValue::FromFastq('K');
+    const QualityValue max         = QualityValue::FromFastq('~');
+
+    EXPECT_EQ(0,  zero);
+    EXPECT_EQ(33, thirtyThree);
+    EXPECT_EQ(42, valid);
+    EXPECT_EQ(93, max);
+}
+
+TEST(QualityValuesTest, Default)
+{
+    const QualityValues qvs;
+    EXPECT_TRUE(qvs.empty());
+    EXPECT_EQ(string(), qvs.Fastq());
+}
+
+TEST(QualityValuesTest, FromNumbers)
+{
+    const string fastqString = "~~~KKBB!!";
+    const vector<uint8_t> values = { 93, 93, 93, 42, 42, 33, 33, 0, 0 };
+
+    QualityValues qvs;
+    for (auto qv : values)
+        qvs.push_back(qv);
+    EXPECT_EQ(fastqString, qvs.Fastq());
+}
+
+TEST(QualityValuesTest, FromFastq)
+{
+    const string fastqString = "~~~KKBB!!";
+    const vector<uint8_t> values = { 93, 93, 93, 42, 42, 33, 33, 0, 0 };
+
+    const QualityValues& qvs = QualityValues::FromFastq(fastqString);
+    EXPECT_EQ(fastqString.size(), qvs.size());
+    EXPECT_EQ(values.size(), qvs.size());
+    for (size_t i = 0; i < fastqString.size(); ++i)
+        EXPECT_EQ(values.at(i), qvs.at(i));
+}
diff --git a/tests/src/test_ReadGroupInfo.cpp b/tests/src/test_ReadGroupInfo.cpp
new file mode 100644
index 0000000..db30fa2
--- /dev/null
+++ b/tests/src/test_ReadGroupInfo.cpp
@@ -0,0 +1,61 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett, Lance Hepler
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/ReadGroupInfo.h>
+using namespace PacBio::BAM;
+
+
+TEST(ReadGroupInfoTest, IdFromMovieNameAndReadType)
+{
+    ReadGroupInfo rg("m140905_042212_sidney_c100564852550000001823085912221377_s1_X0", "HQREGION");
+    EXPECT_EQ("00082ba1", rg.Id());
+}
+
+TEST(ReadGroupInfoTest, FrameCodecSetOk)
+{
+    ReadGroupInfo rg("test");
+    rg.IpdCodec(FrameCodec::V1);
+    EXPECT_TRUE(rg.HasBaseFeature(BaseFeature::IPD));
+    EXPECT_EQ("ip", rg.BaseFeatureTag(BaseFeature::IPD));
+    EXPECT_EQ(FrameCodec::V1, rg.IpdCodec());
+}
+
diff --git a/tests/src/test_SequenceUtils.cpp b/tests/src/test_SequenceUtils.cpp
new file mode 100644
index 0000000..a089579
--- /dev/null
+++ b/tests/src/test_SequenceUtils.cpp
@@ -0,0 +1,141 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/../../src/SequenceUtils.h>
+#include <pbbam/../../src/StringUtils.h>
+#include <string>
+#include <vector>
+
+#include <climits>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+TEST(StringUtilsTest, BasicSplit)
+{
+    const string test = "foo\tbar\tbaz";
+    const vector<string> tokens = internal::Split(test, '\t');
+    EXPECT_EQ(3, tokens.size());
+    EXPECT_TRUE(tokens.at(0) == "foo");
+    EXPECT_TRUE(tokens.at(1) == "bar");
+    EXPECT_TRUE(tokens.at(2) == "baz");
+}
+
+TEST(StringUtilsTest, SplitKeepsEmptyTokens)
+{
+    const string test = "foo\tbar\t\tbaz";
+    const vector<string> tokens = internal::Split(test, '\t');
+    EXPECT_EQ(4, tokens.size());
+    EXPECT_TRUE(tokens.at(0) == "foo");
+    EXPECT_TRUE(tokens.at(1) == "bar");
+    EXPECT_TRUE(tokens.at(2) == "");
+    EXPECT_TRUE(tokens.at(3) == "baz");
+}
+
+TEST(SequenceUtilsTest, ComplementChar)
+{
+                        // complement
+    const char A = 'A'; // T
+    const char B = 'B'; // V
+    const char C = 'C'; // G
+    const char D = 'D'; // H
+    const char E = 'E'; // null
+    const char F = 'F'; // null
+    const char G = 'G'; // C
+    const char H = 'H'; // D
+    const char I = 'I'; // null
+    const char J = 'J'; // null
+    const char K = 'K'; // M
+    const char L = 'L'; // null
+    const char M = 'M'; // K
+    const char N = 'N'; // N
+    const char O = 'O'; // null
+    const char P = 'P'; // null
+    const char Q = 'Q'; // null
+    const char R = 'R'; // Y
+    const char S = 'S'; // S
+    const char T = 'T'; // A
+    const char U = 'U'; // A
+    const char V = 'V'; // B
+    const char W = 'W'; // W
+    const char X = 'X'; // null
+    const char Y = 'Y'; // R
+    const char Z = 'Z'; // null
+
+    EXPECT_EQ(T, Complement(A));
+    EXPECT_EQ(V, Complement(B));
+    EXPECT_EQ(G, Complement(C));
+    EXPECT_EQ(H, Complement(D));
+    EXPECT_EQ(0, Complement(E));
+    EXPECT_EQ(0, Complement(F));
+    EXPECT_EQ(C, Complement(G));
+    EXPECT_EQ(D, Complement(H));
+    EXPECT_EQ(0, Complement(I));
+    EXPECT_EQ(0, Complement(J));
+    EXPECT_EQ(M, Complement(K));
+    EXPECT_EQ(0, Complement(L));
+    EXPECT_EQ(K, Complement(M));
+    EXPECT_EQ(N, Complement(N));
+    EXPECT_EQ(0, Complement(O));
+    EXPECT_EQ(0, Complement(P));
+    EXPECT_EQ(0, Complement(Q));
+    EXPECT_EQ(Y, Complement(R));
+    EXPECT_EQ(S, Complement(S));
+    EXPECT_EQ(A, Complement(T));
+    EXPECT_EQ(A, Complement(U));
+    EXPECT_EQ(B, Complement(V));
+    EXPECT_EQ(W, Complement(W));
+    EXPECT_EQ(0, Complement(X));
+    EXPECT_EQ(R, Complement(Y));
+    EXPECT_EQ(0, Complement(Z));
+}
+
+TEST(SequenceUtilsTest, ReverseComplement)
+{
+    string input1 = "ATATATCCCGGCG";
+    const string rc1 = "CGCCGGGATATAT";
+
+    ReverseComplement(input1);
+    EXPECT_EQ(rc1, input1);
+}
diff --git a/tests/src/test_Tags.cpp b/tests/src/test_Tags.cpp
new file mode 100644
index 0000000..2ed7aa0
--- /dev/null
+++ b/tests/src/test_Tags.cpp
@@ -0,0 +1,992 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <boost/type_traits/is_convertible.hpp>
+#include <gtest/gtest.h>
+#include <pbbam/BamTagCodec.h>
+#include <pbbam/TagCollection.h>
+#include <pbbam/SamTagCodec.h>
+#include <algorithm>
+#include <iostream>
+#include <map>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+TEST(TagTest, TagConstruction)
+{
+    int8_t   i8   = 0;
+    uint8_t  u8   = 0;
+    int16_t  i16  = 0;
+    uint16_t  u16 = 0;
+    int32_t  i32  = 0;
+    uint32_t u32  = 0;
+    float    f    = 0.0;
+    string   str  = "";
+    vector<int8_t>   i8_array;
+    vector<uint8_t>  u8_array;
+    vector<int16_t>  i16_array;
+    vector<uint16_t> u16_array;
+    vector<int32_t>  i32_array;
+    vector<uint32_t> u32_Array;
+    vector<float>    float_array;
+
+    Tag i8Tag(i8);
+    Tag u8Tag(u8);
+    Tag i16Tag(i16);
+    Tag u16Tag(u16);
+    Tag i32Tag(i32);
+    Tag u32Tag(u32);
+    Tag floatTag(f);
+    Tag stringTag(str);
+    Tag i8_array_Tag(i8_array);
+    Tag u8_array_Tag(u8_array);
+    Tag i16_array_Tag(i16_array);
+    Tag u16_array_Tag(u16_array);
+    Tag i32_array_Tag(i32_array);
+    Tag u32_array_Tag(u32_Array);
+    Tag float_array_Tag(float_array);
+
+    EXPECT_TRUE(i8Tag.Type()     == TagDataType::INT8);
+    EXPECT_TRUE(u8Tag.Type()     == TagDataType::UINT8);
+    EXPECT_TRUE(i16Tag.Type()    == TagDataType::INT16);
+    EXPECT_TRUE(u16Tag.Type()    == TagDataType::UINT16);
+    EXPECT_TRUE(i32Tag.Type()    == TagDataType::INT32);
+    EXPECT_TRUE(u32Tag.Type()    == TagDataType::UINT32);
+    EXPECT_TRUE(floatTag.Type()  == TagDataType::FLOAT);
+    EXPECT_TRUE(stringTag.Type() == TagDataType::STRING);
+    EXPECT_TRUE(i8_array_Tag.Type()    == TagDataType::INT8_ARRAY);
+    EXPECT_TRUE(u8_array_Tag.Type()    == TagDataType::UINT8_ARRAY);
+    EXPECT_TRUE(i16_array_Tag.Type()   == TagDataType::INT16_ARRAY);
+    EXPECT_TRUE(u16_array_Tag.Type()   == TagDataType::UINT16_ARRAY);
+    EXPECT_TRUE(i32_array_Tag.Type()   == TagDataType::INT32_ARRAY);
+    EXPECT_TRUE(u32_array_Tag.Type()   == TagDataType::UINT32_ARRAY);
+    EXPECT_TRUE(float_array_Tag.Type() == TagDataType::FLOAT_ARRAY);
+}
+
+TEST(TagTest, CopyAndCompare)
+{
+    int8_t   i8   = 0;
+    uint8_t  u8   = 0;
+    int16_t  i16  = 0;
+    uint16_t  u16 = 0;
+    int32_t  i32  = 0;
+    uint32_t u32  = 0;
+    float    f    = 0.0;
+    string   str  = "";
+    vector<int8_t>   i8_array;
+    vector<uint8_t>  u8_array;
+    vector<int16_t>  i16_array;
+    vector<uint16_t> u16_array;
+    vector<int32_t>  i32_array;
+    vector<uint32_t> u32_Array;
+    vector<float>    float_array;
+
+    Tag i8Tag(i8);
+    Tag u8Tag(u8);
+    Tag i16Tag(i16);
+    Tag u16Tag(u16);
+    Tag i32Tag(i32);
+    Tag u32Tag(u32);
+    Tag floatTag(f);
+    Tag stringTag(str);
+    Tag i8_array_Tag(i8_array);
+    Tag u8_array_Tag(u8_array);
+    Tag i16_array_Tag(i16_array);
+    Tag u16_array_Tag(u16_array);
+    Tag i32_array_Tag(i32_array);
+    Tag u32_array_Tag(u32_Array);
+    Tag float_array_Tag(float_array);
+
+    Tag i8Tag2 = i8Tag;
+    Tag u8Tag2 = u8Tag;
+    Tag i16Tag2 = i16Tag;
+    Tag u16Tag2 = u16Tag;
+    Tag i32Tag2 = i32Tag;
+    Tag u32Tag2 = u32Tag;
+    Tag floatTag2 = floatTag;
+    Tag stringTag2 = stringTag;
+    Tag i8_array_Tag2 = i8_array_Tag;
+    Tag u8_array_Tag2 = u8_array_Tag;
+    Tag i16_array_Tag2 = i16_array_Tag;
+    Tag u16_array_Tag2 = u16_array_Tag;
+    Tag i32_array_Tag2 = i32_array_Tag;
+    Tag u32_array_Tag2 = u32_array_Tag;
+    Tag float_array_Tag2 = float_array_Tag;
+
+    EXPECT_EQ(i8Tag, i8Tag2);
+    EXPECT_EQ(u8Tag, u8Tag2);
+    EXPECT_EQ(i16Tag, i16Tag2);
+    EXPECT_EQ(u16Tag, u16Tag2);
+    EXPECT_EQ(i32Tag, i32Tag2);
+    EXPECT_EQ(u32Tag, u32Tag2);
+    EXPECT_EQ(floatTag, floatTag2);
+    EXPECT_EQ(stringTag, stringTag2);
+    EXPECT_EQ(i8_array_Tag, i8_array_Tag2);
+    EXPECT_EQ(u8_array_Tag, u8_array_Tag2);
+    EXPECT_EQ(i16_array_Tag, i16_array_Tag2);
+    EXPECT_EQ(u16_array_Tag, u16_array_Tag2);
+    EXPECT_EQ(i32_array_Tag, i32_array_Tag2);
+    EXPECT_EQ(u32_array_Tag, u32_array_Tag2);
+    EXPECT_EQ(float_array_Tag, float_array_Tag2);
+}
+
+TEST(TagTest, Type_None)
+{
+     Tag tag;
+
+     EXPECT_TRUE(tag.Type() == TagDataType::INVALID);
+     EXPECT_TRUE(tag.IsNull());
+     EXPECT_TRUE(tag.Typename() == "none");
+
+     EXPECT_FALSE(tag.IsNumeric());
+     EXPECT_FALSE(tag.IsString());
+     EXPECT_FALSE(tag.IsArray());
+}
+
+TEST(TagTest, Type_Int8)
+{
+    const int8_t v = -42;
+    const Tag tag(v);
+
+    int8_t v2;
+    EXPECT_NO_THROW(v2 = tag.ToInt8());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::INT8);
+    EXPECT_TRUE(tag.Typename() == "int8_t");
+    EXPECT_TRUE(tag.IsInt8());
+
+    EXPECT_TRUE(tag.IsSignedInt());
+    EXPECT_TRUE(tag.IsIntegral());
+    EXPECT_TRUE(tag.IsNumeric());
+
+    EXPECT_FALSE(tag.IsUnsignedInt());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsArray());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt8)
+{
+    const uint8_t v = 42;
+    const Tag tag(v);
+
+    uint8_t v2;
+    EXPECT_NO_THROW(v2 = tag.ToUInt8());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::UINT8);
+    EXPECT_TRUE(tag.Typename() == "uint8_t");
+    EXPECT_TRUE(tag.IsUInt8());
+
+    EXPECT_TRUE(tag.IsUnsignedInt());
+    EXPECT_TRUE(tag.IsIntegral());
+    EXPECT_TRUE(tag.IsNumeric());
+
+    EXPECT_FALSE(tag.IsSignedInt());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsArray());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Ascii)
+{
+    Tag pureAscii = Tag('$');
+    pureAscii.Modifier(TagModifier::ASCII_CHAR);
+
+    const uint8_t u8 = 65;
+    const int8_t  i8 = 66;
+
+    Tag fromUint8 = Tag(u8);
+    fromUint8.Modifier(TagModifier::ASCII_CHAR);
+    Tag fromInt8  = Tag(i8);
+    fromInt8.Modifier(TagModifier::ASCII_CHAR);
+
+    EXPECT_TRUE(pureAscii.HasModifier(TagModifier::ASCII_CHAR));
+    EXPECT_TRUE(pureAscii.IsIntegral());
+    EXPECT_TRUE(pureAscii.IsNumeric());
+    EXPECT_EQ('$', pureAscii.ToAscii());
+
+    EXPECT_TRUE(fromUint8.HasModifier(TagModifier::ASCII_CHAR));
+    EXPECT_TRUE(fromUint8.IsIntegral());
+    EXPECT_TRUE(fromUint8.IsNumeric());
+    EXPECT_EQ('A', fromUint8.ToAscii());
+
+    EXPECT_TRUE(fromInt8.HasModifier(TagModifier::ASCII_CHAR));
+    EXPECT_TRUE(fromInt8.IsIntegral());
+    EXPECT_TRUE(fromInt8.IsNumeric());
+    EXPECT_EQ('B', fromInt8.ToAscii());
+}
+
+TEST(TagTest, Type_Int16)
+{
+    const int16_t v = -42;
+    const Tag tag(v);
+
+    int16_t v2;
+    EXPECT_NO_THROW(v2 = tag.ToInt16());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::INT16);
+    EXPECT_TRUE(tag.Typename() == "int16_t");
+    EXPECT_TRUE(tag.IsInt16());
+    EXPECT_TRUE(tag.IsSignedInt());
+    EXPECT_TRUE(tag.IsIntegral());
+    EXPECT_TRUE(tag.IsNumeric());
+
+    EXPECT_FALSE(tag.IsUnsignedInt());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsArray());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt16)
+{
+    const uint16_t v = 42;
+    const Tag tag(v);
+
+    uint16_t v2;
+    EXPECT_NO_THROW(v2 = tag.ToUInt16());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::UINT16);
+    EXPECT_TRUE(tag.Typename() == "uint16_t");
+    EXPECT_TRUE(tag.IsUInt16());
+    EXPECT_TRUE(tag.IsUnsignedInt());
+    EXPECT_TRUE(tag.IsIntegral());
+    EXPECT_TRUE(tag.IsNumeric());
+
+    EXPECT_FALSE(tag.IsSignedInt());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsArray());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Int32)
+{
+    const int32_t v = -42;
+    const Tag tag(v);
+
+    int32_t v2;
+    EXPECT_NO_THROW(v2 = tag.ToInt32());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::INT32);
+    EXPECT_TRUE(tag.Typename() == "int32_t");
+    EXPECT_TRUE(tag.IsInt32());
+    EXPECT_TRUE(tag.IsSignedInt());
+    EXPECT_TRUE(tag.IsIntegral());
+    EXPECT_TRUE(tag.IsNumeric());
+
+    EXPECT_FALSE(tag.IsUnsignedInt());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsArray());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt32)
+{
+    const uint32_t v = 42;
+    const Tag tag(v);
+
+    uint32_t v2;
+    EXPECT_NO_THROW(v2 = tag.ToUInt32());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::UINT32);
+    EXPECT_TRUE(tag.Typename() == "uint32_t");
+    EXPECT_TRUE(tag.IsUInt32());
+    EXPECT_TRUE(tag.IsUnsignedInt());
+    EXPECT_TRUE(tag.IsIntegral());
+    EXPECT_TRUE(tag.IsNumeric());
+
+    EXPECT_FALSE(tag.IsSignedInt());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsArray());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Float)
+{
+    const float v = 3.141;
+    const Tag tag(v);
+
+    float v2;
+    EXPECT_NO_THROW(v2 = tag.ToFloat());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::FLOAT);
+    EXPECT_TRUE(tag.Typename() == "float");
+    EXPECT_TRUE(tag.IsFloat());
+    EXPECT_TRUE(tag.IsNumeric());
+
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsIntegral());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsArray());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_String)
+{
+    const string v = "foo_who";
+    const Tag tag(v);
+
+    string v2;
+    EXPECT_NO_THROW(v2 = tag.ToString());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::STRING);
+    EXPECT_TRUE(tag.Typename() == "string");
+    EXPECT_TRUE(tag.IsString());
+
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsNumeric());
+    EXPECT_FALSE(tag.IsArray());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Int8Array)
+{
+    const vector<int8_t> v = { -42, 100, 0 };
+    const Tag tag(v);
+
+    vector<int8_t> v2;
+    EXPECT_NO_THROW(v2 = tag.ToInt8Array());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::INT8_ARRAY);
+    EXPECT_TRUE(tag.Typename() == "vector<int8_t>");
+    EXPECT_TRUE(tag.IsInt8Array());
+    EXPECT_TRUE(tag.IsSignedArray());
+    EXPECT_TRUE(tag.IsIntegralArray());
+    EXPECT_TRUE(tag.IsArray());
+
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsNumeric());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt8Array)
+{
+    const vector<uint8_t> v = { 42, 200, 0 };
+    const Tag tag(v);
+
+    vector<uint8_t> v2;
+    EXPECT_NO_THROW(v2 = tag.ToUInt8Array());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::UINT8_ARRAY);
+    EXPECT_TRUE(tag.Typename() == "vector<uint8_t>");
+    EXPECT_TRUE(tag.IsUInt8Array());
+    EXPECT_TRUE(tag.IsUnsignedArray());
+    EXPECT_TRUE(tag.IsIntegralArray());
+    EXPECT_TRUE(tag.IsArray());
+
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsNumeric());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_Int16Array)
+{
+    const vector<int16_t> v = { 42, -300, 0 };
+    const Tag tag(v);
+
+    vector<int16_t> v2;
+    EXPECT_NO_THROW(v2 = tag.ToInt16Array());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::INT16_ARRAY);
+    EXPECT_TRUE(tag.Typename() == "vector<int16_t>");
+    EXPECT_TRUE(tag.IsInt16Array());
+    EXPECT_TRUE(tag.IsSignedArray());
+    EXPECT_TRUE(tag.IsIntegralArray());
+    EXPECT_TRUE(tag.IsArray());
+
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsNumeric());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt16Array)
+{
+    const vector<uint16_t> v = { 42, 300, 0 };
+    const Tag tag(v);
+
+    vector<uint16_t> v2;
+    EXPECT_NO_THROW(v2 = tag.ToUInt16Array());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::UINT16_ARRAY);
+    EXPECT_TRUE(tag.Typename() == "vector<uint16_t>");
+    EXPECT_TRUE(tag.IsUInt16Array());
+    EXPECT_TRUE(tag.IsUnsignedArray());
+    EXPECT_TRUE(tag.IsIntegralArray());
+    EXPECT_TRUE(tag.IsArray());
+
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsNumeric());
+
+    EXPECT_EQ(v, v2);;
+}
+
+TEST(TagTest, Type_Int32Array)
+{
+    const vector<int32_t> v = { 42, -300, 0 };
+    const Tag tag(v);
+
+    vector<int32_t> v2;
+    EXPECT_NO_THROW(v2 = tag.ToInt32Array());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::INT32_ARRAY);
+    EXPECT_TRUE(tag.Typename() == "vector<int32_t>");
+    EXPECT_TRUE(tag.IsInt32Array());
+    EXPECT_TRUE(tag.IsSignedArray());
+    EXPECT_TRUE(tag.IsIntegralArray());
+    EXPECT_TRUE(tag.IsArray());
+
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsNumeric());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_UInt32Array)
+{
+    const vector<uint32_t> v = { 42, 300, 0 };
+    const Tag tag(v);
+
+    vector<uint32_t> v2;
+    EXPECT_NO_THROW(v2 = tag.ToUInt32Array());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::UINT32_ARRAY);
+    EXPECT_TRUE(tag.Typename() == "vector<uint32_t>");
+    EXPECT_TRUE(tag.IsUInt32Array());
+    EXPECT_TRUE(tag.IsUnsignedArray());
+    EXPECT_TRUE(tag.IsIntegralArray());
+    EXPECT_TRUE(tag.IsArray());
+
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsNumeric());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, Type_FloatArray)
+{
+    const vector<float> v = { 1.1f, 1.2f, 1.3f };
+    const Tag tag(v);
+
+    vector<float> v2;
+    EXPECT_NO_THROW(v2 = tag.ToFloatArray());
+
+    EXPECT_TRUE(tag.Type() == TagDataType::FLOAT_ARRAY);
+    EXPECT_TRUE(tag.Typename() == "vector<float>");
+    EXPECT_TRUE(tag.IsFloatArray());
+    EXPECT_TRUE(tag.IsArray());
+
+    EXPECT_FALSE(tag.IsIntegralArray());
+    EXPECT_FALSE(tag.IsFloat());
+    EXPECT_FALSE(tag.IsString());
+    EXPECT_FALSE(tag.IsNull());
+    EXPECT_FALSE(tag.IsNumeric());
+
+    EXPECT_EQ(v, v2);
+}
+
+TEST(TagTest, CastBackToOriginalOk)
+{
+    int8_t   i8   = 0;
+    uint8_t  u8   = 0;
+    int16_t  i16  = 0;
+    uint16_t  u16 = 0;
+    int32_t  i32  = 0;
+    uint32_t u32  = 0;
+    float    f    = 0.0;
+    string   str  = "";
+    vector<int8_t>   i8_array;
+    vector<uint8_t>  u8_array;
+    vector<int16_t>  i16_array;
+    vector<uint16_t> u16_array;
+    vector<int32_t>  i32_array;
+    vector<uint32_t> u32_array;
+    vector<float>    float_array;
+
+    Tag i8Tag(i8);
+    Tag u8Tag(u8);
+    Tag i16Tag(i16);
+    Tag u16Tag(u16);
+    Tag i32Tag(i32);
+    Tag u32Tag(u32);
+    Tag floatTag(f);
+    Tag stringTag(str);
+    Tag i8_array_Tag(i8_array);
+    Tag u8_array_Tag(u8_array);
+    Tag i16_array_Tag(i16_array);
+    Tag u16_array_Tag(u16_array);
+    Tag i32_array_Tag(i32_array);
+    Tag u32_array_Tag(u32_array);
+    Tag float_array_Tag(float_array);
+
+    EXPECT_NO_THROW({
+        i8 = i8Tag.ToInt8();
+        u8 = u8Tag.ToUInt8();
+        i16 = i16Tag.ToInt16();
+        u16 = u16Tag.ToUInt16();
+        i32 = i32Tag.ToInt32();
+        u32 = u32Tag.ToUInt32();
+        f = floatTag.ToFloat();
+        str = stringTag.ToString();
+        i8_array = i8_array_Tag.ToInt8Array();
+        u8_array = u8_array_Tag.ToUInt8Array();
+        i16_array = i16_array_Tag.ToInt16Array();
+        u16_array = u16_array_Tag.ToUInt16Array();
+        i32_array = i32_array_Tag.ToInt32Array();
+        u32_array = u32_array_Tag.ToUInt32Array();
+        float_array = float_array_Tag.ToFloatArray();
+    });
+}
+
+TEST(TagTest, ConvertToInt8)
+{
+    Tag zero(int32_t(0));
+    Tag min(int32_t(INT8_MIN));
+    Tag normal(int32_t(42));
+    Tag max(int32_t(INT8_MAX));
+    Tag underflow(int32_t(INT8_MIN-1));
+    Tag overflow(int32_t(INT8_MAX+1));
+    Tag floatTag(float(3.14));
+    Tag stringTag(string("foo"));
+    Tag arrayTag(vector<int8_t>({1, 2, 3}));
+
+    // allowed
+    EXPECT_NO_THROW(
+    {
+        zero.ToInt8();
+        min.ToInt8();
+        normal.ToInt8();
+        max.ToInt8();
+    });
+
+    // not allowed
+    EXPECT_THROW(underflow.ToInt8(), std::exception);
+    EXPECT_THROW(overflow.ToInt8(), std::exception);
+    EXPECT_THROW(floatTag.ToInt8(), std::exception);
+    EXPECT_THROW(stringTag.ToInt8(), std::exception);
+    EXPECT_THROW(arrayTag.ToInt8(), std::exception);
+}
+
+TEST(TagTest, ConvertToUInt8)
+{
+    Tag zero(int32_t(0));
+    Tag neg(int32_t(-1));
+    Tag normal(int32_t(42));
+    Tag max(int32_t(UINT8_MAX));
+    Tag overflow(int32_t(UINT8_MAX+1));
+    Tag floatTag(float(3.14));
+    Tag stringTag(string("foo"));
+    Tag arrayTag(vector<uint8_t>({1, 2, 3}));
+
+    // allowed
+    EXPECT_NO_THROW(
+    {
+        zero.ToUInt8();
+        normal.ToUInt8();
+        max.ToUInt8();
+    });
+
+    // not allowed
+    EXPECT_THROW(neg.ToUInt8(), std::exception);
+    EXPECT_THROW(overflow.ToUInt8(), std::exception);
+    EXPECT_THROW(floatTag.ToUInt8(), std::exception);
+    EXPECT_THROW(stringTag.ToUInt8(), std::exception);
+    EXPECT_THROW(arrayTag.ToUInt8(), std::exception);
+}
+
+TEST(TagTest, ConvertToInt16)
+{
+    Tag zero(int32_t(0));
+    Tag min(int32_t(INT16_MIN));
+    Tag normal(int32_t(42));
+    Tag max(int32_t(INT16_MAX));
+    Tag underflow(int32_t(INT16_MIN-1));
+    Tag overflow(int32_t(INT16_MAX+1));
+    Tag floatTag(float(3.14));
+    Tag stringTag(string("foo"));
+    Tag arrayTag(vector<int16_t>({1, 2, 3}));
+
+    // allowed
+    EXPECT_NO_THROW(
+    {
+        zero.ToInt16();
+        min.ToInt16();
+        normal.ToInt16();
+        max.ToInt16();
+    });
+
+    // not allowed
+    EXPECT_THROW(underflow.ToInt16(), std::exception);
+    EXPECT_THROW(overflow.ToInt16(), std::exception);
+    EXPECT_THROW(floatTag.ToInt16(), std::exception);
+    EXPECT_THROW(stringTag.ToInt16(), std::exception);
+    EXPECT_THROW(arrayTag.ToInt16(), std::exception);
+}
+
+TEST(TagTest, ConvertToUInt16)
+{
+    Tag zero(int32_t(0));
+    Tag neg(int32_t(-1));
+    Tag normal(int32_t(42));
+    Tag max(int32_t(UINT16_MAX));
+    Tag overflow(int32_t(UINT16_MAX+1));
+    Tag floatTag(float(3.14));
+    Tag stringTag(string("foo"));
+    Tag arrayTag(vector<uint16_t>({1, 2, 3}));
+
+    // allowed
+    EXPECT_NO_THROW(
+    {
+        zero.ToUInt16();
+        normal.ToUInt16();
+        max.ToUInt16();
+    });
+
+    // not allowed
+    EXPECT_THROW(neg.ToUInt16(), std::exception);
+    EXPECT_THROW(overflow.ToUInt16(), std::exception);
+    EXPECT_THROW(floatTag.ToUInt16(), std::exception);
+    EXPECT_THROW(stringTag.ToUInt16(), std::exception);
+    EXPECT_THROW(arrayTag.ToUInt16(), std::exception);
+}
+
+TEST(TagTest, ConvertToInt32)
+{
+    Tag zero(int32_t(0));
+    Tag min(int32_t(INT32_MIN));
+    Tag normal(int32_t(42));
+    Tag max(int32_t(INT32_MAX));
+    Tag floatTag(float(3.14));
+    Tag stringTag(string("foo"));
+    Tag arrayTag(vector<int32_t>({1, 2, 3}));
+
+    // no 64-bit ctors - will not compile
+    //
+    // Tag underflow(int64_t(INT32_MIN-1));
+    // Tag overflow(int64_t(INT32_MAX+1));
+
+    // allowed
+    EXPECT_NO_THROW(
+    {
+        zero.ToInt32();
+        min.ToInt32();
+        normal.ToInt32();
+        max.ToInt32();
+    });
+
+    // not allowed
+    EXPECT_THROW(floatTag.ToInt32(), std::exception);
+    EXPECT_THROW(stringTag.ToInt32(), std::exception);
+    EXPECT_THROW(arrayTag.ToInt32(), std::exception);
+}
+
+TEST(TagTest, ConvertToUInt32)
+{
+    Tag zero(int32_t(0));
+    Tag neg(int32_t(-1));
+    Tag normal(int32_t(42));
+    Tag max(uint32_t(UINT32_MAX));
+    Tag floatTag(float(3.14));
+    Tag stringTag(string("foo"));
+    Tag arrayTag(vector<uint32_t>({1, 2, 3}));
+
+    // no 64-bit ctors - will not compile
+    //
+    // Tag overflow(int64_t(UINT32_MAX+1));
+
+    // allowed
+    EXPECT_NO_THROW(
+    {
+        zero.ToUInt32();
+        normal.ToUInt32();
+        max.ToUInt32();
+    });
+
+    // not allowed
+    EXPECT_THROW(neg.ToUInt32(), std::exception);
+    EXPECT_THROW(floatTag.ToUInt32(), std::exception);
+    EXPECT_THROW(stringTag.ToUInt32(), std::exception);
+    EXPECT_THROW(arrayTag.ToUInt32(), std::exception);
+}
+
+TEST(TagCollectionTest, DefaultConstruction)
+{
+    TagCollection tags;
+    EXPECT_TRUE(tags.empty());
+    EXPECT_FALSE(tags.Contains("XY"));
+}
+
+TEST(TagCollectionTest, AddSimpleTags)
+{
+    const int32_t intValue = -42;
+    const string strValue = "foo";
+    const string hexStrValue = "1abc75";
+
+    TagCollection tags;
+    tags["ST"] = strValue;
+    tags["XY"] = intValue;
+    tags["HX"] = hexStrValue;
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+
+    EXPECT_EQ(3, tags.size());
+    EXPECT_TRUE(tags.Contains("XY"));
+    EXPECT_TRUE(tags.Contains("ST"));
+    EXPECT_TRUE(tags.Contains("HX"));
+    EXPECT_FALSE(tags.Contains("ZZ"));
+
+    EXPECT_TRUE( tags["XY"].ToInt32() == intValue );
+    EXPECT_TRUE( tags["ST"].ToString() == strValue );
+    EXPECT_TRUE( tags["HX"].ToString() == hexStrValue );
+    EXPECT_TRUE( tags["HX"].HasModifier(TagModifier::HEX_STRING) );
+}
+
+TEST(SamTagCodecTest, DecodeTest)
+{
+    string tagString;
+    tagString.append("HX:H:1abc75");
+    tagString.append("\t");
+    tagString.append("ST:Z:foo");
+    tagString.append("\t");
+    tagString.append("VC:B:i,42,-100,37,2048");
+    tagString.append("\t");
+    tagString.append("XY:i:-42");
+
+    TagCollection expected;
+    expected["ST"] = string("foo");
+    expected["XY"] = int32_t(-42);
+    expected["HX"] = string("1abc75");
+    expected["HX"].Modifier(TagModifier::HEX_STRING);
+    expected["VC"] = vector<int32_t>( { 42, -100, 37, 2048 } );
+
+    TagCollection tags = SamTagCodec::Decode(tagString);
+
+    EXPECT_TRUE(tags.Contains("ST"));
+    EXPECT_TRUE(tags.Contains("HX"));
+    EXPECT_TRUE(tags.Contains("XY"));
+    EXPECT_TRUE(tags.Contains("VC"));
+
+    EXPECT_EQ(string("foo"), tags["ST"].ToString());
+    EXPECT_TRUE(tags["HX"].HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(string("1abc75"), tags["HX"].ToString());
+    EXPECT_EQ((int8_t)-42, tags["XY"].ToInt8());
+    EXPECT_EQ(vector<int32_t>( { 42, -100, 37, 2048 } ), tags["VC"].ToInt32Array());
+}
+
+TEST(SamTagCodecTest, EncodeTest)
+{
+    TagCollection tags;
+    tags["ST"] = string("foo");
+    tags["XY"] = int32_t(-42);
+    tags["HX"] = string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["VC"] = vector<int32_t>( { 42, -100, 37, 2048 } );
+
+    // "HX:H:1abc75\tST:Z:foo\0\tVC:B:i,42,-100,37,2048\tXY:i:-42"
+    string expected;
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("ST:Z:foo");
+    expected.append("\t");
+    expected.append("VC:B:i,42,-100,37,2048");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const string sam = SamTagCodec::Encode(tags);
+    EXPECT_EQ(expected, sam);
+}
+
+TEST(BamTagCodecTest, DecodeTest)
+{
+    vector<uint8_t> data;
+    data.push_back(uint8_t('H'));
+    data.push_back(uint8_t('X'));
+    data.push_back(uint8_t('H'));
+    data.push_back(uint8_t('1'));
+    data.push_back(uint8_t('a'));
+    data.push_back(uint8_t('b'));
+    data.push_back(uint8_t('c'));
+    data.push_back(uint8_t('7'));
+    data.push_back(uint8_t('5'));
+    data.push_back(uint8_t(0));
+
+    data.push_back(uint8_t('X'));
+    data.push_back(uint8_t('Y'));
+    data.push_back(uint8_t('i'));
+    const int32_t x = -42;
+    char valueBytes[sizeof x];
+    std::copy(static_cast<const char*>(static_cast<const void*>(&x)),
+              static_cast<const char*>(static_cast<const void*>(&x)) + sizeof x,
+              valueBytes);
+    data.push_back(valueBytes[0]);
+    data.push_back(valueBytes[1]);
+    data.push_back(valueBytes[2]);
+    data.push_back(valueBytes[3]);
+
+    data.push_back('C');
+    data.push_back('A');
+    data.push_back('B');
+    data.push_back('C');
+    const uint32_t numChars = 3;
+    char numCharsValueBytes[sizeof numChars];
+    std::copy(static_cast<const char*>(static_cast<const void*>(&numChars)),
+              static_cast<const char*>(static_cast<const void*>(&numChars)) + sizeof numChars,
+              numCharsValueBytes);
+    data.push_back(numCharsValueBytes[0]);
+    data.push_back(numCharsValueBytes[1]);
+    data.push_back(numCharsValueBytes[2]);
+    data.push_back(numCharsValueBytes[3]);
+
+    const vector<uint8_t> charArray = vector<uint8_t>({34, 5, 125});
+    data.push_back(charArray.at(0));
+    data.push_back(charArray.at(1));
+    data.push_back(charArray.at(2));
+
+    TagCollection tags = BamTagCodec::Decode(data);
+
+    EXPECT_TRUE(tags["HX"].HasModifier(TagModifier::HEX_STRING));
+    EXPECT_EQ(string("1abc75"), tags["HX"].ToString());
+    EXPECT_EQ(x, tags["XY"].ToInt32());
+    EXPECT_EQ(charArray, tags["CA"].ToUInt8Array());
+
+    // sanity check - convert tags back to SAM
+    string expected;
+    expected.append("CA:B:C,34,5,125");
+    expected.append("\t");
+    expected.append("HX:H:1abc75");
+    expected.append("\t");
+    expected.append("XY:i:-42");
+
+    const string sam = SamTagCodec::Encode(tags);
+    EXPECT_EQ(expected, sam);
+}
+
+TEST(BamTagCodecTest, EncodeTest)
+{
+    vector<uint8_t> expected;
+
+    expected.push_back('C');
+    expected.push_back('A');
+    expected.push_back('B');
+    expected.push_back('C');
+    const uint32_t numChars = 3;
+    char numCharsValueBytes[sizeof numChars];
+    std::copy(static_cast<const char*>(static_cast<const void*>(&numChars)),
+              static_cast<const char*>(static_cast<const void*>(&numChars)) + sizeof numChars,
+              numCharsValueBytes);
+    expected.push_back(numCharsValueBytes[0]);
+    expected.push_back(numCharsValueBytes[1]);
+    expected.push_back(numCharsValueBytes[2]);
+    expected.push_back(numCharsValueBytes[3]);
+
+    const vector<uint8_t> charArray = vector<uint8_t>({34, 5, 125});
+    expected.push_back(charArray.at(0));
+    expected.push_back(charArray.at(1));
+    expected.push_back(charArray.at(2));
+
+    expected.push_back(uint8_t('H'));
+    expected.push_back(uint8_t('X'));
+    expected.push_back(uint8_t('H'));
+    expected.push_back(uint8_t('1'));
+    expected.push_back(uint8_t('a'));
+    expected.push_back(uint8_t('b'));
+    expected.push_back(uint8_t('c'));
+    expected.push_back(uint8_t('7'));
+    expected.push_back(uint8_t('5'));
+    expected.push_back(uint8_t(0));
+
+    expected.push_back(uint8_t('X'));
+    expected.push_back(uint8_t('Y'));
+    expected.push_back(uint8_t('i'));
+    const int32_t x = -42;
+    char valueBytes[sizeof x];
+    std::copy(static_cast<const char*>(static_cast<const void*>(&x)),
+              static_cast<const char*>(static_cast<const void*>(&x)) + sizeof x,
+              valueBytes);
+    expected.push_back(valueBytes[0]);
+    expected.push_back(valueBytes[1]);
+    expected.push_back(valueBytes[2]);
+    expected.push_back(valueBytes[3]);
+
+    TagCollection tags;
+    tags["HX"] = string("1abc75");
+    tags["HX"].Modifier(TagModifier::HEX_STRING);
+    tags["CA"] = charArray;
+    tags["XY"] = x;
+
+    const vector<uint8_t>& data = BamTagCodec::Encode(tags);
+    EXPECT_EQ(expected, data);
+}
+
diff --git a/tests/src/test_TimeUtils.cpp b/tests/src/test_TimeUtils.cpp
new file mode 100644
index 0000000..7ab9fa5
--- /dev/null
+++ b/tests/src/test_TimeUtils.cpp
@@ -0,0 +1,59 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include <gtest/gtest.h>
+#include <pbbam/../../src/TimeUtils.h>
+
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace PacBio::BAM::internal;
+using namespace std;
+
+TEST(TimeUtilsTest, ToIso8601)
+{
+    const time_t rawTime = 436428750L;
+    const auto timestamp = std::chrono::system_clock::from_time_t(rawTime);
+
+    // can't hardcode expected (since we rely on localtime())
+    const std::string& expected = "1983-10-31T06:12:30Z";
+    const std::string& actual = internal::ToIso8601(timestamp);
+    EXPECT_EQ(expected, actual);
+}
diff --git a/tests/src/test_UnmappedReadsQuery.cpp b/tests/src/test_UnmappedReadsQuery.cpp
new file mode 100644
index 0000000..cf5f46a
--- /dev/null
+++ b/tests/src/test_UnmappedReadsQuery.cpp
@@ -0,0 +1,117 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+//#ifdef PBBAM_TESTING
+//#define private public
+//#endif
+
+//#include "TestData.h"
+//#include <gtest/gtest.h>
+//#include <pbbam/EntireFileQuery.h>
+
+//#include <pbbam/UnmappedReadsQuery.h>
+//#include <string>
+//using namespace PacBio;
+//using namespace PacBio::BAM;
+//using namespace std;
+
+//const string inputBamFn1 = tests::Data_Dir + "/unmap1.bam";
+//const string inputBamFn2 = tests::Data_Dir + "/unmap2.bam";
+
+//TEST(UnmappedReadsQueryTest, UnmappedOnlyFile)
+//{
+//    // open input BAM file
+//    BamFile bamFile(inputBamFn1);
+//    EXPECT_TRUE(bamFile);
+
+//    // check all records, and save unmapped count
+//    int count = 0;
+//    int unmappedExpected = 0;
+//    EntireFileQuery entireFile(bamFile);
+//    EXPECT_TRUE(entireFile);
+//    for ( const BamRecord& record : entireFile ) {
+//        ++count;
+//        if (!record.IsMapped())
+//            ++unmappedExpected;
+//    }
+//    EXPECT_EQ(10, count);
+//    EXPECT_EQ(10, unmappedExpected);
+
+//    // query unmapped records only
+//    int unmappedObserved = 0;
+//    UnmappedReadsQuery unmappedReads(bamFile);
+//    EXPECT_TRUE(unmappedReads);
+//    for ( const BamRecord& record : unmappedReads ) {
+//        EXPECT_FALSE(record.IsMapped());
+//        ++unmappedObserved;
+//    }
+//    EXPECT_EQ(unmappedExpected, unmappedObserved);
+//}
+
+//TEST(UnmappedReadsQueryTest, MixedFile)
+//{
+//    // open input BAM file
+//    BamFile bamFile(inputBamFn2);
+//    EXPECT_TRUE(bamFile);
+
+//    // check all records, and save unmapped count
+//    int count = 0;
+//    int unmappedExpected = 0;
+//    EntireFileQuery entireFile(bamFile);
+//    EXPECT_TRUE(entireFile);
+//    for ( const BamRecord& record : entireFile ) {
+//        ++count;
+//        if (!record.IsMapped())
+//            ++unmappedExpected;
+//    }
+//    EXPECT_EQ(19, count);
+//    EXPECT_EQ(9, unmappedExpected);
+
+//    // query unmapped records only
+//    int unmappedObserved = 0;
+//    UnmappedReadsQuery unmappedReads(bamFile);
+//    EXPECT_TRUE(unmappedReads);
+//    for ( const BamRecord& record : unmappedReads ) {
+//        EXPECT_FALSE(record.IsMapped());
+//        ++unmappedObserved;
+//    }
+//    EXPECT_EQ(unmappedExpected, unmappedObserved);
+//}
+
+// TODO: handle no index case
+
+// TODO: additional special cases as needed
diff --git a/tests/src/test_ZmwQuery.cpp b/tests/src/test_ZmwQuery.cpp
new file mode 100644
index 0000000..287a4eb
--- /dev/null
+++ b/tests/src/test_ZmwQuery.cpp
@@ -0,0 +1,67 @@
+// Copyright (c) 2014-2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifdef PBBAM_TESTING
+#define private public
+#endif
+
+#include "TestData.h"
+#include <gtest/gtest.h>
+#include <pbbam/ZmwQuery.h>
+#include <string>
+using namespace PacBio;
+using namespace PacBio::BAM;
+using namespace std;
+
+//TEST(EntireFileQueryTest, CountRecords)
+//{
+//    EXPECT_NO_THROW(
+//    {
+//        // open input BAM file
+//        BamFile bamFile(inputBamFn);
+
+//        // count records
+//        int count = 0;
+//        EntireFileQuery entireFile(bamFile);
+//        for (const BamRecord& record : entireFile) {
+//            (void)record;
+//            ++count;
+//        }
+
+//        EXPECT_EQ(3307, count);
+//    });
+//}
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
new file mode 100644
index 0000000..db63408
--- /dev/null
+++ b/tools/CMakeLists.txt
@@ -0,0 +1,3 @@
+if(PacBioBAM_build_pbindex)
+    add_subdirectory(pbindex)
+endif()
diff --git a/tools/pbindex/CMakeLists.txt b/tools/pbindex/CMakeLists.txt
new file mode 100644
index 0000000..89572d0
--- /dev/null
+++ b/tools/pbindex/CMakeLists.txt
@@ -0,0 +1,27 @@
+
+# create version header
+set(PbIndex_VERSION ${PacBioBAM_VERSION})
+configure_file(
+    ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndexVersion.h.in
+    ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndexVersion.h
+)
+
+#pbindex sources
+set(PBINDEX_SOURCES
+    ${PacBioBAM_RootDir}/tools/pbindex/src/main.cpp
+    ${PacBioBAM_RootDir}/tools/pbindex/src/OptionParser.h
+    ${PacBioBAM_RootDir}/tools/pbindex/src/OptionParser.cpp
+    ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndex.h
+    ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndex.cpp
+    ${PacBioBAM_RootDir}/tools/pbindex/src/PbIndexVersion.h
+)
+
+# build pbindex executable
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PacBioBAM_CXX_FLAGS}")
+include_directories(${PacBioBAM_RootDir}/tools/pbindex/src ${PacBioBAM_INCLUDE_DIRS})
+add_executable(pbindex ${PBINDEX_SOURCES})
+set_target_properties(pbindex PROPERTIES
+    RUNTIME_OUTPUT_DIRECTORY ${PacBioBAM_BinDir}
+)
+target_link_libraries(pbindex pbbam)
+
diff --git a/tools/pbindex/src/OptionParser.cpp b/tools/pbindex/src/OptionParser.cpp
new file mode 100644
index 0000000..fc73176
--- /dev/null
+++ b/tools/pbindex/src/OptionParser.cpp
@@ -0,0 +1,562 @@
+/**
+ * Copyright (C) 2010 Johannes Weißl <jargon at molb.org>
+ * License: your favourite BSD-style license
+ *
+ * See OptionParser.h for help.
+ */
+
+#include "OptionParser.h"
+
+#include <cstdlib>
+#include <algorithm>
+#include <complex>
+#include <ciso646>
+
+#if defined(ENABLE_NLS) && ENABLE_NLS
+# include <libintl.h>
+# define _(s) gettext(s)
+#else
+# define _(s) ((const char *) (s))
+#endif
+
+using namespace std;
+
+namespace optparse {
+
+////////// auxiliary (string) functions { //////////
+class str_wrap {
+public:
+  str_wrap(const string& l, const string& r) : lwrap(l), rwrap(r) {}
+  str_wrap(const string& w) : lwrap(w), rwrap(w) {}
+  string operator() (const string& s) { return lwrap + s + rwrap; }
+  const string lwrap, rwrap;
+};
+template<typename InputIterator, typename UnaryOperator>
+static string str_join_trans(const string& sep, InputIterator begin, InputIterator end, UnaryOperator op) {
+  string buf;
+  for (InputIterator it = begin; it != end; ++it) {
+    if (it != begin)
+      buf += sep;
+    buf += op(*it);
+  }
+  return buf;
+}
+template<class InputIterator>
+static string str_join(const string& sep, InputIterator begin, InputIterator end) {
+  return str_join_trans(sep, begin, end, str_wrap(""));
+}
+static string& str_replace(string& s, const string& patt, const string& repl) {
+  size_t pos = 0, n = patt.length();
+  while (true) {
+    pos = s.find(patt, pos);
+    if (pos == string::npos)
+      break;
+    s.replace(pos, n, repl);
+    pos += repl.size();
+  }
+  return s;
+}
+static string str_replace(const string& s, const string& patt, const string& repl) {
+  string tmp = s;
+  str_replace(tmp, patt, repl);
+  return tmp;
+}
+static string str_format(const string& s, size_t pre, size_t len, bool indent_first = true) {
+  stringstream ss;
+  string p;
+  if (indent_first)
+    p = string(pre, ' ');
+
+  size_t pos = 0, linestart = 0;
+  size_t line = 0;
+  while (true) {
+    bool wrap = false;
+
+    size_t new_pos = s.find_first_of(" \n\t", pos);
+    if (new_pos == string::npos)
+      break;
+    if (s[new_pos] == '\n') {
+      pos = new_pos + 1;
+      wrap = true;
+    }
+    if (line == 1)
+      p = string(pre, ' ');
+    if (wrap || new_pos + pre > linestart + len) {
+      ss << p << s.substr(linestart, pos - linestart - 1) << endl;
+      linestart = pos;
+      line++;
+    }
+    pos = new_pos + 1;
+  }
+  ss << p << s.substr(linestart) << endl;
+  return ss.str();
+}
+static string str_inc(const string& s) {
+  stringstream ss;
+  string v = (s != "") ? s : "0";
+  long i;
+  istringstream(v) >> i;
+  ss << i+1;
+  return ss.str();
+}
+static unsigned int cols() {
+  unsigned int n = 80;
+#ifndef _WIN32
+  const char *s = getenv("COLUMNS");
+  if (s)
+    istringstream(s) >> n;
+#endif
+  return n;
+}
+static string basename(const string& s) {
+  string b = s;
+  size_t i = b.find_last_not_of('/');
+  if (i == string::npos) {
+    if (b[0] == '/')
+      b.erase(1);
+    return b;
+  }
+  b.erase(i+1, b.length()-i-1);
+  i = b.find_last_of("/");
+  if (i != string::npos)
+    b.erase(0, i+1);
+  return b;
+}
+////////// } auxiliary (string) functions //////////
+
+
+////////// class OptionParser { //////////
+OptionParser::OptionParser() :
+  _usage(_("%prog [options]")),
+  _add_help_option(true),
+  _add_version_option(true),
+  _interspersed_args(true) {}
+
+Option& OptionParser::add_option(const string& opt) {
+  const string tmp[1] = { opt };
+  return add_option(vector<string>(&tmp[0], &tmp[1]));
+}
+Option& OptionParser::add_option(const string& opt1, const string& opt2) {
+  const string tmp[2] = { opt1, opt2 };
+  return add_option(vector<string>(&tmp[0], &tmp[2]));
+}
+Option& OptionParser::add_option(const string& opt1, const string& opt2, const string& opt3) {
+  const string tmp[3] = { opt1, opt2, opt3 };
+  return add_option(vector<string>(&tmp[0], &tmp[3]));
+}
+Option& OptionParser::add_option(const vector<string>& v) {
+  _opts.resize(_opts.size()+1);
+  Option& option = _opts.back();
+  string dest_fallback;
+  for (vector<string>::const_iterator it = v.begin(); it != v.end(); ++it) {
+    if (it->substr(0,2) == "--") {
+      const string s = it->substr(2);
+      if (option.dest() == "")
+        option.dest(str_replace(s, "-", "_"));
+      option._long_opts.insert(s);
+      _optmap_l[s] = &option;
+    } else if ( it->empty() ) {
+       continue;
+    } else {
+      const string s = it->substr(1,1);
+      if (dest_fallback == "")
+        dest_fallback = s;
+      option._short_opts.insert(s);
+      _optmap_s[s] = &option;
+    }
+  }
+  if (option.dest() == "")
+    option.dest(dest_fallback);
+  return option;
+}
+
+OptionParser& OptionParser::add_option_group(const OptionGroup& group) {
+  for (list<Option>::const_iterator oit = group._opts.begin(); oit != group._opts.end(); ++oit) {
+    const Option& option = *oit;
+    for (set<string>::const_iterator it = option._short_opts.begin(); it != option._short_opts.end(); ++it)
+      _optmap_s[*it] = &option;
+    for (set<string>::const_iterator it = option._long_opts.begin(); it != option._long_opts.end(); ++it)
+      _optmap_l[*it] = &option;
+  }
+  _groups.push_back(&group);
+  return *this;
+}
+
+const Option& OptionParser::lookup_short_opt(const string& opt) const {
+  optMap::const_iterator it = _optmap_s.find(opt);
+  if (it == _optmap_s.end())
+    error(_("no such option") + string(": -") + opt);
+  return *it->second;
+}
+
+void OptionParser::handle_short_opt(const string& opt, const string& arg) {
+
+  _remaining.pop_front();
+  string value;
+
+  const Option& option = lookup_short_opt(opt);
+  if (option._nargs == 1) {
+    value = arg.substr(2);
+    if (value == "") {
+      if (_remaining.empty())
+        error("-" + opt + " " + _("option requires an argument"));
+      value = _remaining.front();
+      _remaining.pop_front();
+    }
+  } else {
+    if (arg.length() > 2)
+      _remaining.push_front(string("-") + arg.substr(2));
+  }
+
+  process_opt(option, string("-") + opt, value);
+}
+
+const Option& OptionParser::lookup_long_opt(const string& opt) const {
+
+  list<string> matching;
+  for (optMap::const_iterator it = _optmap_l.begin(); it != _optmap_l.end(); ++it) {
+    if (it->first.compare(0, opt.length(), opt) == 0)
+      matching.push_back(it->first);
+  }
+  if (matching.size() > 1) {
+    string x = str_join(", ", matching.begin(), matching.end());
+    error(_("ambiguous option") + string(": --") + opt + " (" + x + "?)");
+  }
+  if (matching.size() == 0)
+    error(_("no such option") + string(": --") + opt);
+
+  return *_optmap_l.find(matching.front())->second;
+}
+
+void OptionParser::handle_long_opt(const string& optstr) {
+
+  _remaining.pop_front();
+  string opt, value;
+
+  size_t delim = optstr.find("=");
+  if (delim != string::npos) {
+    opt = optstr.substr(0, delim);
+    value = optstr.substr(delim+1);
+  } else
+    opt = optstr;
+
+  const Option& option = lookup_long_opt(opt);
+  if (option._nargs == 1 and delim == string::npos) {
+    if (not _remaining.empty()) {
+      value = _remaining.front();
+      _remaining.pop_front();
+    }
+  }
+
+  if (option._nargs == 1 and value == "")
+    error("--" + opt + " " + _("option requires an argument"));
+
+  process_opt(option, string("--") + opt, value);
+}
+
+Values& OptionParser::parse_args(const int argc, char const* const* const argv) {
+  if (prog() == "")
+    prog(basename(argv[0]));
+  return parse_args(&argv[1], &argv[argc]);
+}
+Values& OptionParser::parse_args(const vector<string>& v) {
+
+  _remaining.assign(v.begin(), v.end());
+
+  if (add_version_option() and version() != "") {
+    add_option("--version") .action("version") .help(_("show program's version number and exit"));
+    _opts.splice(_opts.begin(), _opts, --(_opts.end()));
+  }
+  if (add_help_option()) {
+    add_option("-h", "--help") .action("help") .help(_("show this help message and exit"));
+    _opts.splice(_opts.begin(), _opts, --(_opts.end()));
+  }
+
+  while (not _remaining.empty()) {
+    const string arg = _remaining.front();
+
+    if (arg == "--") {
+      _remaining.pop_front();
+      break;
+    }
+
+    if (arg.substr(0,2) == "--") {
+      handle_long_opt(arg.substr(2));
+    } else if (arg.substr(0,1) == "-" and arg.length() > 1) {
+      handle_short_opt(arg.substr(1,1), arg);
+    } else {
+      _remaining.pop_front();
+      _leftover.push_back(arg);
+      if (not interspersed_args())
+        break;
+    }
+  }
+  while (not _remaining.empty()) {
+    const string arg = _remaining.front();
+    _remaining.pop_front();
+    _leftover.push_back(arg);
+  }
+
+  for (strMap::const_iterator it = _defaults.begin(); it != _defaults.end(); ++it) {
+    if (not _values.is_set(it->first))
+      _values[it->first] = it->second;
+  }
+
+  for (list<Option>::const_iterator it = _opts.begin(); it != _opts.end(); ++it) {
+    if (it->get_default() != "" and not _values.is_set(it->dest()))
+        _values[it->dest()] = it->get_default();
+  }
+
+  return _values;
+}
+
+void OptionParser::process_opt(const Option& o, const string& opt, const string& value) {
+  if (o.action() == "store") {
+    string err = o.check_type(opt, value);
+    if (err != "")
+      error(err);
+    _values[o.dest()] = value;
+    _values.is_set_by_user(o.dest(), true);
+  }
+  else if (o.action() == "store_const") {
+    _values[o.dest()] = o.get_const();
+    _values.is_set_by_user(o.dest(), true);
+  }
+  else if (o.action() == "store_true") {
+    _values[o.dest()] = "1";
+    _values.is_set_by_user(o.dest(), true);
+  }
+  else if (o.action() == "store_false") {
+    _values[o.dest()] = "0";
+    _values.is_set_by_user(o.dest(), true);
+  }
+  else if (o.action() == "append") {
+    string err = o.check_type(opt, value);
+    if (err != "")
+      error(err);
+    _values[o.dest()] = value;
+    _values.all(o.dest()).push_back(value);
+    _values.is_set_by_user(o.dest(), true);
+  }
+  else if (o.action() == "append_const") {
+    _values[o.dest()] = o.get_const();
+    _values.all(o.dest()).push_back(o.get_const());
+    _values.is_set_by_user(o.dest(), true);
+  }
+  else if (o.action() == "count") {
+    _values[o.dest()] = str_inc(_values[o.dest()]);
+    _values.is_set_by_user(o.dest(), true);
+  }
+  else if (o.action() == "help") {
+    print_help();
+    std::exit(0);
+  }
+  else if (o.action() == "version") {
+    print_version();
+    std::exit(0);
+  }
+  else if (o.action() == "callback" && o.callback()) {
+    (*o.callback())(o, opt, value, *this);
+  }
+}
+
+string OptionParser::format_option_help(unsigned int indent /* = 2 */) const {
+  stringstream ss;
+
+  if (_opts.empty())
+    return ss.str();
+
+  for (list<Option>::const_iterator it = _opts.begin(); it != _opts.end(); ++it) {
+    if (it->help() != SUPPRESS_HELP)
+      ss << it->format_help(indent);
+  }
+
+  return ss.str();
+}
+
+string OptionParser::format_help() const {
+  stringstream ss;
+
+  if (usage() != SUPPRESS_USAGE)
+    ss << get_usage() << endl;
+
+  if (description() != "")
+    ss << str_format(description(), 0, cols()) << endl;
+
+  ss << _("Options") << ":" << endl;
+  ss << format_option_help();
+
+  for (list<OptionGroup const*>::const_iterator it = _groups.begin(); it != _groups.end(); ++it) {
+    const OptionGroup& group = **it;
+    ss << endl << "  " << group.title() << ":" << endl;
+    if (group.group_description() != "")
+      ss << str_format(group.group_description(), 4, cols()) << endl;
+    ss << group.format_option_help(4);
+  }
+
+  if (epilog() != "")
+    ss << endl << str_format(epilog(), 0, cols());
+
+  return ss.str();
+}
+void OptionParser::print_help() const {
+  cout << format_help();
+}
+
+void OptionParser::set_usage(const string& u) {
+  string lower = u;
+  transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
+  if (lower.compare(0, 7, "usage: ") == 0)
+    _usage = u.substr(7);
+  else
+    _usage = u;
+}
+string OptionParser::format_usage(const string& u) const {
+  stringstream ss;
+  ss << _("Usage") << ": " << u << endl;
+  return ss.str();
+}
+string OptionParser::get_usage() const {
+  if (usage() == SUPPRESS_USAGE)
+    return string("");
+  return format_usage(str_replace(usage(), "%prog", prog()));
+}
+void OptionParser::print_usage(ostream& out) const {
+  string u = get_usage();
+  if (u != "")
+    out << u << endl;
+}
+void OptionParser::print_usage() const {
+  print_usage(cout);
+}
+
+string OptionParser::get_version() const {
+  return str_replace(_version, "%prog", prog());
+}
+void OptionParser::print_version(ostream& out) const {
+  out << get_version() << endl;
+}
+void OptionParser::print_version() const {
+  print_version(cout);
+}
+
+void OptionParser::exit() const {
+  std::exit(2);
+}
+void OptionParser::error(const string& msg) const {
+  print_usage(cerr);
+  cerr << prog() << ": " << _("error") << ": " << msg << endl;
+  exit();
+}
+////////// } class OptionParser //////////
+
+////////// class Values { //////////
+const string& Values::operator[] (const string& d) const {
+  strMap::const_iterator it = _map.find(d);
+  static const string empty = "";
+  return (it != _map.end()) ? it->second : empty;
+}
+void Values::is_set_by_user(const string& d, bool yes) {
+  if (yes)
+    _userSet.insert(d);
+  else
+    _userSet.erase(d);
+}
+////////// } class Values //////////
+
+////////// class Option { //////////
+string Option::check_type(const string& opt, const string& val) const {
+  istringstream ss(val);
+  stringstream err;
+
+  if (type() == "int" || type() == "long") {
+    long t;
+    if (not (ss >> t))
+      err << _("option") << " " << opt << ": " << _("invalid integer value") << ": '" << val << "'";
+  }
+  else if (type() == "float" || type() == "double") {
+    double t;
+    if (not (ss >> t))
+      err << _("option") << " " << opt << ": " << _("invalid floating-point value") << ": '" << val << "'";
+  }
+  else if (type() == "choice") {
+    if (find(choices().begin(), choices().end(), val) == choices().end()) {
+      list<string> tmp = choices();
+      transform(tmp.begin(), tmp.end(), tmp.begin(), str_wrap("'"));
+      err << _("option") << " " << opt << ": " << _("invalid choice") << ": '" << val << "'"
+        << " (" << _("choose from") << " " << str_join(", ", tmp.begin(), tmp.end()) << ")";
+    }
+  }
+  else if (type() == "complex") {
+    complex<double> t;
+    if (not (ss >> t))
+      err << _("option") << " " << opt << ": " << _("invalid complex value") << ": '" << val << "'";
+  }
+
+  return err.str();
+}
+
+string Option::format_option_help(unsigned int indent /* = 2 */) const {
+
+  string mvar_short, mvar_long;
+  if (nargs() == 1) {
+    string mvar = metavar();
+    if (mvar == "") {
+      mvar = type();
+      transform(mvar.begin(), mvar.end(), mvar.begin(), ::toupper);
+     }
+    mvar_short = " " + mvar;
+    mvar_long = "=" + mvar;
+  }
+
+  stringstream ss;
+  ss << string(indent, ' ');
+
+  if (not _short_opts.empty()) {
+    ss << str_join_trans(", ", _short_opts.begin(), _short_opts.end(), str_wrap("-", mvar_short));
+    if (not _long_opts.empty())
+      ss << ", ";
+  }
+  if (not _long_opts.empty())
+    ss << str_join_trans(", ", _long_opts.begin(), _long_opts.end(), str_wrap("--", mvar_long));
+
+  if ( _short_opts.empty() && _long_opts.empty() )
+      ss << metavar();
+
+
+  return ss.str();
+}
+
+string Option::format_help(unsigned int indent /* = 2 */) const {
+  stringstream ss;
+  string h = format_option_help(indent);
+  unsigned int width = cols();
+  unsigned int opt_width = min(width*3/10, 36u);
+  bool indent_first = false;
+  ss << h;
+  // if the option list is too long, start a new paragraph
+  if (h.length() >= (opt_width-1)) {
+    ss << endl;
+    indent_first = true;
+  } else {
+    ss << string(opt_width - h.length(), ' ');
+    if (help() == "")
+      ss << endl;
+  }
+  if (help() != "") {
+    string help_str = (get_default() != "") ? str_replace(help(), "%default", get_default()) : help();
+    ss << str_format(help_str, opt_width, width, indent_first);
+  }
+  return ss.str();
+}
+
+Option& Option::action(const string& a) {
+  _action = a;
+  if (a == "store_const" || a == "store_true" || a == "store_false" ||
+      a == "append_const" || a == "count" || a == "help" || a == "version")
+    nargs(0);
+  return *this;
+}
+////////// } class Option //////////
+
+}
diff --git a/tools/pbindex/src/OptionParser.h b/tools/pbindex/src/OptionParser.h
new file mode 100644
index 0000000..3266f0f
--- /dev/null
+++ b/tools/pbindex/src/OptionParser.h
@@ -0,0 +1,305 @@
+/**
+ * Copyright (C) 2010 Johannes Weißl <jargon at molb.org>
+ * License: your favourite BSD-style license
+ *
+ * git clone http://github.com/weisslj/cpp-optparse.git
+ *
+ * This is yet another option parser for C++. It is modelled after the
+ * excellent Python optparse API. Although incomplete, anyone familiar to
+ * optparse should feel at home:
+ * http://docs.python.org/library/optparse.html
+ *
+ * Design decisions:
+ * - elegant and easy usage more important than speed / flexibility
+ * - shortness more important than feature completeness
+ *   * no unicode
+ *   * no checking for user programming errors
+ *
+ * Why not use getopt/getopt_long?
+ * - not C++ / not completely POSIX
+ * - too cumbersome to use, would need lot of additional code
+ *
+ * Why not use Boost.Program_options?
+ * - boost not installed on all target platforms (esp. cluster, HPC, ...)
+ * - too big to include just for option handling:
+ *   322 *.h (44750 lines) + 7 *.cpp (2078 lines)
+ *
+ * Why not use tclap/Opag/Options/CmdLine/Anyoption/Argument_helper/...?
+ * - no reason, writing one is faster than code inspection :-)
+ * - similarity to Python desired for faster learning curve
+ *
+ * Future work:
+ * - nargs > 1?
+ * - comments?
+ *
+ * Python only features:
+ * - conflict handlers
+ * - adding new actions
+ *
+ *
+ * Example:
+ *
+ * using optparse::OptionParser;
+ *
+ * OptionParser parser = OptionParser() .description("just an example");
+ *
+ * parser.add_option("-f", "--file") .dest("filename")
+ *                   .help("write report to FILE") .metavar("FILE");
+ * parser.add_option("-q", "--quiet")
+ *                   .action("store_false") .dest("verbose") .set_default("1")
+ *                   .help("don't print status messages to stdout");
+ * 
+ * optparse::Values options = parser.parse_args(argc, argv);
+ * vector<string> args = parser.args();
+ *
+ * if (options.get("verbose"))
+ *     cout << options["filename"] << endl;
+ *
+ */
+
+#ifndef OPTIONPARSER_H_
+#define OPTIONPARSER_H_
+
+#include <iostream>
+#include <list>
+#include <map>
+#include <set>
+#include <sstream>
+#include <string>
+#include <vector>
+
+namespace optparse {
+
+class OptionParser;
+class OptionGroup;
+class Option;
+class Values;
+class Value;
+class Callback;
+
+typedef std::map<std::string,std::string> strMap;
+typedef std::map<std::string,std::list<std::string> > lstMap;
+typedef std::map<std::string,Option const*> optMap;
+
+const char* const SUPPRESS_HELP = "SUPPRESS" "HELP";
+const char* const SUPPRESS_USAGE = "SUPPRESS" "USAGE";
+
+//! Class for automatic conversion from string -> anytype
+class Value {
+  public:
+    Value() : str(), valid(false) {}
+    Value(const std::string& v) : str(v), valid(true) {}
+    operator const char*() { return str.c_str(); }
+    operator bool() { bool t; return (valid && (std::istringstream(str) >> t)) ? t : false; }
+    operator short() { short t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+    operator unsigned short() { unsigned short t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+    operator int() { int t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+    operator unsigned int() { unsigned int t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+    operator long() { long t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+    operator unsigned long() { unsigned long t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+    operator float() { float t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+    operator double() { double t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+    operator long double() { long double t; return (valid && (std::istringstream(str) >> t)) ? t : 0; }
+ private:
+    const std::string str;
+    bool valid;
+};
+
+class Values {
+  public:
+    Values() : _map() {}
+    const std::string& operator[] (const std::string& d) const;
+    std::string& operator[] (const std::string& d) { return _map[d]; }
+    bool is_set(const std::string& d) const { return _map.find(d) != _map.end(); }
+    bool is_set_by_user(const std::string& d) const { return _userSet.find(d) != _userSet.end(); }
+    void is_set_by_user(const std::string& d, bool yes);
+    Value get(const std::string& d) const { return (is_set(d)) ? Value((*this)[d]) : Value(); }
+
+    typedef std::list<std::string>::iterator iterator;
+    typedef std::list<std::string>::const_iterator const_iterator;
+    std::list<std::string>& all(const std::string& d) { return _appendMap[d]; }
+    const std::list<std::string>& all(const std::string& d) const { return _appendMap.find(d)->second; }
+
+  private:
+    strMap _map;
+    lstMap _appendMap;
+    std::set<std::string> _userSet;
+};
+
+class OptionParser {
+  public:
+    OptionParser();
+    virtual ~OptionParser() {}
+
+    OptionParser& usage(const std::string& u) { set_usage(u); return *this; }
+    OptionParser& version(const std::string& v) { _version = v; return *this; }
+    OptionParser& description(const std::string& d) { _description = d; return *this; }
+    OptionParser& add_help_option(bool h) { _add_help_option = h; return *this; }
+    OptionParser& add_version_option(bool v) { _add_version_option = v; return *this; }
+    OptionParser& prog(const std::string& p) { _prog = p; return *this; }
+    OptionParser& epilog(const std::string& e) { _epilog = e; return *this; }
+    OptionParser& set_defaults(const std::string& dest, const std::string& val) {
+      _defaults[dest] = val; return *this;
+    }
+    OptionParser& enable_interspersed_args() { _interspersed_args = true; return *this; }
+    OptionParser& disable_interspersed_args() { _interspersed_args = false; return *this; }
+    OptionParser& add_option_group(const OptionGroup& group);
+
+    const std::string& usage() const { return _usage; }
+    const std::string& version() const { return _version; }
+    const std::string& description() const { return _description; }
+    bool add_help_option() const { return _add_help_option; }
+    bool add_version_option() const { return _add_version_option; }
+    const std::string& prog() const { return _prog; }
+    const std::string& epilog() const { return _epilog; }
+    bool interspersed_args() const { return _interspersed_args; }
+
+    Option& add_option(const std::string& opt);
+    Option& add_option(const std::string& opt1, const std::string& opt2);
+    Option& add_option(const std::string& opt1, const std::string& opt2, const std::string& opt3);
+    Option& add_option(const std::vector<std::string>& opt);
+
+    Values& parse_args(int argc, char const* const* argv);
+    Values& parse_args(const std::vector<std::string>& args);
+    template<typename InputIterator>
+    Values& parse_args(InputIterator begin, InputIterator end) {
+      return parse_args(std::vector<std::string>(begin, end));
+    }
+
+    const std::list<std::string>& args() const { return _leftover; }
+    std::vector<std::string> args() {
+      return std::vector<std::string>(_leftover.begin(), _leftover.end());
+    }
+
+    std::string format_help() const;
+    std::string format_option_help(unsigned int indent = 2) const;
+    void print_help() const;
+
+    void set_usage(const std::string& u);
+    std::string get_usage() const;
+    void print_usage(std::ostream& out) const;
+    void print_usage() const;
+
+    std::string get_version() const;
+    void print_version(std::ostream& out) const;
+    void print_version() const;
+
+    void error(const std::string& msg) const;
+    void exit() const;
+
+  private:
+    const Option& lookup_short_opt(const std::string& opt) const;
+    const Option& lookup_long_opt(const std::string& opt) const;
+
+    void handle_short_opt(const std::string& opt, const std::string& arg);
+    void handle_long_opt(const std::string& optstr);
+
+    void process_opt(const Option& option, const std::string& opt, const std::string& value);
+
+    std::string format_usage(const std::string& u) const;
+
+    std::string _usage;
+    std::string _version;
+    std::string _description;
+    bool _add_help_option;
+    bool _add_version_option;
+    std::string _prog;
+    std::string _epilog;
+    bool _interspersed_args;
+
+    Values _values;
+
+    std::list<Option> _opts;
+    optMap _optmap_s;
+    optMap _optmap_l;
+    strMap _defaults;
+    std::list<OptionGroup const*> _groups;
+
+    std::list<std::string> _remaining;
+    std::list<std::string> _leftover;
+};
+
+class OptionGroup : public OptionParser {
+  public:
+    OptionGroup(const OptionParser& p, const std::string& t, const std::string& d = "") :
+      _parser(p), _title(t), _group_description(d) {}
+    virtual ~OptionGroup() {}
+
+    OptionGroup& title(const std::string& t) { _title = t; return *this; }
+    OptionGroup& group_description(const std::string& d) { _group_description = d; return *this; }
+    const std::string& title() const { return _title; }
+    const std::string& group_description() const { return _group_description; }
+
+  private:
+    const OptionParser& _parser;
+    std::string _title;
+    std::string _group_description;
+};
+
+class Option {
+  public:
+    Option() : _action("store"), _type("string"), _nargs(1), _callback(0) {}
+    virtual ~Option() {}
+
+    Option& action(const std::string& a);
+    Option& type(const std::string& t) { _type = t; return *this; }
+    Option& dest(const std::string& d) { _dest = d; return *this; }
+    Option& set_default(const std::string& d) { _default = d; return *this; }
+    template<typename T>
+    Option& set_default(T t) { std::ostringstream ss; ss << t; _default = ss.str(); return *this; }
+    Option& nargs(size_t n) { _nargs = n; return *this; }
+    Option& set_const(const std::string& c) { _const = c; return *this; }
+    template<typename InputIterator>
+    Option& choices(InputIterator begin, InputIterator end) {
+      _choices.assign(begin, end); type("choice"); return *this;
+    }
+    template<typename InputEnumerable>
+    Option& choices(InputEnumerable enumerable) {
+      _choices.assign(enumerable.begin(), enumerable.end()); type("choice"); return *this;
+    }
+    Option& help(const std::string& h) { _help = h; return *this; }
+    Option& metavar(const std::string& m) { _metavar = m; return *this; }
+    Option& callback(Callback& c) { _callback = &c; return *this; }
+
+    const std::string& action() const { return _action; }
+    const std::string& type() const { return _type; }
+    const std::string& dest() const { return _dest; }
+    const std::string& get_default() const { return _default; }
+    size_t nargs() const { return _nargs; }
+    const std::string& get_const() const { return _const; }
+    const std::list<std::string>& choices() const { return _choices; }
+    const std::string& help() const { return _help; }
+    const std::string& metavar() const { return _metavar; }
+    Callback* callback() const { return _callback; }
+
+  private:
+    std::string check_type(const std::string& opt, const std::string& val) const;
+    std::string format_option_help(unsigned int indent = 2) const;
+    std::string format_help(unsigned int indent = 2) const;
+
+    std::set<std::string> _short_opts;
+    std::set<std::string> _long_opts;
+
+    std::string _action;
+    std::string _type;
+    std::string _dest;
+    std::string _default;
+    size_t _nargs;
+    std::string _const;
+    std::list<std::string> _choices;
+    std::string _help;
+    std::string _metavar;
+    Callback* _callback;
+
+    friend class OptionParser;
+};
+
+class Callback {
+public:
+  virtual void operator() (const Option& option, const std::string& opt, const std::string& val, const OptionParser& parser) = 0;
+  virtual ~Callback() {}
+};
+
+}
+
+#endif
diff --git a/tools/pbindex/src/PbIndex.cpp b/tools/pbindex/src/PbIndex.cpp
new file mode 100644
index 0000000..ca8a234
--- /dev/null
+++ b/tools/pbindex/src/PbIndex.cpp
@@ -0,0 +1,78 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "PbIndex.h"
+#include <pbbam/BamFile.h>
+#include <pbbam/PbiRawData.h>
+#include <iostream>
+#include <cassert>
+#include <cstdlib>
+using namespace pbindex;
+using namespace std;
+
+Settings::Settings(void)
+    : printPbiContents_(false)
+{ }
+
+int PbIndex::Create(const Settings& settings)
+{
+    try
+    {
+        PacBio::BAM::BamFile bamFile(settings.inputBamFilename_);
+        bamFile.EnsurePacBioIndexExists();
+        return EXIT_SUCCESS;
+    }
+    catch (std::runtime_error& e)
+    {
+        cerr << "pbindex ERROR: " << e.what() << endl;
+        return EXIT_FAILURE;
+    }
+}
+
+//int PbIndex::Print(const Settings& settings)
+//{
+
+//}
+
+int PbIndex::Run(const Settings& settings)
+{
+//    if (settings.printPbiContents_)
+//        return Print(settings);
+//    else
+        return Create(settings);
+}
+
diff --git a/tools/pbindex/src/PbIndex.h b/tools/pbindex/src/PbIndex.h
new file mode 100644
index 0000000..05bdf6d
--- /dev/null
+++ b/tools/pbindex/src/PbIndex.h
@@ -0,0 +1,70 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef PBINDEX_H
+#define PBINDEX_H
+
+#include <string>
+#include <vector>
+
+namespace pbindex {
+
+class Settings
+{
+public:
+    Settings(void);
+
+public:
+
+public:
+    std::string inputBamFilename_;
+    bool printPbiContents_;
+    std::vector<std::string> errors_;
+};
+
+class PbIndex
+{
+public:
+    static int Run(const Settings& settings);
+private:
+    static int Create(const Settings& settings);
+//    static int Print(const Settings& settings);
+};
+
+} // namespace pbindex
+
+#endif // PBINDEX_H
diff --git a/tools/pbindex/src/PbIndexVersion.h.in b/tools/pbindex/src/PbIndexVersion.h.in
new file mode 100644
index 0000000..9faf96d
--- /dev/null
+++ b/tools/pbindex/src/PbIndexVersion.h.in
@@ -0,0 +1,49 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#ifndef PBINDEXVERSION_H
+#define PBINDEXVERSION_H
+
+#include <string>
+
+namespace pbindex {
+
+const std::string Version = std::string("@PbIndex_VERSION@");
+
+} // namespace pbindex
+
+#endif // PBINDEXVERSION_H
diff --git a/tools/pbindex/src/main.cpp b/tools/pbindex/src/main.cpp
new file mode 100644
index 0000000..59065fa
--- /dev/null
+++ b/tools/pbindex/src/main.cpp
@@ -0,0 +1,102 @@
+// Copyright (c) 2015, Pacific Biosciences of California, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted (subject to the limitations in the
+// disclaimer below) provided that the following conditions are met:
+//
+//  * Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//  * 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.
+//
+//  * Neither the name of Pacific Biosciences nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+// GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY PACIFIC
+// BIOSCIENCES AND ITS CONTRIBUTORS "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 PACIFIC BIOSCIENCES OR ITS
+// 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.
+
+// Author: Derek Barnett
+
+#include "OptionParser.h"
+#include "PbIndex.h"
+#include "PbIndexVersion.h"
+#include <cassert>
+#include <iostream>
+using namespace std;
+
+static
+pbindex::Settings fromCommandLine(optparse::OptionParser& parser,
+                                  int argc, char* argv[])
+{
+    const optparse::Values options = parser.parse_args(argc, argv);
+    (void)options;
+
+    pbindex::Settings settings;
+
+    // get input filename
+    const vector<string> positionalArgs = parser.args();
+    const size_t numPositionalArgs = positionalArgs.size();
+    if (numPositionalArgs == 0)
+        settings.errors_.push_back("pbindex requires an input BAM filename");
+    else if (numPositionalArgs == 1)
+        settings.inputBamFilename_ = parser.args().front();
+    else {
+        assert(numPositionalArgs > 1);
+        settings.errors_.push_back("pbindex does not support more than one input file per run");
+    }
+
+    return settings;
+}
+
+int main(int argc, char* argv[])
+{
+    // setup help & options
+    optparse::OptionParser parser;
+    parser.description("pbindex creates a index file that enables random-access to PacBio-specific data in BAM files. "
+                       "Generated index filename will be the same as input BAM plus .pbi suffix."
+                       );
+    parser.prog("pbindex");
+    parser.usage("pbindex <input>");
+    parser.version(pbindex::Version);
+    parser.add_version_option(true);
+    parser.add_help_option(true);
+
+    auto ioGroup = optparse::OptionGroup(parser, "Input/Output");
+    ioGroup.add_option("")
+           .dest("input")
+           .metavar("input")
+           .help("Input BAM file");
+    parser.add_option_group(ioGroup);
+
+    // parse command line for settings
+    const pbindex::Settings settings = fromCommandLine(parser, argc, argv);
+    if (!settings.errors_.empty()) {
+        cerr << endl;
+        for (const auto e : settings.errors_)
+            cerr << "ERROR: " << e << endl;
+        cerr << endl;
+        parser.print_help();
+        return EXIT_FAILURE;
+    }
+
+    // run tool
+    return pbindex::PbIndex::Run(settings);
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/pbbam.git



More information about the debian-med-commit mailing list